• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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