blob: 1f88f22f99b58629fc0c7dc5a9391da1b6c60e52 [file] [log] [blame]
Dirk Vogtc9e10ab2016-10-12 13:58:15 +02001from django.contrib.auth.models import User
Dirk Vogtf2a33422016-10-11 17:17:26 +02002from rest_framework.test import APITestCase
3from rest_framework.test import APIClient
Dirk Vogt36635692016-10-17 12:19:10 +02004from rest_framework import status
Dirk Vogtc9e10ab2016-10-12 13:58:15 +02005import datetime
Dirk Vogt36635692016-10-17 12:19:10 +02006import tempfile
Dirk Vogtf130c752016-08-23 14:45:01 +02007
8# Create your tests here.
Dirk Vogtf2a33422016-10-11 17:17:26 +02009
10
11class DeviceTestCase(APITestCase):
12
13 def setUp(self):
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +010014 self.url = "/hiccup/api/v1/devices/register/"
Dirk Vogtf2a33422016-10-11 17:17:26 +020015
16 def test(self):
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +010017 request = self.client.post(self.url, device_register_data)
Dirk Vogtf2a33422016-10-11 17:17:26 +020018 self.assertTrue("token" in request.data)
19 self.assertTrue("uuid" in request.data)
Dirk Vogt36635692016-10-17 12:19:10 +020020 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogtf2a33422016-10-11 17:17:26 +020021
Franz-Xaver Geigerd9943352018-02-27 14:26:41 +010022 def test_create_missing_fields(self):
23 request = self.client.post(self.url)
24 self.assertEqual(request.status_code, status.HTTP_400_BAD_REQUEST)
25
26 def test_create_missing_board_date(self):
27 request = self.client.post(self.url, {
28 "board_date": device_register_data["board_date"]
29 })
30 self.assertEqual(request.status_code, status.HTTP_400_BAD_REQUEST)
31
32 def test_create_missing_chipset(self):
33 request = self.client.post(self.url, {
34 "chipset": device_register_data["chipset"]
35 })
36 self.assertEqual(request.status_code, status.HTTP_400_BAD_REQUEST)
37
38 def test_create_invalid_board_date(self):
39 request = self.client.post(self.url, {
40 "board_date": "not_a_valid_date"
41 })
42 self.assertEqual(request.status_code, status.HTTP_400_BAD_REQUEST)
43
44
Dirk Vogtf2a33422016-10-11 17:17:26 +020045# Create your tests here.
46
Dirk Vogt8e656152017-05-04 23:12:13 +020047device_register_data = {
48 "board_date": str(datetime.datetime(year=2016, month=1, day=1)),
49 "chipset": "chipset"
Dirk Vogtf2a33422016-10-11 17:17:26 +020050
Dirk Vogt8e656152017-05-04 23:12:13 +020051}
Dirk Vogtf2a33422016-10-11 17:17:26 +020052class ListDevicesTestCase(APITestCase):
53
54 def setUp(self):
55 self.password = "test"
56 self.admin = User.objects.create_superuser(
57 'myuser', 'myemail@test.com', self.password)
Dirk Vogt8e656152017-05-04 23:12:13 +020058 self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
59 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtf2a33422016-10-11 17:17:26 +020060 self.uuid_to_retrieve = request.data['uuid']
61 self.token_to_retrieve = request.data['token']
Dirk Vogt8e656152017-05-04 23:12:13 +020062 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtf2a33422016-10-11 17:17:26 +020063 self.uuid_to_delete = request.data['uuid']
64 self.token_to_delete = request.data['token']
65
66 def test_device_list(self):
67 client = APIClient()
68 client.login(username='myuser', password='test')
69 request = client.get("/hiccup/api/v1/devices/", {})
Dirk Vogt8e656152017-05-04 23:12:13 +020070 self.assertTrue(request.data['results'][1]['uuid'] is not '')
71 self.assertTrue(len(request.data['results']) >= 3)
Dirk Vogt36635692016-10-17 12:19:10 +020072 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogtf2a33422016-10-11 17:17:26 +020073 client.logout()
74
75 def test_device_list_unauth(self):
76 client = APIClient()
77 request = client.get("/hiccup/api/v1/devices/", {})
Dirk Vogt36635692016-10-17 12:19:10 +020078 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +020079
80 def test_retrieve_device_auth(self):
81 client = APIClient()
82 client.login(username='myuser', password='test')
83 request = client.get(
84 "/hiccup/api/v1/devices/{}/".format(self.uuid_to_retrieve), {})
Dirk Vogt36635692016-10-17 12:19:10 +020085 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogtf2a33422016-10-11 17:17:26 +020086 self.assertEqual(request.data['uuid'], str(self.uuid_to_retrieve))
87 self.assertEqual(request.data['token'], self.token_to_retrieve)
88 client.logout()
89
90 def test_retrieve_device_unauth(self):
91 client = APIClient()
92 request = client.get(
93 "/hiccup/api/v1/devices/{}/".format(self.uuid_to_retrieve), {})
Dirk Vogt36635692016-10-17 12:19:10 +020094 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +020095
96 def test_delete_device_auth(self):
97 client = APIClient()
98 client.login(username='myuser', password='test')
99 url = "/hiccup/api/v1/devices/{}/".format(self.uuid_to_delete)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200100 request = client.delete(
101 url.format(self.uuid_to_delete), {})
Dirk Vogt36635692016-10-17 12:19:10 +0200102 self.assertEqual(request.status_code, status.HTTP_204_NO_CONTENT)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200103 request = client.delete(
104 url.format(self.uuid_to_delete), {})
Dirk Vogt36635692016-10-17 12:19:10 +0200105 self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200106 client.logout()
107
Dirk Vogtf2a33422016-10-11 17:17:26 +0200108
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200109class HeartbeatListTestCase(APITestCase):
Dirk Vogtf2a33422016-10-11 17:17:26 +0200110
111 def setUp(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200112 self.setup_users()
113 self.data = self.create_dummy_data(self.uuid)
114 self.url = "/hiccup/api/v1/heartbeats/"
Dirk Vogte1784882016-10-13 16:09:38 +0200115 self.url_by_uuid = "/hiccup/api/v1/devices/{}/heartbeats/"
Dirk Vogt67eb1482016-10-13 12:42:56 +0200116
117 def setup_users(self):
Dirk Vogtf2a33422016-10-11 17:17:26 +0200118 self.password = "test"
Dirk Vogt8e656152017-05-04 23:12:13 +0200119 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200120 self.uuid = request.data['uuid']
121 self.token = request.data['token']
Dirk Vogt8e656152017-05-04 23:12:13 +0200122 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200123 self.other_uuid = request.data['uuid']
124 self.other_token = request.data['token']
Dirk Vogt67eb1482016-10-13 12:42:56 +0200125 self.admin = User.objects.create_superuser(
126 'myuser', 'myemail@test.com', self.password)
127 self.admin = APIClient()
128 self.admin.login(username='myuser', password='test')
129 self.user = APIClient()
130 self.other_user = APIClient()
131 self.user.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
132 self.other_user.credentials(HTTP_AUTHORIZATION='Token '
133 + self.other_token)
134 self.noauth_client = APIClient()
Dirk Vogtf2a33422016-10-11 17:17:26 +0200135
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200136 def create_dummy_data(self, uuid="not set"):
137 return {
138 'uuid': uuid,
139 'app_version': 2,
140 'uptime': "2 Hours",
141 'build_fingerprint': "models.CharField(max_length=200)",
Borjan Tchakaloff6f239a62018-02-19 09:05:50 +0100142 'radio_version': 'XXXX.X-FP2-X-XX',
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200143 'date': str(datetime.datetime(year=2016, month=1, day=1))
144 }
145
146 def test_create_no_auth(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200147 request = self.noauth_client.post(self.url, self.data)
Dirk Vogt36635692016-10-17 12:19:10 +0200148 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200149
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200150 def test_create_as_admin(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200151 request = self.admin.post(self.url, self.data)
Dirk Vogt36635692016-10-17 12:19:10 +0200152 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200153 self.assertTrue(request.data['id'] > 0)
Dirk Vogtf2a33422016-10-11 17:17:26 +0200154
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200155 def test_create_as_admin_not_existing_device(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200156 request = self.admin.post(self.url,
157 self.create_dummy_data())
Dirk Vogt36635692016-10-17 12:19:10 +0200158 self.assertEqual(request.status_code, status.HTTP_404_NOT_FOUND)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200159
160 def test_create_as_uuid_owner(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200161 request = self.user.post(self.url,
162 self.create_dummy_data(self.uuid))
Dirk Vogt36635692016-10-17 12:19:10 +0200163 self.assertEqual(request.status_code, status.HTTP_201_CREATED)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200164 self.assertTrue(request.data['id'] == -1)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200165
166 def test_create_as_uuid_not_owner(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200167 request = self.user.post(self.url,
168 self.create_dummy_data(self.other_uuid))
Dirk Vogt36635692016-10-17 12:19:10 +0200169 self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200170
Dirk Vogt67eb1482016-10-13 12:42:56 +0200171 def post_multiple(self, client, data, count=5):
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200172 for i in range(count):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200173 client.post(self.url, data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200174
175 def test_list(self):
176 count = 5
Dirk Vogt67eb1482016-10-13 12:42:56 +0200177 self.post_multiple(self.user, self.data, count)
178 request = self.admin.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200179 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogt8e656152017-05-04 23:12:13 +0200180 self.assertTrue(len(request.data['results']) == count)
Dirk Vogte1784882016-10-13 16:09:38 +0200181
Dirk Vogt36635692016-10-17 12:19:10 +0200182 def test_retrieve_single(self, user=None,
183 expected_result=status.HTTP_200_OK):
Dirk Vogte1784882016-10-13 16:09:38 +0200184 count = 5
185 if user is None:
186 user = self.admin
187 self.post_multiple(self.user, self.data, count)
188 url = "{}1/".format(self.url)
189 request = user.get(url)
190 self.assertEqual(request.status_code, expected_result)
191
192 def test_retrieve_single_noauth(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200193 self.test_retrieve_single(user=self.user,
194 expected_result=status.HTTP_403_FORBIDDEN)
Dirk Vogte1784882016-10-13 16:09:38 +0200195
196 def test_retrieve_single_device_owner(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200197 self.test_retrieve_single(self.noauth_client,
198 status.HTTP_401_UNAUTHORIZED)
Dirk Vogte1784882016-10-13 16:09:38 +0200199
Dirk Vogt36635692016-10-17 12:19:10 +0200200 def test_retrieve_single_by_device(self, user=None,
201 expected_result=status.HTTP_200_OK):
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200202 count = 5
203 if user is None:
204 user = self.admin
205 self.post_multiple(self.user, self.data, count)
206 url = "{}1/".format(self.url_by_uuid.format(self.uuid))
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200207 request = user.get(url)
208 self.assertEqual(request.status_code, expected_result)
209
210 def test_retrieve_single_by_device_noauth(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200211 self.test_retrieve_single_by_device(
212 user=self.user,
213 expected_result=status.HTTP_403_FORBIDDEN)
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200214
215 def test_retrieve_single_by_device_device_owner(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200216 self.test_retrieve_single_by_device(
217 self.noauth_client, status.HTTP_401_UNAUTHORIZED)
Dirk Vogt0d9d5d22016-10-13 16:17:57 +0200218
Dirk Vogte1784882016-10-13 16:09:38 +0200219 def test_list_by_uuid(self):
220 count = 5
221 self.post_multiple(self.user, self.data, count)
222 self.post_multiple(self.admin, self.create_dummy_data(self.other_uuid),
223 count)
224 url = self.url_by_uuid.format(self.uuid)
225 request = self.admin.get(url)
Dirk Vogt36635692016-10-17 12:19:10 +0200226 self.assertEqual(request.status_code, status.HTTP_200_OK)
Dirk Vogt8e656152017-05-04 23:12:13 +0200227 self.assertTrue(len(request.data['results']) == count)
Dirk Vogte1784882016-10-13 16:09:38 +0200228
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200229 def test_list_noauth(self):
230 count = 5
Dirk Vogt67eb1482016-10-13 12:42:56 +0200231 self.post_multiple(self.user, self.data, count)
232 request = self.noauth_client.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200233 self.assertEqual(request.status_code, status.HTTP_401_UNAUTHORIZED)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200234
235 def test_list_device_owner(self):
236 count = 5
Dirk Vogt67eb1482016-10-13 12:42:56 +0200237 self.post_multiple(self.user, self.data, count)
238 request = self.user.get(self.url)
Dirk Vogt36635692016-10-17 12:19:10 +0200239 self.assertEqual(request.status_code, status.HTTP_403_FORBIDDEN)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200240
Borjan Tchakaloff869cf922018-02-19 11:01:16 +0100241 def test_no_radio_version(self):
242 data = self.data.copy()
243 data.pop('radio_version')
244 self.post_multiple(self.user, data, 1)
245 url = self.url_by_uuid.format(self.uuid)
246 request = self.admin.get(url)
247 self.assertEqual(request.status_code, status.HTTP_200_OK)
248 self.assertEqual(len(request.data['results']), 1)
249 self.assertIsNone(request.data['results'][0]['radio_version'])
250
251 def test_radio_version_field(self):
252 self.post_multiple(self.user, self.data, 1)
253 url = self.url_by_uuid.format(self.uuid)
254 request = self.admin.get(url)
255 self.assertEqual(request.status_code, status.HTTP_200_OK)
256 self.assertEqual(len(request.data['results']), 1)
257 self.assertEqual(request.data['results'][0]['radio_version'],
258 self.data['radio_version'])
259
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200260
Dirk Vogt67eb1482016-10-13 12:42:56 +0200261def create_crashreport(uuid="not set"):
262 return {
263 'uuid': uuid,
264 'is_fake_report': 0,
265 'app_version': 2,
266 'uptime': "2 Hours",
267 'build_fingerprint': "models.CharField(max_length=200)",
Borjan Tchakaloff6f239a62018-02-19 09:05:50 +0100268 'radio_version': 'XXXX.X-FP2-X-XX',
Dirk Vogt67eb1482016-10-13 12:42:56 +0200269 'boot_reason': "models.CharField(max_length=200)",
270 'power_on_reason': "models.CharField(max_length=200)",
271 'power_off_reason': "models.CharField(max_length=200)",
272 'date': str(datetime.datetime(year=2016, month=1, day=1))
273 }
274
275
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200276class CrashreportListTestCase(HeartbeatListTestCase):
277
278 def setUp(self):
Dirk Vogt67eb1482016-10-13 12:42:56 +0200279 self.setup_users()
280 self.data = self.create_dummy_data(self.uuid)
281 self.url = "/hiccup/api/v1/crashreports/"
Dirk Vogte1784882016-10-13 16:09:38 +0200282 self.url_by_uuid = "/hiccup/api/v1/devices/{}/crashreports/"
Dirk Vogt67eb1482016-10-13 12:42:56 +0200283
284 def create_dummy_data(self, uuid="not set"):
285 return create_crashreport(uuid)
286
287
288class LogfileUploadTest(APITestCase):
289 def setUp(self):
290 self.setup_users()
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200291 # we need a device
Dirk Vogt67eb1482016-10-13 12:42:56 +0200292 self.user.post("/hiccup/api/v1/crashreports/",
293 create_crashreport(self.uuid))
294 self.user.post("/hiccup/api/v1/crashreports/",
295 create_crashreport(self.uuid))
296 self.user.post("/hiccup/api/v1/crashreports/",
297 create_crashreport(self.other_uuid))
298 self.user.post("/hiccup/api/v1/crashreports/",
299 create_crashreport(self.other_uuid))
300
301 def setup_users(self):
302 self.password = "test"
Dirk Vogt8e656152017-05-04 23:12:13 +0200303 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200304 self.uuid = request.data['uuid']
305 self.token = request.data['token']
Dirk Vogt8e656152017-05-04 23:12:13 +0200306 request = self.client.post("/hiccup/api/v1/devices/register/", device_register_data)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200307 self.other_uuid = request.data['uuid']
308 self.other_token = request.data['token']
Dirk Vogt67eb1482016-10-13 12:42:56 +0200309 self.admin = User.objects.create_superuser(
310 'myuser', 'myemail@test.com', self.password)
Dirk Vogt67eb1482016-10-13 12:42:56 +0200311 self.user = APIClient()
312 self.other_user = APIClient()
313 self.user.credentials(HTTP_AUTHORIZATION='Token ' + self.token)
314 self.other_user.credentials(HTTP_AUTHORIZATION='Token '
315 + self.other_token)
Dirk Vogtc9e10ab2016-10-12 13:58:15 +0200316
Dirk Vogt36635692016-10-17 12:19:10 +0200317 def get_url(self, uuid, report_id, filename):
318 return ("/hiccup/api/v1/devices/{}/crashreports/{}/logfile_put/{}/".
319 format(uuid, report_id, "test.log"))
320
Dirk Vogt67eb1482016-10-13 12:42:56 +0200321 def test_Logfile_upload_as_admin(self):
Dirk Vogt36635692016-10-17 12:19:10 +0200322 self.client.force_authenticate(self.admin)
323 f = tempfile.NamedTemporaryFile('w+', suffix=".log", delete=True)
324 f.write(u"blihblahblub")
325 request = self.client.post(
326 self.get_url(self.uuid, 1, f.name),
327 {'file': f}, format="multipart")
328 self.assertEqual(status.HTTP_201_CREATED, request.status_code)