1*800a58d9SAndroid Build Coastguard Worker# Copyright 2019 - The Android Open Source Project 2*800a58d9SAndroid Build Coastguard Worker# 3*800a58d9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*800a58d9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*800a58d9SAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*800a58d9SAndroid Build Coastguard Worker# 7*800a58d9SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*800a58d9SAndroid Build Coastguard Worker# 9*800a58d9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*800a58d9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*800a58d9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*800a58d9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*800a58d9SAndroid Build Coastguard Worker# limitations under the License. 14*800a58d9SAndroid Build Coastguard Worker"""Tests for AdbTools.""" 15*800a58d9SAndroid Build Coastguard Worker 16*800a58d9SAndroid Build Coastguard Workerimport subprocess 17*800a58d9SAndroid Build Coastguard Workerimport unittest 18*800a58d9SAndroid Build Coastguard Worker 19*800a58d9SAndroid Build Coastguard Workerfrom unittest import mock 20*800a58d9SAndroid Build Coastguard Worker 21*800a58d9SAndroid Build Coastguard Workerfrom acloud import errors 22*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import adb_tools 23*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import driver_test_lib 24*800a58d9SAndroid Build Coastguard Worker 25*800a58d9SAndroid Build Coastguard Worker 26*800a58d9SAndroid Build Coastguard Workerclass AdbToolsTest(driver_test_lib.BaseDriverTest): 27*800a58d9SAndroid Build Coastguard Worker """Test adb functions.""" 28*800a58d9SAndroid Build Coastguard Worker DEVICE_ALIVE = ("List of devices attached\n" 29*800a58d9SAndroid Build Coastguard Worker "127.0.0.1:48451 device product:aosp_cf_x86_phone " 30*800a58d9SAndroid Build Coastguard Worker "model:Cuttlefish_x86_phone device:vsoc_x86 " 31*800a58d9SAndroid Build Coastguard Worker "transport_id:98").encode() 32*800a58d9SAndroid Build Coastguard Worker DEVICE_OFFLINE = ("List of devices attached\n" 33*800a58d9SAndroid Build Coastguard Worker "127.0.0.1:48451 offline").encode() 34*800a58d9SAndroid Build Coastguard Worker DEVICE_STATE_ONLY = ("List of devices attached\n" 35*800a58d9SAndroid Build Coastguard Worker "127.0.0.1:48451\toffline\n" 36*800a58d9SAndroid Build Coastguard Worker "emulator-5554\tdevice\n").encode() 37*800a58d9SAndroid Build Coastguard Worker DEVICE_NONE = b"List of devices attached" 38*800a58d9SAndroid Build Coastguard Worker 39*800a58d9SAndroid Build Coastguard Worker def setUp(self): 40*800a58d9SAndroid Build Coastguard Worker """Patch the path to adb.""" 41*800a58d9SAndroid Build Coastguard Worker super().setUp() 42*800a58d9SAndroid Build Coastguard Worker self.Patch(adb_tools.AdbTools, "_adb_command", "path/adb") 43*800a58d9SAndroid Build Coastguard Worker 44*800a58d9SAndroid Build Coastguard Worker # pylint: disable=no-member 45*800a58d9SAndroid Build Coastguard Worker def testGetAdbConnectionStatus(self): 46*800a58d9SAndroid Build Coastguard Worker """Test get adb connection status.""" 47*800a58d9SAndroid Build Coastguard Worker fake_adb_port = "48451" 48*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_ALIVE) 49*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 50*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.GetAdbConnectionStatus(), "device") 51*800a58d9SAndroid Build Coastguard Worker 52*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_OFFLINE) 53*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 54*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.GetAdbConnectionStatus(), "offline") 55*800a58d9SAndroid Build Coastguard Worker 56*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_NONE) 57*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 58*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.GetAdbConnectionStatus(), None) 59*800a58d9SAndroid Build Coastguard Worker 60*800a58d9SAndroid Build Coastguard Worker def testGetAdbConnectionStatusFail(self): 61*800a58d9SAndroid Build Coastguard Worker """Test adb connect status fail.""" 62*800a58d9SAndroid Build Coastguard Worker fake_adb_port = None 63*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_NONE) 64*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 65*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.GetAdbConnectionStatus(), None) 66*800a58d9SAndroid Build Coastguard Worker 67*800a58d9SAndroid Build Coastguard Worker def testGetAdbInformation(self): 68*800a58d9SAndroid Build Coastguard Worker """Test get adb information.""" 69*800a58d9SAndroid Build Coastguard Worker fake_adb_port = "48451" 70*800a58d9SAndroid Build Coastguard Worker dict_device = {'product': 'aosp_cf_x86_phone', 71*800a58d9SAndroid Build Coastguard Worker 'usb': None, 72*800a58d9SAndroid Build Coastguard Worker 'adb_status': 'device', 73*800a58d9SAndroid Build Coastguard Worker 'device': 'vsoc_x86', 74*800a58d9SAndroid Build Coastguard Worker 'model': 'Cuttlefish_x86_phone', 75*800a58d9SAndroid Build Coastguard Worker 'transport_id': '98'} 76*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_ALIVE) 77*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 78*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.device_information, dict_device) 79*800a58d9SAndroid Build Coastguard Worker 80*800a58d9SAndroid Build Coastguard Worker dict_office = {'product': None, 81*800a58d9SAndroid Build Coastguard Worker 'usb': None, 82*800a58d9SAndroid Build Coastguard Worker 'adb_status': 'offline', 83*800a58d9SAndroid Build Coastguard Worker 'device': None, 84*800a58d9SAndroid Build Coastguard Worker 'model': None, 85*800a58d9SAndroid Build Coastguard Worker 'transport_id': None} 86*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_OFFLINE) 87*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 88*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.device_information, dict_office) 89*800a58d9SAndroid Build Coastguard Worker 90*800a58d9SAndroid Build Coastguard Worker dict_none = {'product': None, 91*800a58d9SAndroid Build Coastguard Worker 'usb': None, 92*800a58d9SAndroid Build Coastguard Worker 'adb_status': None, 93*800a58d9SAndroid Build Coastguard Worker 'device': None, 94*800a58d9SAndroid Build Coastguard Worker 'model': None, 95*800a58d9SAndroid Build Coastguard Worker 'transport_id': None} 96*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_NONE) 97*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 98*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.device_information, dict_none) 99*800a58d9SAndroid Build Coastguard Worker 100*800a58d9SAndroid Build Coastguard Worker # pylint: disable=protected-access 101*800a58d9SAndroid Build Coastguard Worker def testSetDeviceSerial(self): 102*800a58d9SAndroid Build Coastguard Worker """Test SetDeviceSerial.""" 103*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_ALIVE) 104*800a58d9SAndroid Build Coastguard Worker adb_port = "6666" 105*800a58d9SAndroid Build Coastguard Worker adb_tool = adb_tools.AdbTools(adb_port) 106*800a58d9SAndroid Build Coastguard Worker expected_result = "127.0.0.1:6666" 107*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_tool._device_address, expected_result) 108*800a58d9SAndroid Build Coastguard Worker 109*800a58d9SAndroid Build Coastguard Worker serial = "0.0.0.0:6520" 110*800a58d9SAndroid Build Coastguard Worker adb_tool = adb_tools.AdbTools(device_serial=serial) 111*800a58d9SAndroid Build Coastguard Worker expected_result = "0.0.0.0:6520" 112*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_tool._device_address, expected_result) 113*800a58d9SAndroid Build Coastguard Worker 114*800a58d9SAndroid Build Coastguard Worker def testGetDeviceSerials(self): 115*800a58d9SAndroid Build Coastguard Worker """Test parsing the output of adb devices.""" 116*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", 117*800a58d9SAndroid Build Coastguard Worker return_value=self.DEVICE_STATE_ONLY) 118*800a58d9SAndroid Build Coastguard Worker serials = adb_tools.AdbTools.GetDeviceSerials() 119*800a58d9SAndroid Build Coastguard Worker self.assertEqual(serials, ["127.0.0.1:48451", "emulator-5554"]) 120*800a58d9SAndroid Build Coastguard Worker 121*800a58d9SAndroid Build Coastguard Worker # pylint: disable=no-member,protected-access 122*800a58d9SAndroid Build Coastguard Worker def testConnectAdb(self): 123*800a58d9SAndroid Build Coastguard Worker """Test connect adb.""" 124*800a58d9SAndroid Build Coastguard Worker fake_adb_port = "48451" 125*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_ALIVE) 126*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_call", return_value=True) 127*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 128*800a58d9SAndroid Build Coastguard Worker adb_cmd.ConnectAdb() 129*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.IsAdbConnectionAlive(), True) 130*800a58d9SAndroid Build Coastguard Worker subprocess.check_call.assert_not_called() 131*800a58d9SAndroid Build Coastguard Worker 132*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_OFFLINE) 133*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_call", return_value=True) 134*800a58d9SAndroid Build Coastguard Worker subprocess.check_call.call_count = 0 135*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 136*800a58d9SAndroid Build Coastguard Worker adb_cmd.ConnectAdb() 137*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.IsAdbConnectionAlive(), False) 138*800a58d9SAndroid Build Coastguard Worker subprocess.check_call.assert_called_with([adb_cmd._adb_command, 139*800a58d9SAndroid Build Coastguard Worker adb_tools._ADB_CONNECT, 140*800a58d9SAndroid Build Coastguard Worker adb_cmd._device_serial]) 141*800a58d9SAndroid Build Coastguard Worker 142*800a58d9SAndroid Build Coastguard Worker # pylint: disable=no-member,protected-access 143*800a58d9SAndroid Build Coastguard Worker def testDisconnectAdb(self): 144*800a58d9SAndroid Build Coastguard Worker """Test disconnect adb.""" 145*800a58d9SAndroid Build Coastguard Worker fake_adb_port = "48451" 146*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_ALIVE) 147*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_call", return_value=True) 148*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 149*800a58d9SAndroid Build Coastguard Worker 150*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.IsAdbConnected(), True) 151*800a58d9SAndroid Build Coastguard Worker subprocess.check_call.assert_not_called() 152*800a58d9SAndroid Build Coastguard Worker 153*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", side_effect=[self.DEVICE_OFFLINE, 154*800a58d9SAndroid Build Coastguard Worker self.DEVICE_NONE]) 155*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_call", return_value=True) 156*800a58d9SAndroid Build Coastguard Worker subprocess.check_call.call_count = 0 157*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 158*800a58d9SAndroid Build Coastguard Worker adb_cmd.DisconnectAdb() 159*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.IsAdbConnected(), False) 160*800a58d9SAndroid Build Coastguard Worker subprocess.check_call.assert_called_with([adb_cmd._adb_command, 161*800a58d9SAndroid Build Coastguard Worker adb_tools._ADB_DISCONNECT, 162*800a58d9SAndroid Build Coastguard Worker adb_cmd._device_serial]) 163*800a58d9SAndroid Build Coastguard Worker 164*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_NONE) 165*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_call", return_value=True) 166*800a58d9SAndroid Build Coastguard Worker subprocess.check_call.call_count = 0 167*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 168*800a58d9SAndroid Build Coastguard Worker adb_cmd.DisconnectAdb() 169*800a58d9SAndroid Build Coastguard Worker self.assertEqual(adb_cmd.IsAdbConnected(), False) 170*800a58d9SAndroid Build Coastguard Worker subprocess.check_call.assert_not_called() 171*800a58d9SAndroid Build Coastguard Worker 172*800a58d9SAndroid Build Coastguard Worker # test raise error if adb still alive after disconnect 173*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_OFFLINE) 174*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_call", return_value=True) 175*800a58d9SAndroid Build Coastguard Worker subprocess.check_call.call_count = 0 176*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(fake_adb_port) 177*800a58d9SAndroid Build Coastguard Worker with self.assertRaises(errors.AdbDisconnectFailed): 178*800a58d9SAndroid Build Coastguard Worker adb_cmd.DisconnectAdb() 179*800a58d9SAndroid Build Coastguard Worker 180*800a58d9SAndroid Build Coastguard Worker def testEmuCommand(self): 181*800a58d9SAndroid Build Coastguard Worker """Test emu command.""" 182*800a58d9SAndroid Build Coastguard Worker fake_adb_port = "48451" 183*800a58d9SAndroid Build Coastguard Worker fake_device_serial = "fake_device_serial" 184*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_output", return_value=self.DEVICE_NONE) 185*800a58d9SAndroid Build Coastguard Worker 186*800a58d9SAndroid Build Coastguard Worker mock_popen_obj = mock.Mock(returncode=1) 187*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "Popen", return_value=mock_popen_obj) 188*800a58d9SAndroid Build Coastguard Worker 189*800a58d9SAndroid Build Coastguard Worker adb_cmd = adb_tools.AdbTools(adb_port=fake_adb_port, 190*800a58d9SAndroid Build Coastguard Worker device_serial=fake_device_serial) 191*800a58d9SAndroid Build Coastguard Worker returncode = adb_cmd.EmuCommand("unit", "test") 192*800a58d9SAndroid Build Coastguard Worker self.assertEqual(returncode, 1) 193*800a58d9SAndroid Build Coastguard Worker subprocess.Popen.assert_called_once_with( 194*800a58d9SAndroid Build Coastguard Worker ["path/adb", "-s", "fake_device_serial", "emu", "unit", "test"], 195*800a58d9SAndroid Build Coastguard Worker stdin=subprocess.PIPE, 196*800a58d9SAndroid Build Coastguard Worker stdout=subprocess.PIPE, 197*800a58d9SAndroid Build Coastguard Worker stderr=subprocess.PIPE) 198*800a58d9SAndroid Build Coastguard Worker mock_popen_obj.communicate.assert_called_once_with() 199*800a58d9SAndroid Build Coastguard Worker 200*800a58d9SAndroid Build Coastguard Worker 201*800a58d9SAndroid Build Coastguard Workerif __name__ == "__main__": 202*800a58d9SAndroid Build Coastguard Worker unittest.main() 203