blob: 65b578546eb073f953ff4a8c21f6362b15954652 [file] [log] [blame]
jadmanskia9894d02009-08-21 16:49:48 +00001#!/usr/bin/python
mbligh234a84f2008-11-20 19:57:43 +00002
3"""Unit Tests for autotest.client.common_lib.test"""
4
5__author__ = 'gps@google.com (Gregory P. Smith)'
6
7import unittest
mbligh234a84f2008-11-20 19:57:43 +00008import common
Scott Zawalski91493c82013-01-25 16:15:20 -05009from autotest_lib.client.common_lib import test
mbligh234a84f2008-11-20 19:57:43 +000010from autotest_lib.client.common_lib.test_utils import mock
11
mbligh4b835b82009-02-11 01:26:13 +000012class TestTestCase(unittest.TestCase):
mbligh234a84f2008-11-20 19:57:43 +000013 class _neutered_base_test(test.base_test):
14 """A child class of base_test to avoid calling the constructor."""
15 def __init__(self, *args, **kwargs):
mbligh4b835b82009-02-11 01:26:13 +000016 class MockJob(object):
17 pass
18 class MockProfilerManager(object):
19 def active(self):
20 return False
mblighc6bf6012009-10-02 00:02:15 +000021 def present(self):
22 return True
mbligh4b835b82009-02-11 01:26:13 +000023 self.job = MockJob()
showarda6082ef2009-10-12 20:25:44 +000024 self.job.default_profile_only = False
mbligh4b835b82009-02-11 01:26:13 +000025 self.job.profilers = MockProfilerManager()
Scott Zawalski91493c82013-01-25 16:15:20 -050026 self.job.test_retry = 0
jadmanskia93fbca2009-08-21 15:34:04 +000027 self._new_keyval = False
mbligh5e703a22009-06-15 22:00:12 +000028 self.iteration = 0
mbligh742ae422009-05-13 20:46:41 +000029 self.before_iteration_hooks = []
30 self.after_iteration_hooks = []
31
mbligh234a84f2008-11-20 19:57:43 +000032
33 def setUp(self):
34 self.god = mock.mock_god()
35 self.test = self._neutered_base_test()
mbligh234a84f2008-11-20 19:57:43 +000036
37
38 def tearDown(self):
39 self.god.unstub_all()
40
41
mbligh4b835b82009-02-11 01:26:13 +000042
mbligh4b835b82009-02-11 01:26:13 +000043class Test_base_test_execute(TestTestCase):
44 # Test the various behaviors of the base_test.execute() method.
45 def setUp(self):
46 TestTestCase.setUp(self)
mbligh4b835b82009-02-11 01:26:13 +000047 self.god.stub_function(self.test, 'run_once_profiling')
48 self.god.stub_function(self.test, 'postprocess')
mbligh32cb5b42009-05-01 23:05:09 +000049 self.god.stub_function(self.test, 'process_failed_constraints')
mbligh4b835b82009-02-11 01:26:13 +000050
mbligh4b835b82009-02-11 01:26:13 +000051
mbligh4395bbd2009-03-25 19:34:17 +000052 def test_call_run_once(self):
53 # setup
54 self.god.stub_function(self.test, 'drop_caches_between_iterations')
55 self.god.stub_function(self.test, 'run_once')
56 self.god.stub_function(self.test, 'postprocess_iteration')
mbligh7af09972009-04-17 22:17:08 +000057 self.god.stub_function(self.test, 'analyze_perf_constraints')
mbligh4395bbd2009-03-25 19:34:17 +000058 before_hook = self.god.create_mock_function('before_hook')
59 after_hook = self.god.create_mock_function('after_hook')
mbligh742ae422009-05-13 20:46:41 +000060 self.test.register_before_iteration_hook(before_hook)
61 self.test.register_after_iteration_hook(after_hook)
mbligh4395bbd2009-03-25 19:34:17 +000062
63 # tests the test._call_run_once implementation
64 self.test.drop_caches_between_iterations.expect_call()
showardd4ead172009-05-01 00:08:56 +000065 before_hook.expect_call(self.test)
mbligh4395bbd2009-03-25 19:34:17 +000066 self.test.run_once.expect_call(1, 2, arg='val')
mbligh4395bbd2009-03-25 19:34:17 +000067 self.test.postprocess_iteration.expect_call()
mbligh7af09972009-04-17 22:17:08 +000068 self.test.analyze_perf_constraints.expect_call([])
Eric Lidaf6ff02011-03-01 15:31:31 -080069 after_hook.expect_call(self.test)
jadmanskia93fbca2009-08-21 15:34:04 +000070 self.test._call_run_once([], False, None, (1, 2), {'arg': 'val'})
showardd4ead172009-05-01 00:08:56 +000071 self.god.check_playback()
mbligh4395bbd2009-03-25 19:34:17 +000072
73
Eric Lidaf6ff02011-03-01 15:31:31 -080074 def test_call_run_once_with_exception(self):
75 # setup
76 self.god.stub_function(self.test, 'drop_caches_between_iterations')
77 self.god.stub_function(self.test, 'run_once')
78 before_hook = self.god.create_mock_function('before_hook')
79 after_hook = self.god.create_mock_function('after_hook')
80 self.test.register_before_iteration_hook(before_hook)
81 self.test.register_after_iteration_hook(after_hook)
82 error = Exception('fail')
83
84 # tests the test._call_run_once implementation
85 self.test.drop_caches_between_iterations.expect_call()
86 before_hook.expect_call(self.test)
87 self.test.run_once.expect_call(1, 2, arg='val').and_raises(error)
88 after_hook.expect_call(self.test)
89 try:
90 self.test._call_run_once([], False, None, (1, 2), {'arg': 'val'})
91 except:
92 pass
93 self.god.check_playback()
94
95
Scott Zawalski91493c82013-01-25 16:15:20 -050096 def _setup_failed_test_calls(self, fail_count, error):
97 """
98 Set up failed test calls for use with call_run_once_with_retry.
99
100 @param fail_count: The amount of times to mock a failure.
101 @param error: The error to raise while failing.
102 """
103 self.god.stub_function(self.test.job, 'record')
104 self.god.stub_function(self.test, '_call_run_once')
105 # tests the test._call_run_once implementation
106 for run in xrange(0, fail_count):
107 self.test._call_run_once.expect_call([], False, None, (1, 2),
108 {'arg': 'val'}).and_raises(
109 error)
110 info_str = 'Run %s failed with %s' % (run, error)
111 # On the final run we do not emit this message.
112 if run != self.test.job.test_retry:
113 self.test.job.record.expect_call('INFO', None, None, info_str)
114
115
116 def test_call_run_once_with_retry_exception(self):
117 """
118 Test call_run_once_with_retry duplicating a test that will always fail.
119 """
120 self.test.job.test_retry = 5
121 self.god.stub_function(self.test, 'drop_caches_between_iterations')
122 self.god.stub_function(self.test, 'run_once')
123 before_hook = self.god.create_mock_function('before_hook')
124 after_hook = self.god.create_mock_function('after_hook')
125 self.test.register_before_iteration_hook(before_hook)
126 self.test.register_after_iteration_hook(after_hook)
127 error = Exception('fail')
128 self._setup_failed_test_calls(self.test.job.test_retry+1, error)
129 try:
130 self.test._call_run_once_with_retry([], False, None, (1, 2),
131 {'arg': 'val'})
132 except Exception as err:
133 if err != error:
134 raise
135 self.god.check_playback()
136
137
138 def test_call_run_once_with_retry_exception_and_pass(self):
139 """
140 Test call_run_once_with_retry duplicating a test that fails at first
141 and later passes.
142 """
143 # Stubbed out for the write_keyval call.
144 self.test.outputdir = '/tmp'
145 self.test.job._tap = None
146
147 num_to_fail = 2
148 self.test.job.test_retry = 5
149 self.god.stub_function(self.test, 'drop_caches_between_iterations')
150 self.god.stub_function(self.test, 'run_once')
151 before_hook = self.god.create_mock_function('before_hook')
152 after_hook = self.god.create_mock_function('after_hook')
153 self.god.stub_function(self.test, '_call_run_once')
154 self.test.register_before_iteration_hook(before_hook)
155 self.test.register_after_iteration_hook(after_hook)
156 self.god.stub_function(self.test.job, 'record')
157 # tests the test._call_run_once implementation
158 error = Exception('fail')
159 self._setup_failed_test_calls(num_to_fail, error)
160 # Passing call
161 self.test._call_run_once.expect_call([], False, None, (1, 2),
162 {'arg': 'val'})
163 self.test._call_run_once_with_retry([], False, None, (1, 2),
164 {'arg': 'val'})
165 self.god.check_playback()
166
167
mbligh4395bbd2009-03-25 19:34:17 +0000168 def _expect_call_run_once(self):
jadmanskia93fbca2009-08-21 15:34:04 +0000169 self.test._call_run_once.expect_call((), False, None, (), {})
mbligh4395bbd2009-03-25 19:34:17 +0000170
171
mbligh4b835b82009-02-11 01:26:13 +0000172 def test_execute_test_length(self):
173 # test that test_length overrides iterations and works.
mbligh4395bbd2009-03-25 19:34:17 +0000174 self.god.stub_function(self.test, '_call_run_once')
175
176 self._expect_call_run_once()
177 self._expect_call_run_once()
178 self._expect_call_run_once()
mbligha49c5cb2009-02-26 01:01:09 +0000179 self.test.run_once_profiling.expect_call(None)
mbligh4b835b82009-02-11 01:26:13 +0000180 self.test.postprocess.expect_call()
mbligh32cb5b42009-05-01 23:05:09 +0000181 self.test.process_failed_constraints.expect_call()
mbligh4b835b82009-02-11 01:26:13 +0000182
183 fake_time = iter(xrange(4)).next
184 self.test.execute(iterations=1, test_length=3, _get_time=fake_time)
185 self.god.check_playback()
186
187
188 def test_execute_iterations(self):
189 # test that iterations works.
mbligh4395bbd2009-03-25 19:34:17 +0000190 self.god.stub_function(self.test, '_call_run_once')
191
mbligh4b835b82009-02-11 01:26:13 +0000192 iterations = 2
193 for _ in range(iterations):
mbligh4395bbd2009-03-25 19:34:17 +0000194 self._expect_call_run_once()
mbligha49c5cb2009-02-26 01:01:09 +0000195 self.test.run_once_profiling.expect_call(None)
mbligh4b835b82009-02-11 01:26:13 +0000196 self.test.postprocess.expect_call()
mbligh32cb5b42009-05-01 23:05:09 +0000197 self.test.process_failed_constraints.expect_call()
mbligh4b835b82009-02-11 01:26:13 +0000198
199 self.test.execute(iterations=iterations)
200 self.god.check_playback()
201
202
203 def _mock_calls_for_execute_no_iterations(self):
mbligha49c5cb2009-02-26 01:01:09 +0000204 self.test.run_once_profiling.expect_call(None)
mbligh4b835b82009-02-11 01:26:13 +0000205 self.test.postprocess.expect_call()
mbligh32cb5b42009-05-01 23:05:09 +0000206 self.test.process_failed_constraints.expect_call()
mbligh4b835b82009-02-11 01:26:13 +0000207
208
209 def test_execute_iteration_zero(self):
210 # test that iterations=0 works.
211 self._mock_calls_for_execute_no_iterations()
212
213 self.test.execute(iterations=0)
214 self.god.check_playback()
215
216
217 def test_execute_profile_only(self):
mblighc6bf6012009-10-02 00:02:15 +0000218 # test that profile_only=True works.
jadmanskia93fbca2009-08-21 15:34:04 +0000219 self.god.stub_function(self.test, 'drop_caches_between_iterations')
220 self.test.drop_caches_between_iterations.expect_call()
221 self.test.run_once_profiling.expect_call(None)
222 self.test.drop_caches_between_iterations.expect_call()
223 self.test.run_once_profiling.expect_call(None)
224 self.test.postprocess.expect_call()
225 self.test.process_failed_constraints.expect_call()
mbligh4b835b82009-02-11 01:26:13 +0000226 self.test.execute(profile_only=True, iterations=2)
227 self.god.check_playback()
228
229
showarda6082ef2009-10-12 20:25:44 +0000230 def test_execute_default_profile_only(self):
231 # test that profile_only=True works.
232 self.god.stub_function(self.test, 'drop_caches_between_iterations')
233 for _ in xrange(3):
234 self.test.drop_caches_between_iterations.expect_call()
235 self.test.run_once_profiling.expect_call(None)
236 self.test.postprocess.expect_call()
237 self.test.process_failed_constraints.expect_call()
238 self.test.job.default_profile_only = True
239 self.test.execute(iterations=3)
240 self.god.check_playback()
241
242
mbligha49c5cb2009-02-26 01:01:09 +0000243 def test_execute_postprocess_profiled_false(self):
244 # test that postprocess_profiled_run=False works
mbligh4395bbd2009-03-25 19:34:17 +0000245 self.god.stub_function(self.test, '_call_run_once')
246
jadmanskia93fbca2009-08-21 15:34:04 +0000247 self.test._call_run_once.expect_call((), False, False, (), {})
mbligha49c5cb2009-02-26 01:01:09 +0000248 self.test.run_once_profiling.expect_call(False)
249 self.test.postprocess.expect_call()
mbligh32cb5b42009-05-01 23:05:09 +0000250 self.test.process_failed_constraints.expect_call()
mbligha49c5cb2009-02-26 01:01:09 +0000251
252 self.test.execute(postprocess_profiled_run=False, iterations=1)
253 self.god.check_playback()
254
255
256 def test_execute_postprocess_profiled_true(self):
257 # test that postprocess_profiled_run=True works
mbligh4395bbd2009-03-25 19:34:17 +0000258 self.god.stub_function(self.test, '_call_run_once')
259
jadmanskia93fbca2009-08-21 15:34:04 +0000260 self.test._call_run_once.expect_call((), False, True, (), {})
mbligha49c5cb2009-02-26 01:01:09 +0000261 self.test.run_once_profiling.expect_call(True)
262 self.test.postprocess.expect_call()
mbligh32cb5b42009-05-01 23:05:09 +0000263 self.test.process_failed_constraints.expect_call()
mbligha49c5cb2009-02-26 01:01:09 +0000264
265 self.test.execute(postprocess_profiled_run=True, iterations=1)
266 self.god.check_playback()
267
268
mbligh234a84f2008-11-20 19:57:43 +0000269if __name__ == '__main__':
270 unittest.main()