blob: 555243fc8d7d99e7e1c71bd9ff42e775efe3961c [file] [log] [blame]
showarded2afea2009-07-07 20:54:07 +00001#!/usr/bin/python
2
Jakob Juelich3bb7c802014-09-02 16:31:11 -07003import datetime
showarded2afea2009-07-07 20:54:07 +00004import unittest
5import common
6from autotest_lib.frontend import setup_django_environment
7from autotest_lib.frontend.afe import frontend_test_utils
jamesren4a41e012010-07-16 22:33:48 +00008from autotest_lib.frontend.afe import models, model_attributes, model_logic
9from autotest_lib.client.common_lib import global_config
Aviv Keshet3dd8beb2013-05-13 17:36:04 -070010from autotest_lib.client.common_lib import control_data
showarded2afea2009-07-07 20:54:07 +000011
showarda5288b42009-07-28 20:06:08 +000012
13class AclGroupTest(unittest.TestCase,
14 frontend_test_utils.FrontendTestMixin):
15 def setUp(self):
16 self._frontend_common_setup()
17
18
19 def tearDown(self):
20 self._frontend_common_teardown()
21
22
23 def _check_acls(self, host, acl_name_list):
24 actual_acl_names = [acl_group.name for acl_group
25 in host.aclgroup_set.all()]
26 self.assertEquals(set(actual_acl_names), set(acl_name_list))
27
28
29 def test_on_host_membership_change(self):
30 host1, host2 = self.hosts[1:3]
31 everyone_acl = models.AclGroup.objects.get(name='Everyone')
32
33 host1.aclgroup_set.clear()
34 self._check_acls(host1, [])
35 host2.aclgroup_set.add(everyone_acl)
36 self._check_acls(host2, ['Everyone', 'my_acl'])
37
38 models.AclGroup.on_host_membership_change()
39
40 self._check_acls(host1, ['Everyone'])
41 self._check_acls(host2, ['my_acl'])
42
43
showardafd97de2009-10-01 18:45:09 +000044class HostTest(unittest.TestCase,
45 frontend_test_utils.FrontendTestMixin):
46 def setUp(self):
47 self._frontend_common_setup()
48
49
50 def tearDown(self):
51 self._frontend_common_teardown()
52
53
54 def test_add_host_previous_one_time_host(self):
55 # ensure that when adding a host which was previously used as a one-time
56 # host, the status isn't reset, since this can interfere with the
57 # scheduler.
58 host = models.Host.create_one_time_host('othost')
59 self.assertEquals(host.invalid, True)
60 self.assertEquals(host.status, models.Host.Status.READY)
61
62 host.status = models.Host.Status.RUNNING
63 host.save()
64
65 host2 = models.Host.add_object(hostname='othost')
66 self.assertEquals(host2.id, host.id)
67 self.assertEquals(host2.status, models.Host.Status.RUNNING)
68
69
showarded2afea2009-07-07 20:54:07 +000070class SpecialTaskUnittest(unittest.TestCase,
71 frontend_test_utils.FrontendTestMixin):
72 def setUp(self):
73 self._frontend_common_setup()
74
75
76 def tearDown(self):
77 self._frontend_common_teardown()
78
79
showardc0ac3a72009-07-08 21:14:45 +000080 def _create_task(self):
81 return models.SpecialTask.objects.create(
jamesren76fcf192010-04-21 20:39:50 +000082 host=self.hosts[0], task=models.SpecialTask.Task.VERIFY,
83 requested_by=models.User.current_user())
showarded2afea2009-07-07 20:54:07 +000084
showardc0ac3a72009-07-08 21:14:45 +000085
86 def test_execution_path(self):
87 task = self._create_task()
showarded2afea2009-07-07 20:54:07 +000088 self.assertEquals(task.execution_path(), 'hosts/host1/1-verify')
89
90
showardc0ac3a72009-07-08 21:14:45 +000091 def test_status(self):
92 task = self._create_task()
93 self.assertEquals(task.status, 'Queued')
94
95 task.update_object(is_active=True)
96 self.assertEquals(task.status, 'Running')
97
showarde60e44e2009-11-13 20:45:38 +000098 task.update_object(is_active=False, is_complete=True, success=True)
showardc0ac3a72009-07-08 21:14:45 +000099 self.assertEquals(task.status, 'Completed')
100
showarde60e44e2009-11-13 20:45:38 +0000101 task.update_object(success=False)
102 self.assertEquals(task.status, 'Failed')
103
showardc0ac3a72009-07-08 21:14:45 +0000104
showard97446882009-07-20 22:37:28 +0000105 def test_activate(self):
106 task = self._create_task()
107 task.activate()
108 self.assertTrue(task.is_active)
109 self.assertFalse(task.is_complete)
110
111
112 def test_finish(self):
113 task = self._create_task()
114 task.activate()
showarde60e44e2009-11-13 20:45:38 +0000115 task.finish(True)
showard97446882009-07-20 22:37:28 +0000116 self.assertFalse(task.is_active)
117 self.assertTrue(task.is_complete)
showarde60e44e2009-11-13 20:45:38 +0000118 self.assertTrue(task.success)
showard97446882009-07-20 22:37:28 +0000119
120
showard9bb960b2009-11-19 01:02:11 +0000121 def test_requested_by_from_queue_entry(self):
122 job = self._create_job(hosts=[0])
123 task = models.SpecialTask.objects.create(
124 host=self.hosts[0], task=models.SpecialTask.Task.VERIFY,
125 queue_entry=job.hostqueueentry_set.all()[0])
showardfd8b89f2010-01-20 19:06:30 +0000126 self.assertEquals(task.requested_by.login, 'autotest_system')
showard9bb960b2009-11-19 01:02:11 +0000127
128
showardd1195652009-12-08 22:21:02 +0000129class HostQueueEntryUnittest(unittest.TestCase,
130 frontend_test_utils.FrontendTestMixin):
131 def setUp(self):
132 self._frontend_common_setup()
133
134
135 def tearDown(self):
136 self._frontend_common_teardown()
137
138
139 def test_execution_path(self):
140 entry = self._create_job(hosts=[1]).hostqueueentry_set.all()[0]
141 entry.execution_subdir = 'subdir'
142 entry.save()
143
showardfd8b89f2010-01-20 19:06:30 +0000144 self.assertEquals(entry.execution_path(), '1-autotest_system/subdir')
showardd1195652009-12-08 22:21:02 +0000145
146
jamesrene3656232010-03-02 00:00:30 +0000147class ModelWithInvalidTest(unittest.TestCase,
148 frontend_test_utils.FrontendTestMixin):
149 def setUp(self):
150 self._frontend_common_setup()
151
152
153 def tearDown(self):
154 self._frontend_common_teardown()
155
156
157 def test_model_with_invalid_delete(self):
158 self.assertFalse(self.hosts[0].invalid)
159 self.hosts[0].delete()
160 self.assertTrue(self.hosts[0].invalid)
161 self.assertTrue(models.Host.objects.get(id=self.hosts[0].id))
162
163
164 def test_model_with_invalid_delete_queryset(self):
165 for host in self.hosts:
166 self.assertFalse(host.invalid)
167
168 hosts = models.Host.objects.all()
169 hosts.delete()
170 self.assertEqual(hosts.count(), len(self.hosts))
171
172 for host in hosts:
173 self.assertTrue(host.invalid)
174
175
176 def test_cloned_queryset_delete(self):
177 """
178 Make sure that a cloned queryset maintains the custom delete()
179 """
180 to_delete = ('host1', 'host2')
181
182 for host in self.hosts:
183 self.assertFalse(host.invalid)
184
185 hosts = models.Host.objects.all().filter(hostname__in=to_delete)
186 hosts.delete()
187 all_hosts = models.Host.objects.all()
188 self.assertEqual(all_hosts.count(), len(self.hosts))
189
190 for host in all_hosts:
191 if host.hostname in to_delete:
192 self.assertTrue(
193 host.invalid,
194 '%s.invalid expected to be True' % host.hostname)
195 else:
196 self.assertFalse(
197 host.invalid,
198 '%s.invalid expected to be False' % host.hostname)
199
200
201 def test_normal_delete(self):
202 job = self._create_job(hosts=[1])
203 self.assertEqual(1, models.Job.objects.all().count())
204
205 job.delete()
206 self.assertEqual(0, models.Job.objects.all().count())
207
208
209 def test_normal_delete_queryset(self):
210 self._create_job(hosts=[1])
211 self._create_job(hosts=[2])
212
213 self.assertEqual(2, models.Job.objects.all().count())
214
215 models.Job.objects.all().delete()
216 self.assertEqual(0, models.Job.objects.all().count())
217
218
jamesren4a41e012010-07-16 22:33:48 +0000219class KernelTest(unittest.TestCase, frontend_test_utils.FrontendTestMixin):
220 def setUp(self):
221 self._frontend_common_setup()
222
223
224 def tearDown(self):
225 self._frontend_common_teardown()
226
227
228 def test_create_kernels_none(self):
229 self.assertEqual(None, models.Kernel.create_kernels(None))
230
231
232 def test_create_kernels(self):
233 self.god.stub_function(models.Kernel, '_create')
234
235 num_kernels = 3
236 kernel_list = [object() for _ in range(num_kernels)]
237 result = [object() for _ in range(num_kernels)]
238
239 for kernel, response in zip(kernel_list, result):
240 models.Kernel._create.expect_call(kernel).and_return(response)
241 self.assertEqual(result, models.Kernel.create_kernels(kernel_list))
242 self.god.check_playback()
243
244
245 def test_create(self):
246 kernel = models.Kernel._create({'version': 'version'})
247 self.assertEqual(kernel.version, 'version')
248 self.assertEqual(kernel.cmdline, '')
249 self.assertEqual(kernel, models.Kernel._create({'version': 'version'}))
250
251
252class ParameterizedJobTest(unittest.TestCase,
253 frontend_test_utils.FrontendTestMixin):
254 def setUp(self):
255 self._frontend_common_setup()
256
257
258 def tearDown(self):
259 self._frontend_common_teardown()
260
261
262 def test_job(self):
263 global_config.global_config.override_config_value(
264 'AUTOTEST_WEB', 'parameterized_jobs', 'True')
265
266 test = models.Test.objects.create(
267 name='name', author='author', test_class='class',
268 test_category='category',
Aviv Keshet3dd8beb2013-05-13 17:36:04 -0700269 test_type=control_data.CONTROL_TYPE.SERVER, path='path')
jamesren4a41e012010-07-16 22:33:48 +0000270 parameterized_job = models.ParameterizedJob.objects.create(test=test)
271 job = self._create_job(hosts=[1], control_file=None,
272 parameterized_job=parameterized_job)
273
274 self.assertEqual(job, parameterized_job.job())
275
276
277class JobTest(unittest.TestCase, frontend_test_utils.FrontendTestMixin):
278 def setUp(self):
279 self._frontend_common_setup()
280
281
282 def tearDown(self):
283 self._frontend_common_teardown()
284
285
286 def test_check_parameterized_jobs_no_args(self):
287 self.assertRaises(Exception, models.Job.check_parameterized_job,
288 control_file=None, parameterized_job=None)
289
290
291 def test_check_parameterized_jobs_both_args(self):
292 self.assertRaises(Exception, models.Job.check_parameterized_job,
293 control_file=object(), parameterized_job=object())
294
295
296 def test_check_parameterized_jobs_disabled(self):
297 self.assertRaises(Exception, models.Job.check_parameterized_job,
298 control_file=None, parameterized_job=object())
299
300
301 def test_check_parameterized_jobs_enabled(self):
302 global_config.global_config.override_config_value(
303 'AUTOTEST_WEB', 'parameterized_jobs', 'True')
304 self.assertRaises(Exception, models.Job.check_parameterized_job,
305 control_file=object(), parameterized_job=None)
306
307
Jakob Juelich3bb7c802014-09-02 16:31:11 -0700308class SerializationTest(unittest.TestCase,
309 frontend_test_utils.FrontendTestMixin):
310 def setUp(self):
311 self._frontend_common_setup()
312
313
314 def tearDown(self):
315 self._frontend_common_teardown()
316
317
318 def test_serialize(self):
319 platform_label = models.Label.objects.get(platform=True)
320
321 suite_job = self._create_job(hostless=True)
322 job1 = self._create_job(parent_job_id=suite_job.id,
323 metahosts=[platform_label.id]
324 )
325 job2 = self._create_job(parent_job_id=suite_job.id,
326 metahosts=[platform_label.id])
327
328 host1, host2 = models.Host.objects.all()[:2]
329
330 job1_serialized = job1.serialize()
331 host1_serialized = host1.serialize()
332
333 self.assertEqual(
334 job1_serialized,
335 {'control_file': 'control',
336 'control_type': 2,
337 'created_on': datetime.datetime(2008, 1, 1, 0, 0),
338 'dependency_labels': [{u'id': 10,
339 'invalid': False,
340 'kernel_config': u'',
341 'name': u'myplatform',
342 'only_if_needed': False,
343 'platform': True}],
344 'email_list': u'',
345 'hostqueueentry_set': [{'aborted': False,
346 'active': False,
347 'complete': False,
348 'deleted': False,
349 'execution_subdir': u'',
350 'finished_on': None,
351 u'id': 2,
352 'meta_host': {u'id': 10,
353 'invalid': False,
354 'kernel_config': u'',
355 'name': u'myplatform',
356 'only_if_needed': False,
357 'platform': True},
358 'started_on': None,
359 'status': u'Queued'}],
360 u'id': 2,
361 'jobkeyval_set': [],
362 'max_runtime_hrs': 72,
363 'max_runtime_mins': u'1440',
364 'name': 'test',
365 'owner': 'autotest_system',
366 'parse_failed_repair': True,
367 'priority': 0,
368 'reboot_after': 0,
369 'reboot_before': 0,
370 'run_reset': True,
371 'run_verify': False,
372 'shard': None,
373 'synch_count': 1,
374 'test_retry': 0,
375 'timeout': u'24',
376 'timeout_mins': u'1440'}
377 )
378 self.assertEqual(
379 host1_serialized,
380 {'aclgroup_set': [{'description': u'',
381 u'id': 2,
382 'name': u'my_acl',
383 'users': [{'access_level': 100,
384 u'id': 1,
385 'login': u'autotest_system',
386 'reboot_after': 0,
387 'reboot_before': 1,
388 'show_experimental': False}]}],
389 'dirty': True,
390 'hostattribute_set': [],
391 'hostname': u'host1',
392 u'id': 1,
393 'invalid': False,
394 'labels': [{u'id': 1,
395 'invalid': False,
396 'kernel_config': u'',
397 'name': u'label1',
398 'only_if_needed': False,
399 'platform': False},
400 {u'id': 10,
401 'invalid': False,
402 'kernel_config': u'',
403 'name': u'myplatform',
404 'only_if_needed': False,
405 'platform': True}],
406 'leased': True,
407 'lock_time': None,
408 'locked': False,
409 'protection': 0,
410 'shard': None,
411 'status': u'Ready',
412 'synch_id': None}
413 )
414
415
showarded2afea2009-07-07 20:54:07 +0000416if __name__ == '__main__':
417 unittest.main()