def test_run_two_test_classes(self, *_): """Verifies that running more than one test class in one test run works properly. This requires using a built-in controller module. Using AndroidDevice module since it has all the mocks needed already. """ mock_test_config = self.base_mock_test_config.copy() tb_key = keys.Config.key_testbed.value mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME my_config = [{ 'serial': 'xxxx', 'magic': 'Magic1' }, { 'serial': 'xxxx', 'magic': 'Magic2' }] mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config mock_test_config.controller_configs['AndroidDevice'] = [{ 'serial': '1', 'skip_sl4a': True }] tr = test_runner.TestRunner(mock_test_config, [('IntegrationTest', None), ('IntegrationTest', None)]) tr.run() tr.stop() results = tr.results.summary_dict() self.assertEqual(results['Requested'], 2) self.assertEqual(results['Executed'], 2) self.assertEqual(results['Passed'], 2)
def test_run_two_test_classes(self, mock_ensure_screen_on, mock_get_all, mock_list_adb, mock_fastboot, mock_adb): """Verifies that runing more than one test class in one test run works proerly. This requires using a built-in controller module. Using AndroidDevice module since it has all the mocks needed already. """ mock_test_config = dict(self.base_mock_test_config) tb_key = keys.Config.key_testbed.value mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME my_config = [{ "serial": "xxxx", "magic": "Magic1" }, { "serial": "xxxx", "magic": "Magic2" }] mock_test_config[tb_key][mock_ctrlr_config_name] = my_config mock_test_config[tb_key]["AndroidDevice"] = [{ "serial": "1", "skip_sl4a": True }] tr = test_runner.TestRunner(mock_test_config, [('IntegrationTest', None), ('IntegrationTest', None)]) tr.run() tr.stop() self.assertFalse(tr.controller_registry) self.assertFalse(tr.controller_destructors) results = tr.results.summary_dict() self.assertEqual(results["Requested"], 2) self.assertEqual(results["Executed"], 2) self.assertEqual(results["Passed"], 2)
def test_run_twice(self): """Verifies that: 1. Repeated run works properly. 2. The original configuration is not altered if a test controller module modifies configuration. """ mock_test_config = self.base_mock_test_config.copy() tb_key = keys.Config.key_testbed.value mock_ctrlr_config_name = mock_controller.MOBLY_CONTROLLER_CONFIG_NAME my_config = [{ 'serial': 'xxxx', 'magic': 'Magic1' }, { 'serial': 'xxxx', 'magic': 'Magic2' }] mock_test_config.controller_configs[mock_ctrlr_config_name] = my_config tr = test_runner.TestRunner(mock_test_config, [('IntegrationTest', None)]) tr.run() tr.run() tr.stop() results = tr.results.summary_dict() self.assertEqual(results['Requested'], 2) self.assertEqual(results['Executed'], 2) self.assertEqual(results['Passed'], 2)
def test_register_controller_builtin_dup_register(self): """Same as test_register_controller_third_party_dup_register, except this is for a builtin controller module. """ mock_test_config = dict(self.base_mock_test_config) tb_key = keys.Config.key_testbed.value mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME mock_ref_name = "haha" setattr(mock_controller, "ACTS_CONTROLLER_REFERENCE_NAME", mock_ref_name) try: mock_ctrlr_ref_name = mock_controller.ACTS_CONTROLLER_REFERENCE_NAME mock_test_config[tb_key][mock_ctrlr_config_name] = [ "magic1", "magic2" ] tr = test_runner.TestRunner(mock_test_config, self.mock_run_list) tr.register_controller(mock_controller) self.assertTrue(mock_ref_name in tr.test_run_info) self.assertTrue(mock_ref_name in tr.controller_registry) mock_ctrlrs = tr.test_run_info[mock_ctrlr_ref_name] self.assertEqual(mock_ctrlrs[0].magic, "magic1") self.assertEqual(mock_ctrlrs[1].magic, "magic2") self.assertTrue(tr.controller_destructors[mock_ctrlr_ref_name]) expected_msg = "Controller module .* has already been registered." with self.assertRaisesRegexp(signals.ControllerError, expected_msg): tr.register_controller(mock_controller) finally: delattr(mock_controller, "ACTS_CONTROLLER_REFERENCE_NAME")
def test_run_twice(self): """Verifies that: 1. Repeated run works properly. 2. The original configuration is not altered if a test controller module modifies configuration. """ mock_test_config = dict(self.base_mock_test_config) tb_key = keys.Config.key_testbed.value mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME my_config = [{"serial": "xxxx", "magic": "Magic1"}, {"serial": "xxxx", "magic": "Magic2"}] mock_test_config[tb_key][mock_ctrlr_config_name] = my_config tr = test_runner.TestRunner(mock_test_config, [('IntegrationTest', None)]) tr.run() self.assertFalse(tr.controller_registry) self.assertFalse(tr.controller_destructors) self.assertTrue(mock_test_config[tb_key][mock_ctrlr_config_name][0]) tr.run() tr.stop() self.assertFalse(tr.controller_registry) self.assertFalse(tr.controller_destructors) results = tr.results.summary_dict() self.assertEqual(results["Requested"], 2) self.assertEqual(results["Executed"], 2) self.assertEqual(results["Passed"], 2)
def _run_with_test_logic(self, func): if hasattr(MockTest, MockTest.TEST_LOGIC_ATTR): delattr(MockTest, MockTest.TEST_LOGIC_ATTR) setattr(MockTest, MockTest.TEST_LOGIC_ATTR, func) self.test_runner = test_runner.TestRunner(self.MOCK_CONFIG, self.MOCK_TEST_RUN_LIST) self.test_runner.run(MockTest)
def test_register_controller_return_value(self): mock_test_config = dict(self.base_mock_test_config) tb_key = keys.Config.key_testbed.value mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME mock_test_config[tb_key][mock_ctrlr_config_name] = ["magic1", "magic2"] tr = test_runner.TestRunner(mock_test_config, self.mock_run_list) magic_devices = tr.register_controller(mock_controller) self.assertEqual(magic_devices[0].magic, "magic1") self.assertEqual(magic_devices[1].magic, "magic2")
def test_class_name_pattern_question_mark(self, *_): class_names = ['test_class_1', 'test_class_12'] pattern = 'test_class_?' tr = test_runner.TestRunner(self.base_mock_test_config, [(pattern, None)]) test_classes = self.create_test_classes(class_names) tr.import_test_modules = Mock(return_value=test_classes) tr.run() self.assertTrue(test_classes[class_names[0]].called) self.assertFalse(test_classes[class_names[1]].called)
def test_class_name_pattern_char_seq(self): class_names = ['test_class_1', 'test_class_2', 'test_class_3'] pattern = 'test_class_[1357]' tr = test_runner.TestRunner(self.base_mock_test_config, [(pattern, None)]) test_classes = self.create_test_classes(class_names) tr.import_test_modules = Mock(return_value=test_classes) tr.run() self.assertTrue(test_classes[class_names[0]].called) self.assertFalse(test_classes[class_names[1]].called) self.assertTrue(test_classes[class_names[2]].called)
def test_class_logpath_contains_proper_directory(self, logger_mock, *_): expected_timestamp = '1970-01-01_00-00-00-00-000000' logger_mock.get_log_file_timestamp.return_value = expected_timestamp tr = test_runner.TestRunner(self.base_mock_test_config, [('MockTest', None)]) mock_class = Mock() tr.import_test_modules = Mock(return_value={'MockTest': mock_class}) tr.run() self.assertEqual( mock_class.call_args_list[0][0][0].log_path, os.path.join(self.tmp_dir, self.base_mock_test_config.testbed_name, expected_timestamp))
def test_register_optional_controller_third_party_dup_register(self): """Verifies correctness of registration, internal tally of controllers objects, and the right error happen when an optional controller module is registered twice. """ mock_test_config = dict(self.base_mock_test_config) tb_key = keys.Config.key_testbed.value mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME mock_test_config[tb_key][mock_ctrlr_config_name] = ["magic1", "magic2"] tr = test_runner.TestRunner(mock_test_config, self.mock_run_list) tr.register_controller(mock_controller, required=False) expected_msg = "Controller module .* has already been registered." with self.assertRaisesRegexp(signals.ControllerError, expected_msg): tr.register_controller(mock_controller, required=False)
def test_register_controller_no_get_info(self): mock_test_config = dict(self.base_mock_test_config) tb_key = keys.Config.key_testbed.value mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME mock_ref_name = "haha" get_info = getattr(mock_controller, "get_info") delattr(mock_controller, "get_info") try: mock_test_config[tb_key][mock_ctrlr_config_name] = [ "magic1", "magic2" ] tr = test_runner.TestRunner(mock_test_config, self.mock_run_list) tr.register_controller(mock_controller) self.assertEqual(tr.results.controller_info, {}) finally: setattr(mock_controller, "get_info", get_info)
def test_register_controller_third_party_dup_register(self): """Verifies correctness of registration, internal tally of controllers objects, and the right error happen when a controller module is registered twice. """ mock_test_config = dict(self.base_mock_test_config) tb_key = keys.Config.key_testbed.value mock_ctrlr_config_name = mock_controller.ACTS_CONTROLLER_CONFIG_NAME mock_test_config[tb_key][mock_ctrlr_config_name] = ["magic1", "magic2"] tr = test_runner.TestRunner(mock_test_config, self.mock_run_list) tr.register_controller(mock_controller) registered_name = "mock_controller" self.assertTrue(registered_name in tr.controller_registry) mock_ctrlrs = tr.controller_registry[registered_name] self.assertEqual(mock_ctrlrs[0].magic, "magic1") self.assertEqual(mock_ctrlrs[1].magic, "magic2") self.assertTrue(tr.controller_destructors[registered_name]) expected_msg = "Controller module .* has already been registered." with self.assertRaisesRegexp(signals.ControllerError, expected_msg): tr.register_controller(mock_controller)
def _create_test_runner(parsed_config, test_identifiers): """Instantiates one test_runner.TestRunner object and register termination signal handlers that properly shut down the test_runner.TestRunner run. Args: parsed_config: A dict that is a set of configs for one test_runner.TestRunner. test_identifiers: A list of tuples, each identifies what test case to run on what test class. Returns: A test_runner.TestRunner object. """ try: t = test_runner.TestRunner(parsed_config, test_identifiers) except: print("Failed to instantiate test runner, abort.") print(traceback.format_exc()) sys.exit(1) # Register handler for termination signals. handler = config_parser.gen_term_signal_handler([t]) signal.signal(signal.SIGTERM, handler) signal.signal(signal.SIGINT, handler) return t
def test_register_optional_controller_no_config(self): tr = test_runner.TestRunner(self.base_mock_test_config, self.mock_run_list) self.assertIsNone( tr.register_controller(mock_controller, required=False))
def test_register_controller_no_config(self): tr = test_runner.TestRunner(self.base_mock_test_config, self.mock_run_list) with self.assertRaisesRegexp(signals.ControllerError, "No corresponding config found for"): tr.register_controller(mock_controller)