blob: 5b21ea9c608e4d7ded0f2234e35c27bbfd201ab8 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2016 - The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import mock
import shutil
import tempfile
import unittest
from acts import keys
from acts import signals
from acts import test_runner
import acts_android_device_test
import mock_controller
class ActsTestRunnerTest(unittest.TestCase):
"""This test class has unit tests for the implementation of everything
under acts.test_runner.
"""
def setUp(self):
self.tmp_dir = tempfile.mkdtemp()
self.base_mock_test_config = {
"testbed": {
"name": "SampleTestBed",
},
"logpath": self.tmp_dir,
"cli_args": None,
"testpaths": ["./"],
"icecream": 42,
"extra_param": "haha"
}
self.mock_run_list = [('SampleTest', None)]
def tearDown(self):
shutil.rmtree(self.tmp_dir)
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)
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_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(mock_controller in tr.controller_registry)
mock_ctrlrs = tr.controller_registry[mock_controller]
self.assertEqual(mock_ctrlrs[0].magic, "magic1")
self.assertEqual(mock_ctrlrs[1].magic, "magic2")
expected_msg = "Controller module .* has already been registered."
with self.assertRaisesRegexp(signals.ControllerError, expected_msg):
tr.register_controller(mock_controller)
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_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, builtin=True)
self.assertTrue(mock_ref_name in tr.test_run_info)
self.assertTrue(mock_controller 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")
expected_msg = "Controller module .* has already been registered."
with self.assertRaisesRegexp(signals.ControllerError,
expected_msg):
tr.register_controller(mock_controller, builtin=True)
finally:
delattr(mock_controller, "ACTS_CONTROLLER_REFERENCE_NAME")
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_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_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.assertTrue(mock_test_config[tb_key][mock_ctrlr_config_name][0])
tr.run()
tr.stop()
self.assertFalse(tr.controller_registry)
results = tr.results.summary_dict()
self.assertEqual(results["Requested"], 2)
self.assertEqual(results["Executed"], 2)
self.assertEqual(results["Passed"], 2)
expected_info = {
'MagicDevice': [{
'MyMagic': {
'magic': 'Magic1'
}
}, {
'MyMagic': {
'magic': 'Magic2'
}
}]
}
self.assertEqual(tr.results.controller_info, expected_info)
@mock.patch(
'acts.controllers.adb.AdbProxy',
return_value=acts_android_device_test.MockAdbProxy(1))
@mock.patch(
'acts.controllers.fastboot.FastbootProxy',
return_value=acts_android_device_test.MockFastbootProxy(1))
@mock.patch(
'acts.controllers.android_device.list_adb_devices', return_value=["1"])
@mock.patch(
'acts.controllers.android_device.get_all_instances',
return_value=acts_android_device_test.get_mock_ads(1))
@mock.patch(
'acts.controllers.android_device.AndroidDevice.ensure_screen_on',
return_value=True)
@mock.patch(
'acts.controllers.android_device.AndroidDevice.exit_setup_wizard',
return_value=True)
def test_run_two_test_classes(self, mock_exit_setup_wizard,
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)
results = tr.results.summary_dict()
self.assertEqual(results["Requested"], 2)
self.assertEqual(results["Executed"], 2)
self.assertEqual(results["Passed"], 2)
def test_verify_controller_module(self):
test_runner.TestRunner.verify_controller_module(mock_controller)
def test_verify_controller_module_null_attr(self):
try:
tmp = mock_controller.ACTS_CONTROLLER_CONFIG_NAME
mock_controller.ACTS_CONTROLLER_CONFIG_NAME = None
msg = "Controller interface .* in .* cannot be null."
with self.assertRaisesRegexp(signals.ControllerError, msg):
test_runner.TestRunner.verify_controller_module(
mock_controller)
finally:
mock_controller.ACTS_CONTROLLER_CONFIG_NAME = tmp
def test_verify_controller_module_missing_attr(self):
try:
tmp = mock_controller.ACTS_CONTROLLER_CONFIG_NAME
delattr(mock_controller, "ACTS_CONTROLLER_CONFIG_NAME")
msg = "Module .* missing required controller module attribute"
with self.assertRaisesRegexp(signals.ControllerError, msg):
test_runner.TestRunner.verify_controller_module(
mock_controller)
finally:
setattr(mock_controller, "ACTS_CONTROLLER_CONFIG_NAME", tmp)
if __name__ == "__main__":
unittest.main()