blob: e7df2c4379074aee81bd25e385732c998c457289 [file] [log] [blame]
markdrdd1893d2018-02-05 17:13:47 -08001#!/usr/bin/env python3
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -07002#
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 logging
Alexander Dorokhine018ec4d2016-03-14 12:04:40 -070018import mock
Ang Li5e494802016-02-26 18:10:26 -080019import os
Ang Lia5079ac2016-03-10 17:19:36 -080020import shutil
21import tempfile
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -070022import unittest
23
Betty Zhoud42223d2017-12-12 15:17:33 -080024from acts import logger
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -070025from acts.controllers import android_device
Xianyuan Jiac2415262019-01-07 15:37:35 -080026from acts.controllers.android_lib import errors
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -070027
Ang Li5e494802016-02-26 18:10:26 -080028# Mock log path for a test run.
29MOCK_LOG_PATH = "/tmp/logs/MockTest/xx-xx-xx_xx-xx-xx/"
markdr07cf9fd2018-02-12 21:02:57 -080030
Ang Li5e494802016-02-26 18:10:26 -080031# Mock start and end time of the adb cat.
Betty Zhoud42223d2017-12-12 15:17:33 -080032MOCK_ADB_EPOCH_BEGIN_TIME = 191000123
Remi NGUYEN VANbcd01d32018-06-28 09:54:43 +090033MOCK_ADB_LOGCAT_BEGIN_TIME = logger.normalize_log_line_timestamp(
34 logger.epoch_to_log_line_timestamp(MOCK_ADB_EPOCH_BEGIN_TIME))
35MOCK_ADB_LOGCAT_END_TIME = "1970-01-02 21:22:02.000"
Ang Li5e494802016-02-26 18:10:26 -080036
markdrd0597952017-08-04 21:41:47 -070037MOCK_SERIAL = 1
Sean Sutherland0a1238b2017-11-21 12:29:51 -080038MOCK_RELEASE_BUILD_ID = "ABC1.123456.007"
39MOCK_DEV_BUILD_ID = "ABC-MR1"
40MOCK_NYC_BUILD_ID = "N4F27P"
markdrd0597952017-08-04 21:41:47 -070041
Ang Lia33ae4e2016-06-27 15:08:53 -070042
Ang Li0b8fa842016-05-25 19:02:16 -070043def get_mock_ads(num):
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -070044 """Generates a list of mock AndroidDevice objects.
45
46 The serial number of each device will be integer 0 through num - 1.
47
48 Args:
49 num: An integer that is the number of mock AndroidDevice objects to
50 create.
51 """
52 ads = []
53 for i in range(num):
Ang Lia33ae4e2016-06-27 15:08:53 -070054 ad = mock.MagicMock(name="AndroidDevice", serial=i, h_port=None)
Betty Zhou15d17802017-07-26 16:03:51 -070055 ad.ensure_screen_on = mock.MagicMock(return_value=True)
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -070056 ads.append(ad)
57 return ads
58
Ang Lia33ae4e2016-06-27 15:08:53 -070059
Ang Li0b8fa842016-05-25 19:02:16 -070060def mock_get_all_instances():
61 return get_mock_ads(5)
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -070062
Ang Lia33ae4e2016-06-27 15:08:53 -070063
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -070064def mock_list_adb_devices():
65 return [ad.serial for ad in get_mock_ads(5)]
66
Ang Lia33ae4e2016-06-27 15:08:53 -070067
markdrd0597952017-08-04 21:41:47 -070068class MockAdbProxy(object):
Ang Li5e494802016-02-26 18:10:26 -080069 """Mock class that swaps out calls to adb with mock calls."""
70
Sean Sutherland0a1238b2017-11-21 12:29:51 -080071 def __init__(self,
72 serial,
73 fail_br=False,
74 fail_br_before_N=False,
Mark De Ruyter1cf17a52018-04-19 12:24:43 -070075 build_id=MOCK_RELEASE_BUILD_ID,
Xianyuan Jiad6b2a632019-05-24 17:40:45 +000076 return_value=None):
Ang Li5e494802016-02-26 18:10:26 -080077 self.serial = serial
Ang Li2ffda552016-08-25 10:08:39 -070078 self.fail_br = fail_br
Ang Li7c31ce12016-09-12 18:28:52 -070079 self.fail_br_before_N = fail_br_before_N
Mark De Ruyter1cf17a52018-04-19 12:24:43 -070080 self.return_value = return_value
markdrd0597952017-08-04 21:41:47 -070081 self.return_multiple = False
Sean Sutherland0a1238b2017-11-21 12:29:51 -080082 self.build_id = build_id
Ang Li5e494802016-02-26 18:10:26 -080083
Betty Zhouca24a072017-02-07 12:31:15 -080084 def shell(self, params, ignore_status=False, timeout=60):
Ang Li5e494802016-02-26 18:10:26 -080085 if params == "id -u":
Betty Zhoue4fd3142016-12-06 11:22:33 -080086 return "root"
Ang Lidcad3632016-06-29 17:14:17 -070087 elif params == "bugreportz":
Ang Li2ffda552016-08-25 10:08:39 -070088 if self.fail_br:
Betty Zhoue4fd3142016-12-06 11:22:33 -080089 return "OMG I died!\n"
90 return "OK:/path/bugreport.zip\n"
Ang Li7c31ce12016-09-12 18:28:52 -070091 elif params == "bugreportz -v":
92 if self.fail_br_before_N:
Betty Zhoue4fd3142016-12-06 11:22:33 -080093 return "/system/bin/sh: bugreportz: not found"
94 return "1.1"
markdrd0597952017-08-04 21:41:47 -070095 else:
96 if self.return_multiple:
97 return self.return_value.pop(0)
98 else:
99 return self.return_value
Ang Li1d24f572016-10-17 18:41:44 -0700100
101 def getprop(self, params):
102 if params == "ro.build.id":
Sean Sutherland0a1238b2017-11-21 12:29:51 -0800103 return self.build_id
markdrad37f402017-11-14 12:27:01 -0800104 elif params == "ro.build.version.incremental":
105 return "123456789"
Ang Li1d24f572016-10-17 18:41:44 -0700106 elif params == "ro.build.type":
107 return "userdebug"
108 elif params == "ro.build.product" or params == "ro.product.name":
109 return "FakeModel"
110 elif params == "sys.boot_completed":
111 return "1"
Ang Li5e494802016-02-26 18:10:26 -0800112
Christopher Wileyf2d19562016-10-26 10:16:29 -0700113 def devices(self):
Betty Zhoue4fd3142016-12-06 11:22:33 -0800114 return "\t".join([str(self.serial), "device"])
Christopher Wileyf2d19562016-10-26 10:16:29 -0700115
Betty Zhouca24a072017-02-07 12:31:15 -0800116 def bugreport(self, params, timeout=android_device.BUG_REPORT_TIMEOUT):
Tom Turney07efec12017-06-20 19:32:38 +0000117 expected = os.path.join(
Xianyuan Jiad6b2a632019-05-24 17:40:45 +0000118 logging.log_path, "AndroidDevice%s" % self.serial,
Xianyuan Jia0e39e552019-01-24 17:17:47 -0800119 "AndroidDevice%s_%s.txt" %
Betty Zhoud42223d2017-12-12 15:17:33 -0800120 (self.serial,
121 logger.normalize_log_line_timestamp(MOCK_ADB_LOGCAT_BEGIN_TIME)))
Ang Lidcad3632016-06-29 17:14:17 -0700122 assert expected in params, "Expected '%s', got '%s'." % (expected,
Ang Li5e494802016-02-26 18:10:26 -0800123 params)
124
125 def __getattr__(self, name):
126 """All calls to the none-existent functions in adb proxy would
127 simply return the adb command string.
128 """
tturney0cda4c82016-11-23 15:06:14 -0800129
Betty Zhouca24a072017-02-07 12:31:15 -0800130 def adb_call(*args, **kwargs):
Ang Li5e494802016-02-26 18:10:26 -0800131 arg_str = ' '.join(str(elem) for elem in args)
132 return arg_str
Ang Lia33ae4e2016-06-27 15:08:53 -0700133
Ang Li5e494802016-02-26 18:10:26 -0800134 return adb_call
135
Ang Lia33ae4e2016-06-27 15:08:53 -0700136
Ang Li7f4c9462016-09-21 14:14:21 -0700137class MockFastbootProxy():
138 """Mock class that swaps out calls to adb with mock calls."""
139
140 def __init__(self, serial):
141 self.serial = serial
142
143 def devices(self):
Betty Zhoue4fd3142016-12-06 11:22:33 -0800144 return "xxxx\tdevice\nyyyy\tdevice"
Ang Li7f4c9462016-09-21 14:14:21 -0700145
146 def __getattr__(self, name):
147 def fastboot_call(*args):
148 arg_str = ' '.join(str(elem) for elem in args)
149 return arg_str
tturney0cda4c82016-11-23 15:06:14 -0800150
Ang Li7f4c9462016-09-21 14:14:21 -0700151 return fastboot_call
152
153
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -0700154class ActsAndroidDeviceTest(unittest.TestCase):
155 """This test class has unit tests for the implementation of everything
156 under acts.controllers.android_device.
157 """
158
Ang Lia5079ac2016-03-10 17:19:36 -0800159 def setUp(self):
Ang Lieb5e5052016-06-24 18:07:11 -0700160 # Set log_path to logging since acts logger setup is not called.
161 if not hasattr(logging, "log_path"):
162 setattr(logging, "log_path", "/tmp/logs")
163 # Creates a temp dir to be used by tests in this test class.
Ang Lia5079ac2016-03-10 17:19:36 -0800164 self.tmp_dir = tempfile.mkdtemp()
165
166 def tearDown(self):
167 """Removes the temp dir.
168 """
169 shutil.rmtree(self.tmp_dir)
170
Ang Li5e494802016-02-26 18:10:26 -0800171 # Tests for android_device module functions.
172 # These tests use mock AndroidDevice instances.
173
tturney0cda4c82016-11-23 15:06:14 -0800174 @mock.patch.object(
175 android_device, "get_all_instances", new=mock_get_all_instances)
176 @mock.patch.object(
177 android_device, "list_adb_devices", new=mock_list_adb_devices)
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -0700178 def test_create_with_pickup_all(self):
179 pick_all_token = android_device.ANDROID_DEVICE_PICK_ALL_TOKEN
Ang Lia11f2cf2016-05-05 11:54:40 -0700180 actual_ads = android_device.create(pick_all_token)
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -0700181 for actual, expected in zip(actual_ads, get_mock_ads(5)):
182 self.assertEqual(actual.serial, expected.serial)
183
184 def test_create_with_empty_config(self):
185 expected_msg = android_device.ANDROID_DEVICE_EMPTY_CONFIG_MSG
Xianyuan Jiac2415262019-01-07 15:37:35 -0800186 with self.assertRaisesRegex(errors.AndroidDeviceConfigError,
Betty Zhouca24a072017-02-07 12:31:15 -0800187 expected_msg):
Ang Lia11f2cf2016-05-05 11:54:40 -0700188 android_device.create([])
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -0700189
190 def test_create_with_not_list_config(self):
191 expected_msg = android_device.ANDROID_DEVICE_NOT_LIST_CONFIG_MSG
Xianyuan Jiac2415262019-01-07 15:37:35 -0800192 with self.assertRaisesRegex(errors.AndroidDeviceConfigError,
Betty Zhouca24a072017-02-07 12:31:15 -0800193 expected_msg):
Ang Lia11f2cf2016-05-05 11:54:40 -0700194 android_device.create("HAHA")
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -0700195
196 def test_get_device_success_with_serial(self):
197 ads = get_mock_ads(5)
198 expected_serial = 0
199 ad = android_device.get_device(ads, serial=expected_serial)
200 self.assertEqual(ad.serial, expected_serial)
201
202 def test_get_device_success_with_serial_and_extra_field(self):
203 ads = get_mock_ads(5)
204 expected_serial = 1
205 expected_h_port = 5555
206 ads[1].h_port = expected_h_port
tturney0cda4c82016-11-23 15:06:14 -0800207 ad = android_device.get_device(
208 ads, serial=expected_serial, h_port=expected_h_port)
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -0700209 self.assertEqual(ad.serial, expected_serial)
210 self.assertEqual(ad.h_port, expected_h_port)
211
212 def test_get_device_no_match(self):
213 ads = get_mock_ads(5)
214 expected_msg = ("Could not find a target device that matches condition"
215 ": {'serial': 5}.")
Mark De Ruyter8e627fe2018-07-11 16:10:20 -0700216 with self.assertRaisesRegex(ValueError, expected_msg):
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -0700217 ad = android_device.get_device(ads, serial=len(ads))
218
219 def test_get_device_too_many_matches(self):
220 ads = get_mock_ads(5)
221 target_serial = ads[1].serial = ads[0].serial
Ang Li5e494802016-02-26 18:10:26 -0800222 expected_msg = "More than one device matched: \[0, 0\]"
Mark De Ruyter8e627fe2018-07-11 16:10:20 -0700223 with self.assertRaisesRegex(ValueError, expected_msg):
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -0700224 ad = android_device.get_device(ads, serial=target_serial)
225
Ang Liffe657b2016-07-11 19:52:28 -0700226 def test_start_services_on_ads(self):
227 """Makes sure when an AndroidDevice fails to start some services, all
228 AndroidDevice objects get cleaned up.
229 """
230 msg = "Some error happened."
231 ads = get_mock_ads(3)
232 ads[0].start_services = mock.MagicMock()
233 ads[0].clean_up = mock.MagicMock()
234 ads[1].start_services = mock.MagicMock()
235 ads[1].clean_up = mock.MagicMock()
236 ads[2].start_services = mock.MagicMock(
Xianyuan Jiac2415262019-01-07 15:37:35 -0800237 side_effect=errors.AndroidDeviceError(msg))
Ang Liffe657b2016-07-11 19:52:28 -0700238 ads[2].clean_up = mock.MagicMock()
Xianyuan Jiac2415262019-01-07 15:37:35 -0800239 with self.assertRaisesRegex(errors.AndroidDeviceError, msg):
Ang Liffe657b2016-07-11 19:52:28 -0700240 android_device._start_services_on_ads(ads)
241 ads[0].clean_up.assert_called_once_with()
242 ads[1].clean_up.assert_called_once_with()
243 ads[2].clean_up.assert_called_once_with()
244
Ang Li5e494802016-02-26 18:10:26 -0800245 # Tests for android_device.AndroidDevice class.
246 # These tests mock out any interaction with the OS and real android device
247 # in AndroidDeivce.
248
markdrd0597952017-08-04 21:41:47 -0700249 @mock.patch(
250 'acts.controllers.adb.AdbProxy',
251 return_value=MockAdbProxy(MOCK_SERIAL))
tturney0cda4c82016-11-23 15:06:14 -0800252 @mock.patch(
253 'acts.controllers.fastboot.FastbootProxy',
markdrd0597952017-08-04 21:41:47 -0700254 return_value=MockFastbootProxy(MOCK_SERIAL))
Ang Li7f4c9462016-09-21 14:14:21 -0700255 def test_AndroidDevice_instantiation(self, MockFastboot, MockAdbProxy):
Ang Li5e494802016-02-26 18:10:26 -0800256 """Verifies the AndroidDevice object's basic attributes are correctly
257 set after instantiation.
258 """
markdrd0597952017-08-04 21:41:47 -0700259 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
Ang Li5e494802016-02-26 18:10:26 -0800260 self.assertEqual(ad.serial, 1)
261 self.assertEqual(ad.model, "fakemodel")
262 self.assertIsNone(ad.adb_logcat_process)
Ang Li0b8fa842016-05-25 19:02:16 -0700263 expected_lp = os.path.join(logging.log_path,
markdrd0597952017-08-04 21:41:47 -0700264 "AndroidDevice%s" % MOCK_SERIAL)
Ang Li5e494802016-02-26 18:10:26 -0800265 self.assertEqual(ad.log_path, expected_lp)
266
markdrd0597952017-08-04 21:41:47 -0700267 @mock.patch(
268 'acts.controllers.adb.AdbProxy',
269 return_value=MockAdbProxy(MOCK_SERIAL))
tturney0cda4c82016-11-23 15:06:14 -0800270 @mock.patch(
271 'acts.controllers.fastboot.FastbootProxy',
markdrd0597952017-08-04 21:41:47 -0700272 return_value=MockFastbootProxy(MOCK_SERIAL))
markdrad37f402017-11-14 12:27:01 -0800273 def test_AndroidDevice_build_info_release(self, MockFastboot,
274 MockAdbProxy):
Betty Zhoud1dd8762016-10-07 17:02:09 -0700275 """Verifies the AndroidDevice object's basic attributes are correctly
276 set after instantiation.
277 """
278 ad = android_device.AndroidDevice(serial=1)
279 build_info = ad.build_info
markdrad37f402017-11-14 12:27:01 -0800280 self.assertEqual(build_info["build_id"], "ABC1.123456.007")
Betty Zhoud1dd8762016-10-07 17:02:09 -0700281 self.assertEqual(build_info["build_type"], "userdebug")
282
markdrd0597952017-08-04 21:41:47 -0700283 @mock.patch(
284 'acts.controllers.adb.AdbProxy',
Sean Sutherland0a1238b2017-11-21 12:29:51 -0800285 return_value=MockAdbProxy(MOCK_SERIAL, build_id=MOCK_DEV_BUILD_ID))
tturney0cda4c82016-11-23 15:06:14 -0800286 @mock.patch(
287 'acts.controllers.fastboot.FastbootProxy',
markdrd0597952017-08-04 21:41:47 -0700288 return_value=MockFastbootProxy(MOCK_SERIAL))
markdrad37f402017-11-14 12:27:01 -0800289 def test_AndroidDevice_build_info_dev(self, MockFastboot, MockAdbProxy):
290 """Verifies the AndroidDevice object's basic attributes are correctly
291 set after instantiation.
292 """
markdrad37f402017-11-14 12:27:01 -0800293 ad = android_device.AndroidDevice(serial=1)
markdrad37f402017-11-14 12:27:01 -0800294 build_info = ad.build_info
295 self.assertEqual(build_info["build_id"], "123456789")
296 self.assertEqual(build_info["build_type"], "userdebug")
Sean Sutherland0a1238b2017-11-21 12:29:51 -0800297
298 @mock.patch(
299 'acts.controllers.adb.AdbProxy',
300 return_value=MockAdbProxy(MOCK_SERIAL, build_id=MOCK_NYC_BUILD_ID))
301 @mock.patch(
302 'acts.controllers.fastboot.FastbootProxy',
303 return_value=MockFastbootProxy(MOCK_SERIAL))
304 def test_AndroidDevice_build_info_nyc(self, MockFastboot, MockAdbProxy):
305 """Verifies the AndroidDevice object's build id is set correctly for
306 NYC releases.
307 """
308 ad = android_device.AndroidDevice(serial=1)
309 build_info = ad.build_info
310 self.assertEqual(build_info["build_id"], MOCK_NYC_BUILD_ID)
markdrad37f402017-11-14 12:27:01 -0800311
312 @mock.patch(
313 'acts.controllers.adb.AdbProxy',
314 return_value=MockAdbProxy(MOCK_SERIAL))
315 @mock.patch(
316 'acts.controllers.fastboot.FastbootProxy',
317 return_value=MockFastbootProxy(MOCK_SERIAL))
Mark De Ruyter72f8df92020-02-12 13:44:49 -0800318 @mock.patch('os.makedirs')
Ang Li5e494802016-02-26 18:10:26 -0800319 @mock.patch('acts.utils.exe_cmd')
Omar El Ayach4dc80ab2019-07-31 16:52:29 -0700320 @mock.patch(
321 'acts.controllers.android_device.AndroidDevice.device_log_path',
322 new_callable=mock.PropertyMock)
Xianyuan Jia0e39e552019-01-24 17:17:47 -0800323 def test_AndroidDevice_take_bug_report(self, mock_log_path, exe_mock,
Mark De Ruyter72f8df92020-02-12 13:44:49 -0800324 mock_makedirs, FastbootProxy,
Xianyuan Jia0e39e552019-01-24 17:17:47 -0800325 MockAdbProxy):
Ang Li5e494802016-02-26 18:10:26 -0800326 """Verifies AndroidDevice.take_bug_report calls the correct adb command
327 and writes the bugreport file to the correct path.
328 """
markdrd0597952017-08-04 21:41:47 -0700329 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
Xianyuan Jia0e39e552019-01-24 17:17:47 -0800330 mock_log_path.return_value = os.path.join(
331 logging.log_path, "AndroidDevice%s" % ad.serial)
Xianyuan Jiad6b2a632019-05-24 17:40:45 +0000332 ad.take_bug_report("test_something", 234325.32)
Mark De Ruyter72f8df92020-02-12 13:44:49 -0800333 mock_makedirs.assert_called_with(mock_log_path(), exist_ok=True)
Ang Li5e494802016-02-26 18:10:26 -0800334
tturney0cda4c82016-11-23 15:06:14 -0800335 @mock.patch(
336 'acts.controllers.adb.AdbProxy',
markdrd0597952017-08-04 21:41:47 -0700337 return_value=MockAdbProxy(MOCK_SERIAL, fail_br=True))
tturney0cda4c82016-11-23 15:06:14 -0800338 @mock.patch(
339 'acts.controllers.fastboot.FastbootProxy',
markdrd0597952017-08-04 21:41:47 -0700340 return_value=MockFastbootProxy(MOCK_SERIAL))
Mark De Ruyter72f8df92020-02-12 13:44:49 -0800341 @mock.patch('os.makedirs')
Ang Li2ffda552016-08-25 10:08:39 -0700342 @mock.patch('acts.utils.exe_cmd')
Omar El Ayach4dc80ab2019-07-31 16:52:29 -0700343 @mock.patch(
344 'acts.controllers.android_device.AndroidDevice.device_log_path',
345 new_callable=mock.PropertyMock)
Mark De Ruyter72f8df92020-02-12 13:44:49 -0800346 def test_AndroidDevice_take_bug_report_fail(self, mock_log_path, *_):
Ang Li7c31ce12016-09-12 18:28:52 -0700347 """Verifies AndroidDevice.take_bug_report writes out the correct message
348 when taking bugreport fails.
Ang Li2ffda552016-08-25 10:08:39 -0700349 """
markdrd0597952017-08-04 21:41:47 -0700350 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
Xianyuan Jia0e39e552019-01-24 17:17:47 -0800351 mock_log_path.return_value = os.path.join(
352 logging.log_path, "AndroidDevice%s" % ad.serial)
Ang Li2ffda552016-08-25 10:08:39 -0700353 expected_msg = "Failed to take bugreport on 1: OMG I died!"
Omar El Ayach4dc80ab2019-07-31 16:52:29 -0700354 with self.assertRaisesRegex(errors.AndroidDeviceError, expected_msg):
Betty Zhoud42223d2017-12-12 15:17:33 -0800355 ad.take_bug_report("test_something", 4346343.23)
Ang Li2ffda552016-08-25 10:08:39 -0700356
tturney0cda4c82016-11-23 15:06:14 -0800357 @mock.patch(
358 'acts.controllers.adb.AdbProxy',
Xianyuan Jiad6b2a632019-05-24 17:40:45 +0000359 return_value=MockAdbProxy(MOCK_SERIAL, fail_br_before_N=True))
tturney0cda4c82016-11-23 15:06:14 -0800360 @mock.patch(
361 'acts.controllers.fastboot.FastbootProxy',
markdrd0597952017-08-04 21:41:47 -0700362 return_value=MockFastbootProxy(MOCK_SERIAL))
Mark De Ruyter72f8df92020-02-12 13:44:49 -0800363 @mock.patch('os.makedirs')
Ang Li7c31ce12016-09-12 18:28:52 -0700364 @mock.patch('acts.utils.exe_cmd')
Omar El Ayach4dc80ab2019-07-31 16:52:29 -0700365 @mock.patch(
366 'acts.controllers.android_device.AndroidDevice.device_log_path',
367 new_callable=mock.PropertyMock)
tturney0cda4c82016-11-23 15:06:14 -0800368 def test_AndroidDevice_take_bug_report_fallback(
Mark De Ruyter72f8df92020-02-12 13:44:49 -0800369 self, mock_log_path, exe_mock, mock_makedirs, FastbootProxy,
Xianyuan Jia0e39e552019-01-24 17:17:47 -0800370 MockAdbProxy):
Ang Li7c31ce12016-09-12 18:28:52 -0700371 """Verifies AndroidDevice.take_bug_report falls back to traditional
372 bugreport on builds that do not have bugreportz.
373 """
markdrd0597952017-08-04 21:41:47 -0700374 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
Xianyuan Jia0e39e552019-01-24 17:17:47 -0800375 mock_log_path.return_value = os.path.join(
376 logging.log_path, "AndroidDevice%s" % ad.serial)
Xianyuan Jiad6b2a632019-05-24 17:40:45 +0000377 ad.take_bug_report("test_something", MOCK_ADB_EPOCH_BEGIN_TIME)
Mark De Ruyter72f8df92020-02-12 13:44:49 -0800378 mock_makedirs.assert_called_with(mock_log_path(), exist_ok=True)
Ang Li7c31ce12016-09-12 18:28:52 -0700379
markdrd0597952017-08-04 21:41:47 -0700380 @mock.patch(
381 'acts.controllers.adb.AdbProxy',
382 return_value=MockAdbProxy(MOCK_SERIAL))
tturney0cda4c82016-11-23 15:06:14 -0800383 @mock.patch(
384 'acts.controllers.fastboot.FastbootProxy',
markdrd0597952017-08-04 21:41:47 -0700385 return_value=MockFastbootProxy(MOCK_SERIAL))
xianyuanjia129f4202018-12-03 12:25:11 -0800386 @mock.patch('acts.libs.proc.process.Process')
387 def test_AndroidDevice_start_adb_logcat(self, proc_mock, FastbootProxy,
388 MockAdbProxy):
389 """Verifies the AndroidDevice method start_adb_logcat. Checks that the
390 underlying logcat process is started properly and correct warning msgs
391 are generated.
Ang Lif6338132016-04-07 16:14:01 -0700392 """
Omar El Ayach4dc80ab2019-07-31 16:52:29 -0700393 with mock.patch(('acts.controllers.android_lib.logcat.'
394 'create_logcat_keepalive_process'),
395 return_value=proc_mock) as create_proc_mock:
xianyuanjia129f4202018-12-03 12:25:11 -0800396 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
Mark De Ruyter6e3f1462018-12-03 20:44:45 +0000397 ad.start_adb_logcat()
xianyuanjia129f4202018-12-03 12:25:11 -0800398 # Verify start did the correct operations.
399 self.assertTrue(ad.adb_logcat_process)
Xianyuan Jia9eb6b7d2019-05-07 11:12:11 -0700400 log_dir = "AndroidDevice%s" % ad.serial
Omar El Ayach4dc80ab2019-07-31 16:52:29 -0700401 create_proc_mock.assert_called_with(ad.serial, log_dir, '-b all')
xianyuanjia129f4202018-12-03 12:25:11 -0800402 proc_mock.start.assert_called_with()
403 # Expect warning msg if start is called back to back.
404 expected_msg = "Android device .* already has a running adb logcat"
405 proc_mock.is_running.return_value = True
406 with self.assertLogs(level='WARNING') as log:
407 ad.start_adb_logcat()
408 self.assertRegex(log.output[0], expected_msg)
Mark De Ruyter6e3f1462018-12-03 20:44:45 +0000409
410 @mock.patch(
411 'acts.controllers.adb.AdbProxy',
412 return_value=MockAdbProxy(MOCK_SERIAL))
413 @mock.patch(
414 'acts.controllers.fastboot.FastbootProxy',
415 return_value=MockFastbootProxy(MOCK_SERIAL))
xianyuanjia129f4202018-12-03 12:25:11 -0800416 @mock.patch('acts.controllers.android_lib.logcat.'
417 'create_logcat_keepalive_process')
418 def test_AndroidDevice_start_adb_logcat_with_user_param(
419 self, create_proc_mock, FastbootProxy, MockAdbProxy):
420 """Verifies that start_adb_logcat generates the correct adb logcat
421 command if adb_logcat_param is specified.
Mark De Ruyter6e3f1462018-12-03 20:44:45 +0000422 """
423 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
424 ad.adb_logcat_param = "-b radio"
xianyuanjia129f4202018-12-03 12:25:11 -0800425 ad.start_adb_logcat()
426 # Verify that create_logcat_keepalive_process is called with the
427 # correct command.
Xianyuan Jia9eb6b7d2019-05-07 11:12:11 -0700428 log_dir = "AndroidDevice%s" % ad.serial
Omar El Ayach4dc80ab2019-07-31 16:52:29 -0700429 create_proc_mock.assert_called_with(ad.serial, log_dir, '-b radio')
xianyuanjia129f4202018-12-03 12:25:11 -0800430
431 @mock.patch(
432 'acts.controllers.adb.AdbProxy',
433 return_value=MockAdbProxy(MOCK_SERIAL))
434 @mock.patch(
435 'acts.controllers.fastboot.FastbootProxy',
436 return_value=MockFastbootProxy(MOCK_SERIAL))
437 @mock.patch('acts.libs.proc.process.Process')
438 def test_AndroidDevice_stop_adb_logcat(self, proc_mock, FastbootProxy,
Omar El Ayach4dc80ab2019-07-31 16:52:29 -0700439 MockAdbProxy):
xianyuanjia129f4202018-12-03 12:25:11 -0800440 """Verifies the AndroidDevice method stop_adb_logcat. Checks that the
441 underlying logcat process is stopped properly and correct warning msgs
442 are generated.
443 """
444 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
445 ad.adb_logcat_process = proc_mock
Mark De Ruyter6e3f1462018-12-03 20:44:45 +0000446 # Expect warning msg if stop is called before start.
xianyuanjia129f4202018-12-03 12:25:11 -0800447 expected_msg = (
448 "Android device .* does not have an ongoing adb logcat")
449 proc_mock.is_running.return_value = False
Mark De Ruyter6e3f1462018-12-03 20:44:45 +0000450 with self.assertLogs(level='WARNING') as log:
451 ad.stop_adb_logcat()
452 self.assertRegex(log.output[0], expected_msg)
xianyuanjia129f4202018-12-03 12:25:11 -0800453
454 # Verify the underlying process is stopped.
455 proc_mock.is_running.return_value = True
456 ad.stop_adb_logcat()
457 proc_mock.stop.assert_called_with()
Ang Lif6338132016-04-07 16:14:01 -0700458
markdrd0597952017-08-04 21:41:47 -0700459 @mock.patch(
460 'acts.controllers.adb.AdbProxy',
461 return_value=MockAdbProxy(MOCK_SERIAL))
markdrd0597952017-08-04 21:41:47 -0700462 def test_get_apk_process_id_process_cannot_find(self, adb_proxy):
463 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
464 ad.adb.return_value = "does_not_contain_value"
465 self.assertEqual(None, ad.get_package_pid("some_package"))
466
467 @mock.patch(
468 'acts.controllers.adb.AdbProxy',
469 return_value=MockAdbProxy(MOCK_SERIAL))
470 def test_get_apk_process_id_process_exists_second_try(self, adb_proxy):
471 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
472 ad.adb.return_multiple = True
473 ad.adb.return_value = ["", "system 1 2 3 4 S com.some_package"]
474 self.assertEqual(1, ad.get_package_pid("some_package"))
475
476 @mock.patch(
477 'acts.controllers.adb.AdbProxy',
478 return_value=MockAdbProxy(MOCK_SERIAL))
479 def test_get_apk_process_id_bad_return(self, adb_proxy):
480 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
481 ad.adb.return_value = "bad_return_index_error"
482 self.assertEqual(None, ad.get_package_pid("some_package"))
483
484 @mock.patch(
485 'acts.controllers.adb.AdbProxy',
486 return_value=MockAdbProxy(MOCK_SERIAL))
487 def test_get_apk_process_id_bad_return(self, adb_proxy):
488 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
489 ad.adb.return_value = "bad return value error"
490 self.assertEqual(None, ad.get_package_pid("some_package"))
491
Omar El Ayach4dc80ab2019-07-31 16:52:29 -0700492 @mock.patch(
493 'acts.controllers.adb.AdbProxy',
494 return_value=MockAdbProxy(MOCK_SERIAL))
495 def test_ensure_verity_enabled_only_system_enabled(self, adb_proxy):
496 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
497 root_user_id = '0'
498
499 ad.adb.get_user_id = mock.MagicMock()
500 ad.adb.get_user_id.return_value = root_user_id
501
502 ad.adb.getprop = mock.MagicMock(side_effect=[
503 '', # system.verified
504 '2'
505 ]) # vendor.verified
506 ad.adb.ensure_user = mock.MagicMock()
507 ad.reboot = mock.MagicMock()
508 ad.ensure_verity_enabled()
509 ad.reboot.assert_called_once()
510
511 ad.adb.ensure_user.assert_called_with(root_user_id)
512
513 @mock.patch(
514 'acts.controllers.adb.AdbProxy',
515 return_value=MockAdbProxy(MOCK_SERIAL))
516 def test_ensure_verity_enabled_only_vendor_enabled(self, adb_proxy):
517 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
518 root_user_id = '0'
519
520 ad.adb.get_user_id = mock.MagicMock()
521 ad.adb.get_user_id.return_value = root_user_id
522
523 ad.adb.getprop = mock.MagicMock(side_effect=[
524 '2', # system.verified
525 ''
526 ]) # vendor.verified
527 ad.adb.ensure_user = mock.MagicMock()
528 ad.reboot = mock.MagicMock()
529
530 ad.ensure_verity_enabled()
531
532 ad.reboot.assert_called_once()
533 ad.adb.ensure_user.assert_called_with(root_user_id)
534
535 @mock.patch(
536 'acts.controllers.adb.AdbProxy',
537 return_value=MockAdbProxy(MOCK_SERIAL))
538 def test_ensure_verity_enabled_both_enabled_at_start(self, adb_proxy):
539 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
540 root_user_id = '0'
541
542 ad.adb.get_user_id = mock.MagicMock()
543 ad.adb.get_user_id.return_value = root_user_id
544
545 ad.adb.getprop = mock.MagicMock(side_effect=[
546 '2', # system.verified
547 '2'
548 ]) # vendor.verified
549 ad.adb.ensure_user = mock.MagicMock()
550 ad.reboot = mock.MagicMock()
551 ad.ensure_verity_enabled()
552
553 assert not ad.reboot.called
554
555 @mock.patch(
556 'acts.controllers.adb.AdbProxy',
557 return_value=MockAdbProxy(MOCK_SERIAL))
558 def test_ensure_verity_disabled_system_already_disabled(self, adb_proxy):
559 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
560 root_user_id = '0'
561
562 ad.adb.get_user_id = mock.MagicMock()
563 ad.adb.get_user_id.return_value = root_user_id
564
565 ad.adb.getprop = mock.MagicMock(side_effect=[
566 '2', # system.verified
567 ''
568 ]) # vendor.verified
569 ad.adb.ensure_user = mock.MagicMock()
570 ad.reboot = mock.MagicMock()
571 ad.ensure_verity_disabled()
572
573 ad.reboot.assert_called_once()
574
575 @mock.patch(
576 'acts.controllers.adb.AdbProxy',
577 return_value=MockAdbProxy(MOCK_SERIAL))
578 def test_ensure_verity_disabled_vendor_already_disabled(self, adb_proxy):
579 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
580 root_user_id = '0'
581
582 ad.adb.get_user_id = mock.MagicMock()
583 ad.adb.get_user_id.return_value = root_user_id
584
585 ad.adb.getprop = mock.MagicMock(side_effect=[
586 '', # system.verified
587 '2'
588 ]) # vendor.verified
589 ad.adb.ensure_user = mock.MagicMock()
590 ad.reboot = mock.MagicMock()
591
592 ad.ensure_verity_disabled()
593
594 ad.reboot.assert_called_once()
595 ad.adb.ensure_user.assert_called_with(root_user_id)
596
597 @mock.patch(
598 'acts.controllers.adb.AdbProxy',
599 return_value=MockAdbProxy(MOCK_SERIAL))
600 def test_ensure_verity_disabled_disabled_at_start(self, adb_proxy):
601 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
602 root_user_id = '0'
603
604 ad.adb.get_user_id = mock.MagicMock()
605 ad.adb.get_user_id.return_value = root_user_id
606
607 ad.adb.getprop = mock.MagicMock(side_effect=[
608 '', # system.verified
609 ''
610 ]) # vendor.verified
611 ad.adb.ensure_user = mock.MagicMock()
612 ad.reboot = mock.MagicMock()
613
614 ad.ensure_verity_disabled()
615
616 assert not ad.reboot.called
617
618 @mock.patch(
619 'acts.controllers.adb.AdbProxy',
620 return_value=MockAdbProxy(MOCK_SERIAL))
621 def test_push_system_file(self, adb_proxy):
622 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
623 ad.ensure_verity_disabled = mock.MagicMock()
624 ad.adb.remount = mock.MagicMock()
625 ad.adb.push = mock.MagicMock()
626
627 ret = ad.push_system_file('asdf', 'jkl')
628 self.assertTrue(ret)
629
630 @mock.patch(
631 'acts.controllers.adb.AdbProxy',
632 return_value=MockAdbProxy(MOCK_SERIAL))
633 def test_push_system_file_returns_false_on_error(self, adb_proxy):
634 ad = android_device.AndroidDevice(serial=MOCK_SERIAL)
635 ad.ensure_verity_disabled = mock.MagicMock()
636 ad.adb.remount = mock.MagicMock()
637 ad.adb.push = mock.MagicMock(return_value='error')
638
639 ret = ad.push_system_file('asdf', 'jkl')
640 self.assertFalse(ret)
641
Ang Lia33ae4e2016-06-27 15:08:53 -0700642
Alexander Dorokhine5eb366e2016-03-14 12:04:40 -0700643if __name__ == "__main__":
Ang Lia33ae4e2016-06-27 15:08:53 -0700644 unittest.main()