1#!/usr/bin/env python3.4 2# 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 17import mock 18import shutil 19import tempfile 20import unittest 21 22from acts import keys 23from acts import signals 24from acts import test_runner 25 26import acts_android_device_test 27import mock_controller 28 29 30class ActsTestRunnerTest(unittest.TestCase): 31 """This test class has unit tests for the implementation of everything 32 under acts.test_runner. 33 """ 34 35 def setUp(self): 36 self.tmp_dir = tempfile.mkdtemp() 37 self.base_mock_test_config = { 38 "testbed": { 39 "name": "SampleTestBed", 40 }, 41 "logpath": self.tmp_dir, 42 "cli_args": None, 43 "testpaths": ["./"], 44 "icecream": 42, 45 "extra_param": "haha" 46 } 47 self.mock_run_list = [('SampleTest', None)] 48 49 def tearDown(self): 50 shutil.rmtree(self.tmp_dir) 51 52 def test_register_controller_no_config(self): 53 tr = test_runner.TestRunner(self.base_mock_test_config, 54 self.mock_run_list) 55 with self.assertRaisesRegexp(signals.ControllerError, 56 "No corresponding config found for"): 57 tr.register_controller(mock_controller) 58 59 def test_register_optional_controller_no_config(self): 60 tr = test_runner.TestRunner(self.base_mock_test_config, 61 self.mock_run_list) 62 self.assertIsNone(tr.register_controller(mock_controller, 63 required=False)) 64 65 def test_register_controller_third_party_dup_register(self): 66 """Verifies correctness of registration, internal tally of controllers 67 objects, and the right error happen when a controller module is 68 registered twice. 69 """ 70 mock_test_config = dict(self.base_mock_test_config) 71 tb_key = keys.Config.key_testbed.value 72 mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME 73 mock_test_config[tb_key][mock_ctrlr_config_name] = ["magic1", "magic2"] 74 tr = test_runner.TestRunner(mock_test_config, self.mock_run_list) 75 tr.register_controller(mock_controller) 76 registered_name = "mock_controller" 77 self.assertTrue(registered_name in tr.controller_registry) 78 mock_ctrlrs = tr.controller_registry[registered_name] 79 self.assertEqual(mock_ctrlrs[0].magic, "magic1") 80 self.assertEqual(mock_ctrlrs[1].magic, "magic2") 81 self.assertTrue(tr.controller_destructors[registered_name]) 82 expected_msg = "Controller module .* has already been registered." 83 with self.assertRaisesRegexp(signals.ControllerError, expected_msg): 84 tr.register_controller(mock_controller) 85 86 def test_register_optional_controller_third_party_dup_register(self): 87 """Verifies correctness of registration, internal tally of controllers 88 objects, and the right error happen when an optional controller module 89 is registered twice. 90 """ 91 mock_test_config = dict(self.base_mock_test_config) 92 tb_key = keys.Config.key_testbed.value 93 mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME 94 mock_test_config[tb_key][mock_ctrlr_config_name] = ["magic1", "magic2"] 95 tr = test_runner.TestRunner(mock_test_config, self.mock_run_list) 96 tr.register_controller(mock_controller, required=False) 97 expected_msg = "Controller module .* has already been registered." 98 with self.assertRaisesRegexp(signals.ControllerError, expected_msg): 99 tr.register_controller(mock_controller, required=False) 100 101 def test_register_controller_builtin_dup_register(self): 102 """Same as test_register_controller_third_party_dup_register, except 103 this is for a builtin controller module. 104 """ 105 mock_test_config = dict(self.base_mock_test_config) 106 tb_key = keys.Config.key_testbed.value 107 mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME 108 mock_ref_name = "haha" 109 setattr(mock_controller, "ACTS_CONTROLLER_REFERENCE_NAME", 110 mock_ref_name) 111 try: 112 mock_ctrlr_ref_name = mock_controller.ACTS_CONTROLLER_REFERENCE_NAME 113 mock_test_config[tb_key][mock_ctrlr_config_name] = ["magic1", 114 "magic2"] 115 tr = test_runner.TestRunner(mock_test_config, self.mock_run_list) 116 tr.register_controller(mock_controller) 117 self.assertTrue(mock_ref_name in tr.test_run_info) 118 self.assertTrue(mock_ref_name in tr.controller_registry) 119 mock_ctrlrs = tr.test_run_info[mock_ctrlr_ref_name] 120 self.assertEqual(mock_ctrlrs[0].magic, "magic1") 121 self.assertEqual(mock_ctrlrs[1].magic, "magic2") 122 self.assertTrue(tr.controller_destructors[mock_ctrlr_ref_name]) 123 expected_msg = "Controller module .* has already been registered." 124 with self.assertRaisesRegexp(signals.ControllerError, 125 expected_msg): 126 tr.register_controller(mock_controller) 127 finally: 128 delattr(mock_controller, "ACTS_CONTROLLER_REFERENCE_NAME") 129 130 def test_register_controller_return_value(self): 131 mock_test_config = dict(self.base_mock_test_config) 132 tb_key = keys.Config.key_testbed.value 133 mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME 134 mock_test_config[tb_key][mock_ctrlr_config_name] = ["magic1", "magic2"] 135 tr = test_runner.TestRunner(mock_test_config, self.mock_run_list) 136 magic_devices = tr.register_controller(mock_controller) 137 self.assertEqual(magic_devices[0].magic, "magic1") 138 self.assertEqual(magic_devices[1].magic, "magic2") 139 140 def test_run_twice(self): 141 """Verifies that: 142 1. Repeated run works properly. 143 2. The original configuration is not altered if a test controller 144 module modifies configuration. 145 """ 146 mock_test_config = dict(self.base_mock_test_config) 147 tb_key = keys.Config.key_testbed.value 148 mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME 149 my_config = [{"serial": "xxxx", 150 "magic": "Magic1"}, {"serial": "xxxx", 151 "magic": "Magic2"}] 152 mock_test_config[tb_key][mock_ctrlr_config_name] = my_config 153 tr = test_runner.TestRunner(mock_test_config, [('IntegrationTest', 154 None)]) 155 tr.run() 156 self.assertFalse(tr.controller_registry) 157 self.assertFalse(tr.controller_destructors) 158 self.assertTrue(mock_test_config[tb_key][mock_ctrlr_config_name][0]) 159 tr.run() 160 tr.stop() 161 self.assertFalse(tr.controller_registry) 162 self.assertFalse(tr.controller_destructors) 163 results = tr.results.summary_dict() 164 self.assertEqual(results["Requested"], 2) 165 self.assertEqual(results["Executed"], 2) 166 self.assertEqual(results["Passed"], 2) 167 168 @mock.patch('acts.controllers.adb.AdbProxy', 169 return_value=acts_android_device_test.MockAdbProxy(1)) 170 @mock.patch('acts.controllers.android_device.list_adb_devices', 171 return_value=["1"]) 172 @mock.patch('acts.controllers.android_device.get_all_instances', 173 return_value=acts_android_device_test.get_mock_ads(1)) 174 def test_run_two_test_classes(self, mock_adb, mock_list_adb, mock_get_all): 175 """Verifies that runing more than one test class in one test run works 176 proerly. 177 178 This requires using a built-in controller module. Using AndroidDevice 179 module since it has all the mocks needed already. 180 """ 181 mock_test_config = dict(self.base_mock_test_config) 182 tb_key = keys.Config.key_testbed.value 183 mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME 184 my_config = [{"serial": "xxxx", "magic": "Magic1"}, 185 {"serial": "xxxx", "magic": "Magic2"}] 186 mock_test_config[tb_key][mock_ctrlr_config_name] = my_config 187 mock_test_config[tb_key]["AndroidDevice"] = [ 188 {"serial": "1", "skip_sl4a": True}] 189 tr = test_runner.TestRunner(mock_test_config, 190 [('IntegrationTest', None), ('IntegrationTest', None)]) 191 tr.run() 192 tr.stop() 193 self.assertFalse(tr.controller_registry) 194 self.assertFalse(tr.controller_destructors) 195 results = tr.results.summary_dict() 196 self.assertEqual(results["Requested"], 2) 197 self.assertEqual(results["Executed"], 2) 198 self.assertEqual(results["Passed"], 2) 199 200 def test_verify_controller_module(self): 201 test_runner.TestRunner.verify_controller_module(mock_controller) 202 203 def test_verify_controller_module_null_attr(self): 204 try: 205 tmp = mock_controller.ACTS_CONTROLLER_CONFIG_NAME 206 mock_controller.ACTS_CONTROLLER_CONFIG_NAME = None 207 msg = "Controller interface .* in .* cannot be null." 208 with self.assertRaisesRegexp(signals.ControllerError, msg): 209 test_runner.TestRunner.verify_controller_module( 210 mock_controller) 211 finally: 212 mock_controller.ACTS_CONTROLLER_CONFIG_NAME = tmp 213 214 def test_verify_controller_module_missing_attr(self): 215 try: 216 tmp = mock_controller.ACTS_CONTROLLER_CONFIG_NAME 217 delattr(mock_controller, "ACTS_CONTROLLER_CONFIG_NAME") 218 msg = "Module .* missing required controller module attribute" 219 with self.assertRaisesRegexp(signals.ControllerError, msg): 220 test_runner.TestRunner.verify_controller_module( 221 mock_controller) 222 finally: 223 setattr(mock_controller, "ACTS_CONTROLLER_CONFIG_NAME", tmp) 224 225 226if __name__ == "__main__": 227 unittest.main() 228