blob: d4ae59971c3d0cc6db5591734b79404f5bfb9df3 [file] [log] [blame]
markdrdd1893d2018-02-05 17:13:47 -08001#!/usr/bin/env python3
Ang Lie57a38e2016-02-11 11:22:53 -08002#
3# Copyright 2016 - The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -070017import mock
Ang Lie57a38e2016-02-11 11:22:53 -080018import unittest
19
Ang Li8893e6d2016-02-24 17:24:19 -080020from acts import asserts
Ang Lie57a38e2016-02-11 11:22:53 -080021from acts import base_test
22from acts import signals
Ang Liba3546c2016-02-10 13:24:45 -080023from acts import test_runner
Ang Lie57a38e2016-02-11 11:22:53 -080024
25MSG_EXPECTED_EXCEPTION = "This is an expected exception."
26MSG_EXPECTED_TEST_FAILURE = "This is an expected test failure."
27MSG_UNEXPECTED_EXCEPTION = "Unexpected exception!"
28
29MOCK_EXTRA = {"key": "value", "answer_to_everything": 42}
30
tturney0cda4c82016-11-23 15:06:14 -080031
Ang Lie57a38e2016-02-11 11:22:53 -080032def never_call():
33 raise Exception(MSG_UNEXPECTED_EXCEPTION)
34
tturney0cda4c82016-11-23 15:06:14 -080035
Ang Li8893e6d2016-02-24 17:24:19 -080036class SomeError(Exception):
37 """A custom exception class used for tests in this module."""
38
Ang Lie57a38e2016-02-11 11:22:53 -080039
tturney0cda4c82016-11-23 15:06:14 -080040class ActsBaseClassTest(unittest.TestCase):
Ang Lie57a38e2016-02-11 11:22:53 -080041 def setUp(self):
42 self.mock_test_cls_configs = {
43 'reporter': mock.MagicMock(),
44 'log': mock.MagicMock(),
45 'log_path': '/tmp',
46 'cli_args': None,
markdrd55fded2017-04-10 11:13:09 -070047 'user_params': {
48 "some_param": "hahaha"
49 }
Ang Lie57a38e2016-02-11 11:22:53 -080050 }
51 self.mock_test_name = "test_something"
52
53 def test_current_test_case_name(self):
54 class MockBaseTest(base_test.BaseTestClass):
55 def test_func(self):
markdrf436a982017-11-08 13:15:34 -080056 asserts.assert_true(
57 self.current_test_name == "test_func",
58 ("Got "
59 "unexpected test name %s.") % self.current_test_name)
tturney0cda4c82016-11-23 15:06:14 -080060
Ang Lie57a38e2016-02-11 11:22:53 -080061 bt_cls = MockBaseTest(self.mock_test_cls_configs)
62 bt_cls.run(test_names=["test_func"])
63 actual_record = bt_cls.results.passed[0]
64 self.assertEqual(actual_record.test_name, "test_func")
65 self.assertIsNone(actual_record.details)
66 self.assertIsNone(actual_record.extras)
67
Ang Liba3546c2016-02-10 13:24:45 -080068 def test_self_tests_list(self):
69 class MockBaseTest(base_test.BaseTestClass):
70 def __init__(self, controllers):
71 super(MockBaseTest, self).__init__(controllers)
tturney0cda4c82016-11-23 15:06:14 -080072 self.tests = ("test_something", )
73
Ang Liba3546c2016-02-10 13:24:45 -080074 def test_something(self):
75 pass
tturney0cda4c82016-11-23 15:06:14 -080076
Ang Liba3546c2016-02-10 13:24:45 -080077 def test_never(self):
78 # This should not execute it's not on default test list.
79 never_call()
tturney0cda4c82016-11-23 15:06:14 -080080
Ang Liba3546c2016-02-10 13:24:45 -080081 bt_cls = MockBaseTest(self.mock_test_cls_configs)
82 bt_cls.run()
83 actual_record = bt_cls.results.passed[0]
84 self.assertEqual(actual_record.test_name, "test_something")
85
86 def test_self_tests_list_fail_by_convention(self):
87 class MockBaseTest(base_test.BaseTestClass):
88 def __init__(self, controllers):
89 super(MockBaseTest, self).__init__(controllers)
tturney0cda4c82016-11-23 15:06:14 -080090 self.tests = ("not_a_test_something", )
91
Ang Liba3546c2016-02-10 13:24:45 -080092 def not_a_test_something(self):
93 pass
tturney0cda4c82016-11-23 15:06:14 -080094
Ang Liba3546c2016-02-10 13:24:45 -080095 def test_never(self):
96 # This should not execute it's not on default test list.
97 never_call()
tturney0cda4c82016-11-23 15:06:14 -080098
Ang Liba3546c2016-02-10 13:24:45 -080099 bt_cls = MockBaseTest(self.mock_test_cls_configs)
100 expected_msg = ("Test case name not_a_test_something does not follow "
Ang Li8893e6d2016-02-24 17:24:19 -0800101 "naming convention test_\*, abort.")
tturney0cda4c82016-11-23 15:06:14 -0800102 with self.assertRaisesRegexp(base_test.Error, expected_msg):
Ang Liba3546c2016-02-10 13:24:45 -0800103 bt_cls.run()
104
105 def test_cli_test_selection_override_self_tests_list(self):
106 class MockBaseTest(base_test.BaseTestClass):
107 def __init__(self, controllers):
108 super(MockBaseTest, self).__init__(controllers)
tturney0cda4c82016-11-23 15:06:14 -0800109 self.tests = ("test_never", )
110
Ang Liba3546c2016-02-10 13:24:45 -0800111 def test_something(self):
112 pass
tturney0cda4c82016-11-23 15:06:14 -0800113
Ang Liba3546c2016-02-10 13:24:45 -0800114 def test_never(self):
115 # This should not execute it's not selected by cmd line input.
116 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800117
Ang Liba3546c2016-02-10 13:24:45 -0800118 bt_cls = MockBaseTest(self.mock_test_cls_configs)
119 bt_cls.run(test_names=["test_something"])
120 actual_record = bt_cls.results.passed[0]
121 self.assertEqual(actual_record.test_name, "test_something")
122
123 def test_cli_test_selection_fail_by_convention(self):
124 class MockBaseTest(base_test.BaseTestClass):
125 def __init__(self, controllers):
126 super(MockBaseTest, self).__init__(controllers)
tturney0cda4c82016-11-23 15:06:14 -0800127 self.tests = ("not_a_test_something", )
128
Ang Liba3546c2016-02-10 13:24:45 -0800129 def not_a_test_something(self):
130 pass
tturney0cda4c82016-11-23 15:06:14 -0800131
Ang Liba3546c2016-02-10 13:24:45 -0800132 def test_never(self):
133 # This should not execute it's not selected by cmd line input.
134 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800135
Ang Liba3546c2016-02-10 13:24:45 -0800136 bt_cls = MockBaseTest(self.mock_test_cls_configs)
137 expected_msg = ("Test case name not_a_test_something does not follow "
138 "naming convention test_*, abort.")
Ang Li5d569fe2016-10-06 14:46:36 -0700139 with self.assertRaises(base_test.Error, msg=expected_msg):
Ang Liba3546c2016-02-10 13:24:45 -0800140 bt_cls.run(test_names=["not_a_test_something"])
141
142 def test_default_execution_of_all_tests(self):
143 class MockBaseTest(base_test.BaseTestClass):
144 def test_something(self):
145 pass
tturney0cda4c82016-11-23 15:06:14 -0800146
Ang Liba3546c2016-02-10 13:24:45 -0800147 def not_a_test(self):
148 # This should not execute its name doesn't follow test case
149 # naming convention.
150 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800151
Ang Liba3546c2016-02-10 13:24:45 -0800152 bt_cls = MockBaseTest(self.mock_test_cls_configs)
153 bt_cls.run(test_names=["test_something"])
154 actual_record = bt_cls.results.passed[0]
155 self.assertEqual(actual_record.test_name, "test_something")
156
Ang Li0e2ccb02016-09-09 16:43:22 -0700157 def test_missing_requested_test_func(self):
158 class MockBaseTest(base_test.BaseTestClass):
159 pass
tturney0cda4c82016-11-23 15:06:14 -0800160
Ang Li0e2ccb02016-09-09 16:43:22 -0700161 bt_cls = MockBaseTest(self.mock_test_cls_configs)
Benny Peakef95aac82017-04-26 18:05:52 -0700162 bt_cls.run(test_names=["test_something"])
Ang Li0e2ccb02016-09-09 16:43:22 -0700163 self.assertFalse(bt_cls.results.executed)
Benny Peakef95aac82017-04-26 18:05:52 -0700164 self.assertTrue(bt_cls.results.skipped)
Ang Li0e2ccb02016-09-09 16:43:22 -0700165
Ang Lie57a38e2016-02-11 11:22:53 -0800166 def test_setup_class_fail_by_exception(self):
Ang Li4d32ee22016-08-15 18:13:05 -0700167 call_check = mock.MagicMock()
tturney0cda4c82016-11-23 15:06:14 -0800168
Ang Lie57a38e2016-02-11 11:22:53 -0800169 class MockBaseTest(base_test.BaseTestClass):
170 def setup_class(self):
171 raise Exception(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800172
Ang Lie57a38e2016-02-11 11:22:53 -0800173 def test_something(self):
174 # This should not execute because setup_class failed.
175 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800176
Benny Peaked78717a2017-04-13 13:42:22 -0700177 def on_blocked(self, test_name, begin_time):
Ang Li4d32ee22016-08-15 18:13:05 -0700178 call_check("haha")
tturney0cda4c82016-11-23 15:06:14 -0800179
Ang Lie57a38e2016-02-11 11:22:53 -0800180 bt_cls = MockBaseTest(self.mock_test_cls_configs)
Ang Li4d32ee22016-08-15 18:13:05 -0700181 bt_cls.run()
Benny Peaked78717a2017-04-13 13:42:22 -0700182 actual_record = bt_cls.results.blocked[0]
183 self.assertEqual(actual_record.test_name, "test_something")
markdrd55fded2017-04-10 11:13:09 -0700184 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700185 "Blocked 1, ControllerInfo {}, Executed 0, Failed 0, Passed 0,"
186 " Requested 1, Skipped 0, Unknown 0")
Ang Lie57a38e2016-02-11 11:22:53 -0800187 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
Ang Li4d32ee22016-08-15 18:13:05 -0700188 call_check.assert_called_once_with("haha")
Ang Lie57a38e2016-02-11 11:22:53 -0800189
190 def test_setup_test_fail_by_exception(self):
191 class MockBaseTest(base_test.BaseTestClass):
192 def setup_test(self):
193 raise Exception(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800194
Ang Lie57a38e2016-02-11 11:22:53 -0800195 def test_something(self):
196 # This should not execute because setup_test failed.
197 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800198
Ang Lie57a38e2016-02-11 11:22:53 -0800199 bt_cls = MockBaseTest(self.mock_test_cls_configs)
200 bt_cls.run(test_names=["test_something"])
201 actual_record = bt_cls.results.unknown[0]
202 self.assertEqual(actual_record.test_name, self.mock_test_name)
203 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
204 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700205 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700206 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
207 "Requested 1, Skipped 0, Unknown 1")
Ang Lie57a38e2016-02-11 11:22:53 -0800208 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
209
210 def test_setup_test_fail_by_test_signal(self):
211 class MockBaseTest(base_test.BaseTestClass):
212 def setup_test(self):
213 raise signals.TestFailure(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800214
Ang Lie57a38e2016-02-11 11:22:53 -0800215 def test_something(self):
216 # This should not execute because setup_test failed.
217 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800218
Ang Lie57a38e2016-02-11 11:22:53 -0800219 bt_cls = MockBaseTest(self.mock_test_cls_configs)
220 bt_cls.run(test_names=["test_something"])
221 actual_record = bt_cls.results.failed[0]
222 self.assertEqual(actual_record.test_name, self.mock_test_name)
223 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
224 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700225 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700226 "Blocked 0, ControllerInfo {}, Executed 1, Failed 1, Passed 0, "
227 "Requested 1, Skipped 0, Unknown 0")
Ang Lie57a38e2016-02-11 11:22:53 -0800228 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
229
230 def test_setup_test_fail_by_return_False(self):
231 class MockBaseTest(base_test.BaseTestClass):
232 def setup_test(self):
233 return False
tturney0cda4c82016-11-23 15:06:14 -0800234
Ang Lie57a38e2016-02-11 11:22:53 -0800235 def test_something(self):
236 # This should not execute because setup_test failed.
237 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800238
Ang Lie57a38e2016-02-11 11:22:53 -0800239 bt_cls = MockBaseTest(self.mock_test_cls_configs)
240 bt_cls.run(test_names=["test_something"])
241 actual_record = bt_cls.results.failed[0]
242 expected_msg = "Setup for %s failed." % self.mock_test_name
243 self.assertEqual(actual_record.test_name, self.mock_test_name)
244 self.assertEqual(actual_record.details, expected_msg)
Ang Lia3e95922016-04-19 16:31:49 -0700245 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700246 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700247 "Blocked 0, ControllerInfo {}, Executed 1, Failed 1, Passed 0, "
248 "Requested 1, Skipped 0, Unknown 0")
Ang Lie57a38e2016-02-11 11:22:53 -0800249 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
250
Ang Lia3e95922016-04-19 16:31:49 -0700251 def test_teardown_test_assert_fail(self):
252 class MockBaseTest(base_test.BaseTestClass):
253 def teardown_test(self):
254 asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800255
Ang Lia3e95922016-04-19 16:31:49 -0700256 def test_something(self):
257 pass
tturney0cda4c82016-11-23 15:06:14 -0800258
Ang Lia3e95922016-04-19 16:31:49 -0700259 bt_cls = MockBaseTest(self.mock_test_cls_configs)
260 bt_cls.run()
Ang Lide97b662016-06-01 17:54:56 -0700261 actual_record = bt_cls.results.unknown[0]
Ang Lia3e95922016-04-19 16:31:49 -0700262 self.assertEqual(actual_record.test_name, self.mock_test_name)
Ang Lide97b662016-06-01 17:54:56 -0700263 self.assertIsNone(actual_record.details)
Ang Lia3e95922016-04-19 16:31:49 -0700264 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700265 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700266 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
267 "Requested 1, Skipped 0, Unknown 1")
Ang Lia3e95922016-04-19 16:31:49 -0700268 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
269
270 def test_teardown_test_raise_exception(self):
271 class MockBaseTest(base_test.BaseTestClass):
272 def teardown_test(self):
273 raise Exception(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800274
Ang Lia3e95922016-04-19 16:31:49 -0700275 def test_something(self):
276 pass
tturney0cda4c82016-11-23 15:06:14 -0800277
Ang Lia3e95922016-04-19 16:31:49 -0700278 bt_cls = MockBaseTest(self.mock_test_cls_configs)
279 bt_cls.run()
280 actual_record = bt_cls.results.unknown[0]
281 self.assertEqual(actual_record.test_name, self.mock_test_name)
Ang Lide97b662016-06-01 17:54:56 -0700282 self.assertIsNone(actual_record.details)
Ang Lia3e95922016-04-19 16:31:49 -0700283 self.assertIsNone(actual_record.extras)
Ang Li4e899752016-07-28 13:25:48 -0700284 expected_extra_error = {"teardown_test": MSG_EXPECTED_EXCEPTION}
markdrf436a982017-11-08 13:15:34 -0800285 self.assertEqual(actual_record.additional_errors, expected_extra_error)
markdrd55fded2017-04-10 11:13:09 -0700286 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700287 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
288 "Requested 1, Skipped 0, Unknown 1")
Ang Li4e899752016-07-28 13:25:48 -0700289 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
290
291 def test_teardown_test_executed_if_test_pass(self):
292 my_mock = mock.MagicMock()
tturney0cda4c82016-11-23 15:06:14 -0800293
Ang Li4e899752016-07-28 13:25:48 -0700294 class MockBaseTest(base_test.BaseTestClass):
295 def teardown_test(self):
296 my_mock("teardown_test")
tturney0cda4c82016-11-23 15:06:14 -0800297
Ang Li4e899752016-07-28 13:25:48 -0700298 def test_something(self):
299 pass
tturney0cda4c82016-11-23 15:06:14 -0800300
Ang Li4e899752016-07-28 13:25:48 -0700301 bt_cls = MockBaseTest(self.mock_test_cls_configs)
302 bt_cls.run()
303 actual_record = bt_cls.results.passed[0]
304 my_mock.assert_called_once_with("teardown_test")
305 self.assertEqual(actual_record.test_name, self.mock_test_name)
306 self.assertIsNone(actual_record.details)
307 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700308 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700309 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 1, "
310 "Requested 1, Skipped 0, Unknown 0")
Ang Li4e899752016-07-28 13:25:48 -0700311 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
312
313 def test_teardown_test_executed_if_setup_test_fails(self):
314 my_mock = mock.MagicMock()
tturney0cda4c82016-11-23 15:06:14 -0800315
Ang Li4e899752016-07-28 13:25:48 -0700316 class MockBaseTest(base_test.BaseTestClass):
317 def setup_test(self):
318 raise Exception(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800319
Ang Li4e899752016-07-28 13:25:48 -0700320 def teardown_test(self):
321 my_mock("teardown_test")
tturney0cda4c82016-11-23 15:06:14 -0800322
Ang Li4e899752016-07-28 13:25:48 -0700323 def test_something(self):
324 pass
tturney0cda4c82016-11-23 15:06:14 -0800325
Ang Li4e899752016-07-28 13:25:48 -0700326 bt_cls = MockBaseTest(self.mock_test_cls_configs)
327 bt_cls.run()
328 actual_record = bt_cls.results.unknown[0]
329 my_mock.assert_called_once_with("teardown_test")
330 self.assertEqual(actual_record.test_name, self.mock_test_name)
331 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
332 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700333 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700334 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
335 "Requested 1, Skipped 0, Unknown 1")
Ang Li4e899752016-07-28 13:25:48 -0700336 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
337
338 def test_teardown_test_executed_if_test_fails(self):
339 my_mock = mock.MagicMock()
tturney0cda4c82016-11-23 15:06:14 -0800340
Ang Li4e899752016-07-28 13:25:48 -0700341 class MockBaseTest(base_test.BaseTestClass):
342 def teardown_test(self):
343 my_mock("teardown_test")
tturney0cda4c82016-11-23 15:06:14 -0800344
Ang Li4e899752016-07-28 13:25:48 -0700345 def test_something(self):
346 raise Exception(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800347
Ang Li4e899752016-07-28 13:25:48 -0700348 bt_cls = MockBaseTest(self.mock_test_cls_configs)
349 bt_cls.run()
350 actual_record = bt_cls.results.unknown[0]
351 my_mock.assert_called_once_with("teardown_test")
352 self.assertEqual(actual_record.test_name, self.mock_test_name)
353 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
354 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700355 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700356 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
357 "Requested 1, Skipped 0, Unknown 1")
Ang Li4e899752016-07-28 13:25:48 -0700358 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
359
360 def test_on_exception_executed_if_teardown_test_fails(self):
361 my_mock = mock.MagicMock()
tturney0cda4c82016-11-23 15:06:14 -0800362
Ang Li4e899752016-07-28 13:25:48 -0700363 class MockBaseTest(base_test.BaseTestClass):
364 def on_exception(self, test_name, begin_time):
365 my_mock("on_exception")
tturney0cda4c82016-11-23 15:06:14 -0800366
Ang Li4e899752016-07-28 13:25:48 -0700367 def teardown_test(self):
368 raise Exception(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800369
Ang Li4e899752016-07-28 13:25:48 -0700370 def test_something(self):
371 pass
tturney0cda4c82016-11-23 15:06:14 -0800372
Ang Li4e899752016-07-28 13:25:48 -0700373 bt_cls = MockBaseTest(self.mock_test_cls_configs)
374 bt_cls.run()
375 my_mock.assert_called_once_with("on_exception")
376 actual_record = bt_cls.results.unknown[0]
377 self.assertEqual(actual_record.test_name, self.mock_test_name)
378 self.assertIsNone(actual_record.details)
379 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700380 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700381 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
382 "Requested 1, Skipped 0, Unknown 1")
Ang Li4e899752016-07-28 13:25:48 -0700383 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
384
385 def test_on_fail_executed_if_test_fails(self):
386 my_mock = mock.MagicMock()
tturney0cda4c82016-11-23 15:06:14 -0800387
Ang Li4e899752016-07-28 13:25:48 -0700388 class MockBaseTest(base_test.BaseTestClass):
389 def on_fail(self, test_name, begin_time):
390 my_mock("on_fail")
tturney0cda4c82016-11-23 15:06:14 -0800391
Ang Li4e899752016-07-28 13:25:48 -0700392 def test_something(self):
393 asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800394
Ang Li4e899752016-07-28 13:25:48 -0700395 bt_cls = MockBaseTest(self.mock_test_cls_configs)
396 bt_cls.run()
397 my_mock.assert_called_once_with("on_fail")
398 actual_record = bt_cls.results.failed[0]
399 self.assertEqual(actual_record.test_name, self.mock_test_name)
400 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
401 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700402 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700403 "Blocked 0, ControllerInfo {}, Executed 1, Failed 1, Passed 0, "
404 "Requested 1, Skipped 0, Unknown 0")
Ang Li4e899752016-07-28 13:25:48 -0700405 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
406
407 def test_on_fail_executed_if_test_setup_fails_by_exception(self):
408 my_mock = mock.MagicMock()
tturney0cda4c82016-11-23 15:06:14 -0800409
Ang Li4e899752016-07-28 13:25:48 -0700410 class MockBaseTest(base_test.BaseTestClass):
411 def setup_test(self):
412 raise Exception(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800413
Ang Li4e899752016-07-28 13:25:48 -0700414 def on_fail(self, test_name, begin_time):
415 my_mock("on_fail")
tturney0cda4c82016-11-23 15:06:14 -0800416
Ang Li4e899752016-07-28 13:25:48 -0700417 def test_something(self):
418 pass
tturney0cda4c82016-11-23 15:06:14 -0800419
Ang Li4e899752016-07-28 13:25:48 -0700420 bt_cls = MockBaseTest(self.mock_test_cls_configs)
421 bt_cls.run()
422 my_mock.assert_called_once_with("on_fail")
423 actual_record = bt_cls.results.unknown[0]
424 self.assertEqual(actual_record.test_name, self.mock_test_name)
425 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
426 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700427 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700428 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
429 "Requested 1, Skipped 0, Unknown 1")
Ang Li4e899752016-07-28 13:25:48 -0700430 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
431
432 def test_on_fail_executed_if_test_setup_fails_by_return_False(self):
433 my_mock = mock.MagicMock()
tturney0cda4c82016-11-23 15:06:14 -0800434
Ang Li4e899752016-07-28 13:25:48 -0700435 class MockBaseTest(base_test.BaseTestClass):
436 def setup_test(self):
437 return False
tturney0cda4c82016-11-23 15:06:14 -0800438
Ang Li4e899752016-07-28 13:25:48 -0700439 def on_fail(self, test_name, begin_time):
440 my_mock("on_fail")
tturney0cda4c82016-11-23 15:06:14 -0800441
Ang Li4e899752016-07-28 13:25:48 -0700442 def test_something(self):
443 pass
tturney0cda4c82016-11-23 15:06:14 -0800444
Ang Li4e899752016-07-28 13:25:48 -0700445 bt_cls = MockBaseTest(self.mock_test_cls_configs)
446 bt_cls.run()
447 my_mock.assert_called_once_with("on_fail")
448 actual_record = bt_cls.results.failed[0]
449 self.assertEqual(actual_record.test_name, self.mock_test_name)
tturney0cda4c82016-11-23 15:06:14 -0800450 self.assertEqual(actual_record.details,
451 'Setup for test_something failed.')
Ang Li4e899752016-07-28 13:25:48 -0700452 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700453 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700454 "Blocked 0, ControllerInfo {}, Executed 1, Failed 1, Passed 0, "
455 "Requested 1, Skipped 0, Unknown 0")
Ang Li4e899752016-07-28 13:25:48 -0700456 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
457
458 def test_failure_to_call_procedure_function_is_recorded(self):
459 class MockBaseTest(base_test.BaseTestClass):
460 def on_fail(self):
461 pass
tturney0cda4c82016-11-23 15:06:14 -0800462
Ang Li4e899752016-07-28 13:25:48 -0700463 def test_something(self):
464 asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800465
Ang Li4e899752016-07-28 13:25:48 -0700466 bt_cls = MockBaseTest(self.mock_test_cls_configs)
467 bt_cls.run()
468 actual_record = bt_cls.results.unknown[0]
markdrf436a982017-11-08 13:15:34 -0800469 self.assertIn('_on_fail', actual_record.additional_errors)
Ang Li4e899752016-07-28 13:25:48 -0700470 self.assertEqual(actual_record.test_name, self.mock_test_name)
471 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
472 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700473 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700474 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
475 "Requested 1, Skipped 0, Unknown 1")
Ang Li4e899752016-07-28 13:25:48 -0700476 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
477
478 def test_failure_in_procedure_functions_is_recorded(self):
479 expected_msg = "Something failed in on_pass."
tturney0cda4c82016-11-23 15:06:14 -0800480
Ang Li4e899752016-07-28 13:25:48 -0700481 class MockBaseTest(base_test.BaseTestClass):
482 def on_pass(self, test_name, begin_time):
483 raise Exception(expected_msg)
tturney0cda4c82016-11-23 15:06:14 -0800484
Ang Li4e899752016-07-28 13:25:48 -0700485 def test_something(self):
486 asserts.explicit_pass(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800487
Ang Li4e899752016-07-28 13:25:48 -0700488 bt_cls = MockBaseTest(self.mock_test_cls_configs)
489 bt_cls.run()
490 actual_record = bt_cls.results.unknown[0]
491 expected_extra_error = {'_on_pass': expected_msg}
markdrf436a982017-11-08 13:15:34 -0800492 self.assertEqual(actual_record.additional_errors, expected_extra_error)
Ang Li4e899752016-07-28 13:25:48 -0700493 self.assertEqual(actual_record.test_name, self.mock_test_name)
494 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
495 self.assertIsNone(actual_record.extras)
markdrd55fded2017-04-10 11:13:09 -0700496 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700497 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
498 "Requested 1, Skipped 0, Unknown 1")
Ang Lia3e95922016-04-19 16:31:49 -0700499 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
500
Ang Lide97b662016-06-01 17:54:56 -0700501 def test_both_teardown_and_test_body_raise_exceptions(self):
502 class MockBaseTest(base_test.BaseTestClass):
503 def teardown_test(self):
504 asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800505
Ang Lide97b662016-06-01 17:54:56 -0700506 def test_something(self):
507 raise Exception("Test Body Exception.")
tturney0cda4c82016-11-23 15:06:14 -0800508
Ang Lide97b662016-06-01 17:54:56 -0700509 bt_cls = MockBaseTest(self.mock_test_cls_configs)
510 bt_cls.run()
511 actual_record = bt_cls.results.unknown[0]
512 self.assertEqual(actual_record.test_name, self.mock_test_name)
513 self.assertEqual(actual_record.details, "Test Body Exception.")
514 self.assertIsNone(actual_record.extras)
markdrf436a982017-11-08 13:15:34 -0800515 self.assertEqual(actual_record.additional_errors["teardown_test"],
Ang Lide97b662016-06-01 17:54:56 -0700516 "Details=This is an expected exception., Extras=None")
markdrd55fded2017-04-10 11:13:09 -0700517 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700518 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
519 "Requested 1, Skipped 0, Unknown 1")
Ang Lide97b662016-06-01 17:54:56 -0700520 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
521
522 def test_explicit_pass_but_teardown_test_raises_an_exception(self):
523 """Test record result should be marked as UNKNOWN as opposed to PASS.
524 """
tturney0cda4c82016-11-23 15:06:14 -0800525
Ang Lide97b662016-06-01 17:54:56 -0700526 class MockBaseTest(base_test.BaseTestClass):
527 def teardown_test(self):
528 asserts.assert_true(False, MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800529
Ang Lide97b662016-06-01 17:54:56 -0700530 def test_something(self):
531 asserts.explicit_pass("Test Passed!")
tturney0cda4c82016-11-23 15:06:14 -0800532
Ang Lide97b662016-06-01 17:54:56 -0700533 bt_cls = MockBaseTest(self.mock_test_cls_configs)
534 bt_cls.run()
535 actual_record = bt_cls.results.unknown[0]
536 self.assertEqual(actual_record.test_name, self.mock_test_name)
537 self.assertEqual(actual_record.details, "Test Passed!")
538 self.assertIsNone(actual_record.extras)
markdrf436a982017-11-08 13:15:34 -0800539 self.assertEqual(actual_record.additional_errors["teardown_test"],
Ang Lide97b662016-06-01 17:54:56 -0700540 "Details=This is an expected exception., Extras=None")
markdrd55fded2017-04-10 11:13:09 -0700541 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700542 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
543 "Requested 1, Skipped 0, Unknown 1")
Ang Lide97b662016-06-01 17:54:56 -0700544 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
545
Ang Lia3e95922016-04-19 16:31:49 -0700546 def test_on_pass_raise_exception(self):
547 class MockBaseTest(base_test.BaseTestClass):
548 def on_pass(self, test_name, begin_time):
549 raise Exception(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800550
Ang Lia3e95922016-04-19 16:31:49 -0700551 def test_something(self):
tturney0cda4c82016-11-23 15:06:14 -0800552 asserts.explicit_pass(
553 MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
554
Ang Lia3e95922016-04-19 16:31:49 -0700555 bt_cls = MockBaseTest(self.mock_test_cls_configs)
556 bt_cls.run()
557 actual_record = bt_cls.results.unknown[0]
558 self.assertEqual(actual_record.test_name, self.mock_test_name)
559 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
560 self.assertEqual(actual_record.extras, MOCK_EXTRA)
markdrf436a982017-11-08 13:15:34 -0800561 self.assertEqual(actual_record.additional_errors, {
562 '_on_pass': MSG_EXPECTED_EXCEPTION
563 })
markdrd55fded2017-04-10 11:13:09 -0700564 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700565 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
566 "Requested 1, Skipped 0, Unknown 1")
Ang Lia3e95922016-04-19 16:31:49 -0700567 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
568
569 def test_on_fail_raise_exception(self):
570 class MockBaseTest(base_test.BaseTestClass):
571 def on_fail(self, test_name, begin_time):
572 raise Exception(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800573
Ang Lia3e95922016-04-19 16:31:49 -0700574 def test_something(self):
575 asserts.fail(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
tturney0cda4c82016-11-23 15:06:14 -0800576
Ang Lia3e95922016-04-19 16:31:49 -0700577 bt_cls = MockBaseTest(self.mock_test_cls_configs)
578 bt_cls.run()
579 actual_record = bt_cls.results.unknown[0]
580 self.assertEqual(bt_cls.results.failed, [])
581 self.assertEqual(actual_record.test_name, self.mock_test_name)
582 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
583 self.assertEqual(actual_record.extras, MOCK_EXTRA)
markdrf436a982017-11-08 13:15:34 -0800584 self.assertEqual(actual_record.additional_errors, {
585 '_on_fail': MSG_EXPECTED_EXCEPTION
586 })
markdrd55fded2017-04-10 11:13:09 -0700587 expected_summary = (
Benny Peaked78717a2017-04-13 13:42:22 -0700588 "Blocked 0, ControllerInfo {}, Executed 1, Failed 0, Passed 0, "
589 "Requested 1, Skipped 0, Unknown 1")
Ang Lia3e95922016-04-19 16:31:49 -0700590 self.assertEqual(bt_cls.results.summary_str(), expected_summary)
591
Ang Lie57a38e2016-02-11 11:22:53 -0800592 def test_abort_class(self):
593 class MockBaseTest(base_test.BaseTestClass):
594 def test_1(self):
595 pass
tturney0cda4c82016-11-23 15:06:14 -0800596
Ang Lie57a38e2016-02-11 11:22:53 -0800597 def test_2(self):
Ang Li8893e6d2016-02-24 17:24:19 -0800598 asserts.abort_class(MSG_EXPECTED_EXCEPTION)
Ang Lie57a38e2016-02-11 11:22:53 -0800599 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800600
Ang Lie57a38e2016-02-11 11:22:53 -0800601 def test_3(self):
602 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800603
Ang Lie57a38e2016-02-11 11:22:53 -0800604 bt_cls = MockBaseTest(self.mock_test_cls_configs)
605 bt_cls.run(test_names=["test_1", "test_2", "test_3"])
tturney0cda4c82016-11-23 15:06:14 -0800606 self.assertEqual(bt_cls.results.passed[0].test_name, "test_1")
Ang Lif17f55f2016-02-24 17:02:52 -0800607 self.assertEqual(bt_cls.results.failed[0].details,
Ang Lie57a38e2016-02-11 11:22:53 -0800608 MSG_EXPECTED_EXCEPTION)
markdrf436a982017-11-08 13:15:34 -0800609 self.assertEqual(
610 bt_cls.results.summary_str(),
611 ("Blocked 0, ControllerInfo {}, Executed 2, Failed 1, Passed 1, "
612 "Requested 3, Skipped 0, Unknown 0"))
Ang Lie57a38e2016-02-11 11:22:53 -0800613
614 def test_uncaught_exception(self):
615 class MockBaseTest(base_test.BaseTestClass):
616 def test_func(self):
617 raise Exception(MSG_EXPECTED_EXCEPTION)
618 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800619
Ang Lie57a38e2016-02-11 11:22:53 -0800620 bt_cls = MockBaseTest(self.mock_test_cls_configs)
621 bt_cls.run(test_names=["test_func"])
622 actual_record = bt_cls.results.unknown[0]
623 self.assertEqual(actual_record.test_name, "test_func")
624 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
625 self.assertIsNone(actual_record.extras)
626
627 def test_fail(self):
628 class MockBaseTest(base_test.BaseTestClass):
629 def test_func(self):
Ang Li8893e6d2016-02-24 17:24:19 -0800630 asserts.fail(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
Ang Lie57a38e2016-02-11 11:22:53 -0800631 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800632
Ang Lie57a38e2016-02-11 11:22:53 -0800633 bt_cls = MockBaseTest(self.mock_test_cls_configs)
634 bt_cls.run(test_names=["test_func"])
635 actual_record = bt_cls.results.failed[0]
636 self.assertEqual(actual_record.test_name, "test_func")
637 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
638 self.assertEqual(actual_record.extras, MOCK_EXTRA)
639
640 def test_assert_true(self):
641 class MockBaseTest(base_test.BaseTestClass):
642 def test_func(self):
tturney0cda4c82016-11-23 15:06:14 -0800643 asserts.assert_true(
644 False, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
Ang Lie57a38e2016-02-11 11:22:53 -0800645 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800646
Ang Lie57a38e2016-02-11 11:22:53 -0800647 bt_cls = MockBaseTest(self.mock_test_cls_configs)
648 bt_cls.run(test_names=["test_func"])
649 actual_record = bt_cls.results.failed[0]
650 self.assertEqual(actual_record.test_name, "test_func")
651 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
652 self.assertEqual(actual_record.extras, MOCK_EXTRA)
653
Ang Li8893e6d2016-02-24 17:24:19 -0800654 def test_assert_equal_pass(self):
655 class MockBaseTest(base_test.BaseTestClass):
656 def test_func(self):
657 asserts.assert_equal(1, 1, extras=MOCK_EXTRA)
tturney0cda4c82016-11-23 15:06:14 -0800658
Ang Li8893e6d2016-02-24 17:24:19 -0800659 bt_cls = MockBaseTest(self.mock_test_cls_configs)
660 bt_cls.run()
661 actual_record = bt_cls.results.passed[0]
662 self.assertEqual(actual_record.test_name, "test_func")
663 self.assertIsNone(actual_record.details)
664 self.assertIsNone(actual_record.extras)
665
666 def test_assert_equal_fail(self):
667 class MockBaseTest(base_test.BaseTestClass):
668 def test_func(self):
669 asserts.assert_equal(1, 2, extras=MOCK_EXTRA)
tturney0cda4c82016-11-23 15:06:14 -0800670
Ang Li8893e6d2016-02-24 17:24:19 -0800671 bt_cls = MockBaseTest(self.mock_test_cls_configs)
672 bt_cls.run()
673 actual_record = bt_cls.results.failed[0]
674 self.assertEqual(actual_record.test_name, "test_func")
675 self.assertEqual(actual_record.details, "1 != 2")
676 self.assertEqual(actual_record.extras, MOCK_EXTRA)
677
678 def test_assert_equal_fail_with_msg(self):
679 class MockBaseTest(base_test.BaseTestClass):
680 def test_func(self):
tturney0cda4c82016-11-23 15:06:14 -0800681 asserts.assert_equal(
682 1, 2, msg=MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
683
Ang Li8893e6d2016-02-24 17:24:19 -0800684 bt_cls = MockBaseTest(self.mock_test_cls_configs)
685 bt_cls.run()
686 actual_record = bt_cls.results.failed[0]
687 self.assertEqual(actual_record.test_name, "test_func")
688 expected_msg = "1 != 2 " + MSG_EXPECTED_EXCEPTION
689 self.assertEqual(actual_record.details, expected_msg)
690 self.assertEqual(actual_record.extras, MOCK_EXTRA)
691
692 def test_assert_raises_pass(self):
693 class MockBaseTest(base_test.BaseTestClass):
694 def test_func(self):
695 with asserts.assert_raises(SomeError, extras=MOCK_EXTRA):
696 raise SomeError(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800697
Ang Li8893e6d2016-02-24 17:24:19 -0800698 bt_cls = MockBaseTest(self.mock_test_cls_configs)
699 bt_cls.run()
700 actual_record = bt_cls.results.passed[0]
701 self.assertEqual(actual_record.test_name, "test_func")
702 self.assertIsNone(actual_record.details)
703 self.assertIsNone(actual_record.extras)
704
705 def test_assert_raises_fail_with_noop(self):
706 class MockBaseTest(base_test.BaseTestClass):
707 def test_func(self):
708 with asserts.assert_raises(SomeError, extras=MOCK_EXTRA):
709 pass
tturney0cda4c82016-11-23 15:06:14 -0800710
Ang Li8893e6d2016-02-24 17:24:19 -0800711 bt_cls = MockBaseTest(self.mock_test_cls_configs)
712 bt_cls.run()
713 actual_record = bt_cls.results.failed[0]
714 self.assertEqual(actual_record.test_name, "test_func")
715 self.assertEqual(actual_record.details, "SomeError not raised")
716 self.assertEqual(actual_record.extras, MOCK_EXTRA)
717
718 def test_assert_raises_fail_with_wrong_error(self):
719 class MockBaseTest(base_test.BaseTestClass):
720 def test_func(self):
721 with asserts.assert_raises(SomeError, extras=MOCK_EXTRA):
722 raise AttributeError(MSG_UNEXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800723
Ang Li8893e6d2016-02-24 17:24:19 -0800724 bt_cls = MockBaseTest(self.mock_test_cls_configs)
725 bt_cls.run()
726 actual_record = bt_cls.results.unknown[0]
727 self.assertEqual(actual_record.test_name, "test_func")
728 self.assertEqual(actual_record.details, MSG_UNEXPECTED_EXCEPTION)
729 self.assertIsNone(actual_record.extras)
730
731 def test_assert_raises_regex_pass(self):
732 class MockBaseTest(base_test.BaseTestClass):
733 def test_func(self):
734 with asserts.assert_raises_regex(
735 SomeError,
736 expected_regex=MSG_EXPECTED_EXCEPTION,
737 extras=MOCK_EXTRA):
738 raise SomeError(MSG_EXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800739
Ang Li8893e6d2016-02-24 17:24:19 -0800740 bt_cls = MockBaseTest(self.mock_test_cls_configs)
741 bt_cls.run()
742 actual_record = bt_cls.results.passed[0]
743 self.assertEqual(actual_record.test_name, "test_func")
744 self.assertIsNone(actual_record.details)
745 self.assertIsNone(actual_record.extras)
746
747 def test_assert_raises_fail_with_noop(self):
748 class MockBaseTest(base_test.BaseTestClass):
749 def test_func(self):
750 with asserts.assert_raises_regex(
751 SomeError,
752 expected_regex=MSG_EXPECTED_EXCEPTION,
753 extras=MOCK_EXTRA):
754 pass
tturney0cda4c82016-11-23 15:06:14 -0800755
Ang Li8893e6d2016-02-24 17:24:19 -0800756 bt_cls = MockBaseTest(self.mock_test_cls_configs)
757 bt_cls.run()
758 actual_record = bt_cls.results.failed[0]
759 self.assertEqual(actual_record.test_name, "test_func")
760 self.assertEqual(actual_record.details, "SomeError not raised")
761 self.assertEqual(actual_record.extras, MOCK_EXTRA)
762
763 def test_assert_raises_fail_with_wrong_regex(self):
764 wrong_msg = "ha"
tturney0cda4c82016-11-23 15:06:14 -0800765
Ang Li8893e6d2016-02-24 17:24:19 -0800766 class MockBaseTest(base_test.BaseTestClass):
767 def test_func(self):
768 with asserts.assert_raises_regex(
769 SomeError,
770 expected_regex=MSG_EXPECTED_EXCEPTION,
771 extras=MOCK_EXTRA):
772 raise SomeError(wrong_msg)
tturney0cda4c82016-11-23 15:06:14 -0800773
Ang Li8893e6d2016-02-24 17:24:19 -0800774 bt_cls = MockBaseTest(self.mock_test_cls_configs)
775 bt_cls.run()
776 actual_record = bt_cls.results.failed[0]
777 self.assertEqual(actual_record.test_name, "test_func")
778 expected_details = ('"This is an expected exception." does not match '
779 '"%s"') % wrong_msg
780 self.assertEqual(actual_record.details, expected_details)
781 self.assertEqual(actual_record.extras, MOCK_EXTRA)
782
783 def test_assert_raises_fail_with_wrong_error(self):
784 class MockBaseTest(base_test.BaseTestClass):
785 def test_func(self):
786 with asserts.assert_raises_regex(
787 SomeError,
788 expected_regex=MSG_EXPECTED_EXCEPTION,
789 extras=MOCK_EXTRA):
790 raise AttributeError(MSG_UNEXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800791
Ang Li8893e6d2016-02-24 17:24:19 -0800792 bt_cls = MockBaseTest(self.mock_test_cls_configs)
793 bt_cls.run()
794 actual_record = bt_cls.results.unknown[0]
795 self.assertEqual(actual_record.test_name, "test_func")
796 self.assertEqual(actual_record.details, MSG_UNEXPECTED_EXCEPTION)
797 self.assertIsNone(actual_record.extras)
798
Ang Lie57a38e2016-02-11 11:22:53 -0800799 def test_explicit_pass(self):
800 class MockBaseTest(base_test.BaseTestClass):
801 def test_func(self):
tturney0cda4c82016-11-23 15:06:14 -0800802 asserts.explicit_pass(
803 MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
Ang Lie57a38e2016-02-11 11:22:53 -0800804 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800805
Ang Lie57a38e2016-02-11 11:22:53 -0800806 bt_cls = MockBaseTest(self.mock_test_cls_configs)
807 bt_cls.run(test_names=["test_func"])
808 actual_record = bt_cls.results.passed[0]
809 self.assertEqual(actual_record.test_name, "test_func")
810 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
811 self.assertEqual(actual_record.extras, MOCK_EXTRA)
812
813 def test_implicit_pass(self):
814 class MockBaseTest(base_test.BaseTestClass):
815 def test_func(self):
816 pass
tturney0cda4c82016-11-23 15:06:14 -0800817
Ang Lie57a38e2016-02-11 11:22:53 -0800818 bt_cls = MockBaseTest(self.mock_test_cls_configs)
819 bt_cls.run(test_names=["test_func"])
820 actual_record = bt_cls.results.passed[0]
821 self.assertEqual(actual_record.test_name, "test_func")
822 self.assertIsNone(actual_record.details)
823 self.assertIsNone(actual_record.extras)
824
825 def test_skip(self):
826 class MockBaseTest(base_test.BaseTestClass):
827 def test_func(self):
Ang Li8893e6d2016-02-24 17:24:19 -0800828 asserts.skip(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
Ang Lie57a38e2016-02-11 11:22:53 -0800829 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800830
Ang Lie57a38e2016-02-11 11:22:53 -0800831 bt_cls = MockBaseTest(self.mock_test_cls_configs)
832 bt_cls.run(test_names=["test_func"])
833 actual_record = bt_cls.results.skipped[0]
834 self.assertEqual(actual_record.test_name, "test_func")
835 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
836 self.assertEqual(actual_record.extras, MOCK_EXTRA)
837
838 def test_skip_if(self):
839 class MockBaseTest(base_test.BaseTestClass):
840 def test_func(self):
Ang Li8893e6d2016-02-24 17:24:19 -0800841 asserts.skip_if(False, MSG_UNEXPECTED_EXCEPTION)
tturney0cda4c82016-11-23 15:06:14 -0800842 asserts.skip_if(
843 True, MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
Ang Lie57a38e2016-02-11 11:22:53 -0800844 never_call()
tturney0cda4c82016-11-23 15:06:14 -0800845
Ang Lie57a38e2016-02-11 11:22:53 -0800846 bt_cls = MockBaseTest(self.mock_test_cls_configs)
847 bt_cls.run(test_names=["test_func"])
848 actual_record = bt_cls.results.skipped[0]
849 self.assertEqual(actual_record.test_name, "test_func")
850 self.assertEqual(actual_record.details, MSG_EXPECTED_EXCEPTION)
851 self.assertEqual(actual_record.extras, MOCK_EXTRA)
852
853 def test_unpack_userparams_required(self):
854 """Missing a required param should raise an error."""
Ang Li4c9fb262016-05-03 14:27:30 -0700855 required = ["some_param"]
856 bc = base_test.BaseTestClass(self.mock_test_cls_configs)
857 bc.unpack_userparams(required)
tturney0cda4c82016-11-23 15:06:14 -0800858 expected_value = self.mock_test_cls_configs["user_params"][
859 "some_param"]
Ang Li4c9fb262016-05-03 14:27:30 -0700860 self.assertEqual(bc.some_param, expected_value)
861
862 def test_unpack_userparams_required_missing(self):
863 """Missing a required param should raise an error."""
Ang Lie57a38e2016-02-11 11:22:53 -0800864 required = ["something"]
865 bc = base_test.BaseTestClass(self.mock_test_cls_configs)
866 expected_msg = ("Missing required user param '%s' in test "
867 "configuration.") % required[0]
Ang Li5d569fe2016-10-06 14:46:36 -0700868 with self.assertRaises(base_test.Error, msg=expected_msg):
Ang Lie57a38e2016-02-11 11:22:53 -0800869 bc.unpack_userparams(required)
870
871 def test_unpack_userparams_optional(self):
Ang Li4c9fb262016-05-03 14:27:30 -0700872 """If an optional param is specified, the value should be what's in the
873 config.
874 """
875 opt = ["some_param"]
876 bc = base_test.BaseTestClass(self.mock_test_cls_configs)
877 bc.unpack_userparams(opt_param_names=opt)
tturney0cda4c82016-11-23 15:06:14 -0800878 expected_value = self.mock_test_cls_configs["user_params"][
879 "some_param"]
Ang Li4c9fb262016-05-03 14:27:30 -0700880 self.assertEqual(bc.some_param, expected_value)
881
882 def test_unpack_userparams_optional_with_default(self):
883 """If an optional param is specified with a default value, and the
884 param is not in the config, the value should be the default value.
885 """
886 bc = base_test.BaseTestClass(self.mock_test_cls_configs)
887 bc.unpack_userparams(optional_thing="whatever")
888 self.assertEqual(bc.optional_thing, "whatever")
889
Ang Lif1855a72016-07-15 12:29:03 -0700890 def test_unpack_userparams_default_overwrite_by_optional_param_list(self):
891 """If an optional param is specified in kwargs, and the param is in the
892 config, the value should be the one in the config.
893 """
894 bc = base_test.BaseTestClass(self.mock_test_cls_configs)
895 bc.unpack_userparams(some_param="whatever")
tturney0cda4c82016-11-23 15:06:14 -0800896 expected_value = self.mock_test_cls_configs["user_params"][
897 "some_param"]
Ang Lif1855a72016-07-15 12:29:03 -0700898 self.assertEqual(bc.some_param, expected_value)
899
900 def test_unpack_userparams_default_overwrite_by_required_param_list(self):
901 """If an optional param is specified in kwargs, the param is in the
902 required param list, and the param is not specified in the config, the
903 param's alue should be the default value and there should be no error
904 thrown.
905 """
906 bc = base_test.BaseTestClass(self.mock_test_cls_configs)
tturney0cda4c82016-11-23 15:06:14 -0800907 bc.unpack_userparams(
908 req_param_names=['a_kwarg_param'], a_kwarg_param="whatever")
Ang Lif1855a72016-07-15 12:29:03 -0700909 self.assertEqual(bc.a_kwarg_param, "whatever")
910
Ang Li4c9fb262016-05-03 14:27:30 -0700911 def test_unpack_userparams_optional_missing(self):
Ang Lie57a38e2016-02-11 11:22:53 -0800912 """Missing an optional param should not raise an error."""
913 opt = ["something"]
914 bc = base_test.BaseTestClass(self.mock_test_cls_configs)
915 bc.unpack_userparams(opt_param_names=opt)
916
917 def test_unpack_userparams_basic(self):
918 """Required and optional params are unpacked properly."""
919 required = ["something"]
920 optional = ["something_else"]
921 configs = dict(self.mock_test_cls_configs)
922 configs["user_params"]["something"] = 42
923 configs["user_params"]["something_else"] = 53
924 bc = base_test.BaseTestClass(configs)
tturney0cda4c82016-11-23 15:06:14 -0800925 bc.unpack_userparams(
926 req_param_names=required, opt_param_names=optional)
Ang Lie57a38e2016-02-11 11:22:53 -0800927 self.assertEqual(bc.something, 42)
928 self.assertEqual(bc.something_else, 53)
929
930 def test_unpack_userparams_default_overwrite(self):
931 default_arg_val = "haha"
932 actual_arg_val = "wawa"
933 arg_name = "arg1"
934 configs = dict(self.mock_test_cls_configs)
935 configs["user_params"][arg_name] = actual_arg_val
936 bc = base_test.BaseTestClass(configs)
tturney0cda4c82016-11-23 15:06:14 -0800937 bc.unpack_userparams(opt_param_names=[arg_name], arg1=default_arg_val)
Ang Lie57a38e2016-02-11 11:22:53 -0800938 self.assertEqual(bc.arg1, actual_arg_val)
939
940 def test_unpack_userparams_default_None(self):
941 bc = base_test.BaseTestClass(self.mock_test_cls_configs)
942 bc.unpack_userparams(arg1="haha")
943 self.assertEqual(bc.arg1, "haha")
944
945 def test_generated_tests(self):
946 """Execute code paths for generated test cases.
947
948 Three test cases are generated, each of them produces a different
949 result: one pass, one fail, and one skip.
950
951 This test verifies that the exact three tests are executed and their
952 results are reported correctly.
953 """
954 static_arg = "haha"
955 static_kwarg = "meh"
956 itrs = ["pass", "fail", "skip"]
tturney0cda4c82016-11-23 15:06:14 -0800957
Ang Lie57a38e2016-02-11 11:22:53 -0800958 class MockBaseTest(base_test.BaseTestClass):
959 def name_gen(self, setting, arg, special_arg=None):
960 return "test_%s_%s" % (setting, arg)
tturney0cda4c82016-11-23 15:06:14 -0800961
Ang Lie57a38e2016-02-11 11:22:53 -0800962 def logic(self, setting, arg, special_arg=None):
markdrd55fded2017-04-10 11:13:09 -0700963 asserts.assert_true(
964 setting in itrs,
965 ("%s is not in acceptable settings range %s") % (setting,
966 itrs))
Ang Li8893e6d2016-02-24 17:24:19 -0800967 asserts.assert_true(arg == static_arg,
tturney0cda4c82016-11-23 15:06:14 -0800968 "Expected %s, got %s" % (static_arg, arg))
969 asserts.assert_true(arg == static_arg, "Expected %s, got %s" %
970 (static_kwarg, special_arg))
Ang Lie57a38e2016-02-11 11:22:53 -0800971 if setting == "pass":
tturney0cda4c82016-11-23 15:06:14 -0800972 asserts.explicit_pass(
973 MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
Ang Lie57a38e2016-02-11 11:22:53 -0800974 elif setting == "fail":
Ang Li8893e6d2016-02-24 17:24:19 -0800975 asserts.fail(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
Ang Lie57a38e2016-02-11 11:22:53 -0800976 elif setting == "skip":
Ang Li8893e6d2016-02-24 17:24:19 -0800977 asserts.skip(MSG_EXPECTED_EXCEPTION, extras=MOCK_EXTRA)
tturney0cda4c82016-11-23 15:06:14 -0800978
Ang Lie57a38e2016-02-11 11:22:53 -0800979 @signals.generated_test
980 def test_func(self):
981 self.run_generated_testcases(
982 test_func=self.logic,
983 settings=itrs,
tturney0cda4c82016-11-23 15:06:14 -0800984 args=(static_arg, ),
985 name_func=self.name_gen)
986
Ang Lie57a38e2016-02-11 11:22:53 -0800987 bt_cls = MockBaseTest(self.mock_test_cls_configs)
988 bt_cls.run(test_names=["test_func"])
989 self.assertEqual(len(bt_cls.results.requested), 3)
990 pass_record = bt_cls.results.passed[0]
991 self.assertEqual(pass_record.test_name, "test_pass_%s" % static_arg)
992 self.assertEqual(pass_record.details, MSG_EXPECTED_EXCEPTION)
993 self.assertEqual(pass_record.extras, MOCK_EXTRA)
994 skip_record = bt_cls.results.skipped[0]
995 self.assertEqual(skip_record.test_name, "test_skip_%s" % static_arg)
996 self.assertEqual(skip_record.details, MSG_EXPECTED_EXCEPTION)
997 self.assertEqual(skip_record.extras, MOCK_EXTRA)
998 fail_record = bt_cls.results.failed[0]
999 self.assertEqual(fail_record.test_name, "test_fail_%s" % static_arg)
1000 self.assertEqual(fail_record.details, MSG_EXPECTED_EXCEPTION)
1001 self.assertEqual(fail_record.extras, MOCK_EXTRA)
1002
tturney0cda4c82016-11-23 15:06:14 -08001003
Ang Lie57a38e2016-02-11 11:22:53 -08001004if __name__ == "__main__":
markdrd55fded2017-04-10 11:13:09 -07001005 unittest.main()