1*800a58d9SAndroid Build Coastguard Worker# Copyright 2018 - 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 reconnect.""" 15*800a58d9SAndroid Build Coastguard Worker 16*800a58d9SAndroid Build Coastguard Workerimport collections 17*800a58d9SAndroid Build Coastguard Workerimport unittest 18*800a58d9SAndroid Build Coastguard Workerimport subprocess 19*800a58d9SAndroid Build Coastguard Worker 20*800a58d9SAndroid Build Coastguard Workerfrom unittest import mock 21*800a58d9SAndroid Build Coastguard Worker 22*800a58d9SAndroid Build Coastguard Workerfrom acloud import errors 23*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal import constants 24*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import auth 25*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import android_compute_client 26*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import cvd_runtime_config 27*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import driver_test_lib 28*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import gcompute_client 29*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import utils 30*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import ssh as ssh_object 31*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib.adb_tools import AdbTools 32*800a58d9SAndroid Build Coastguard Workerfrom acloud.list import list as list_instance 33*800a58d9SAndroid Build Coastguard Workerfrom acloud.public import config 34*800a58d9SAndroid Build Coastguard Workerfrom acloud.reconnect import reconnect 35*800a58d9SAndroid Build Coastguard Worker 36*800a58d9SAndroid Build Coastguard Worker 37*800a58d9SAndroid Build Coastguard WorkerForwardedPorts = collections.namedtuple("ForwardedPorts", 38*800a58d9SAndroid Build Coastguard Worker [constants.VNC_PORT, constants.ADB_PORT]) 39*800a58d9SAndroid Build Coastguard Worker 40*800a58d9SAndroid Build Coastguard Worker 41*800a58d9SAndroid Build Coastguard Workerclass ReconnectTest(driver_test_lib.BaseDriverTest): 42*800a58d9SAndroid Build Coastguard Worker """Test reconnect functions.""" 43*800a58d9SAndroid Build Coastguard Worker 44*800a58d9SAndroid Build Coastguard Worker # pylint: disable=no-member, too-many-statements 45*800a58d9SAndroid Build Coastguard Worker def testReconnectInstance(self): 46*800a58d9SAndroid Build Coastguard Worker """Test Reconnect Instances.""" 47*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path = "/fake/acloud_rsa" 48*800a58d9SAndroid Build Coastguard Worker fake_report = mock.MagicMock() 49*800a58d9SAndroid Build Coastguard Worker instance_object = mock.MagicMock() 50*800a58d9SAndroid Build Coastguard Worker instance_object.name = "fake_name" 51*800a58d9SAndroid Build Coastguard Worker instance_object.ip = "1.1.1.1" 52*800a58d9SAndroid Build Coastguard Worker instance_object.islocal = False 53*800a58d9SAndroid Build Coastguard Worker instance_object.adb_port = "8686" 54*800a58d9SAndroid Build Coastguard Worker instance_object.avd_type = "cuttlefish" 55*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_call", return_value=True) 56*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "LaunchVncClient") 57*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "AutoConnect") 58*800a58d9SAndroid Build Coastguard Worker self.Patch(AdbTools, "IsAdbConnected", return_value=False) 59*800a58d9SAndroid Build Coastguard Worker self.Patch(AdbTools, "IsAdbConnectionAlive", return_value=False) 60*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "IsCommandRunning", return_value=False) 61*800a58d9SAndroid Build Coastguard Worker fake_device_dict = { 62*800a58d9SAndroid Build Coastguard Worker constants.IP: "1.1.1.1", 63*800a58d9SAndroid Build Coastguard Worker constants.INSTANCE_NAME: "fake_name", 64*800a58d9SAndroid Build Coastguard Worker constants.VNC_PORT: 6666, 65*800a58d9SAndroid Build Coastguard Worker constants.ADB_PORT: "8686", 66*800a58d9SAndroid Build Coastguard Worker constants.DEVICE_SERIAL: "127.0.0.1:8686" 67*800a58d9SAndroid Build Coastguard Worker } 68*800a58d9SAndroid Build Coastguard Worker 69*800a58d9SAndroid Build Coastguard Worker # test ssh tunnel not connected, remote instance. 70*800a58d9SAndroid Build Coastguard Worker instance_object.vnc_port = 6666 71*800a58d9SAndroid Build Coastguard Worker instance_object.display = "" 72*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.call_count = 0 73*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance( 74*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path, instance_object, fake_report, autoconnect="vnc") 75*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.assert_not_called() 76*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.assert_called_with(6666) 77*800a58d9SAndroid Build Coastguard Worker fake_report.AddData.assert_called_with(key="devices", value=fake_device_dict) 78*800a58d9SAndroid Build Coastguard Worker 79*800a58d9SAndroid Build Coastguard Worker instance_object.display = "888x777 (99)" 80*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.call_count = 0 81*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance( 82*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path, instance_object, fake_report, autoconnect="vnc") 83*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.assert_not_called() 84*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.assert_called_with(6666, "888", "777") 85*800a58d9SAndroid Build Coastguard Worker fake_report.AddData.assert_called_with(key="devices", value=fake_device_dict) 86*800a58d9SAndroid Build Coastguard Worker 87*800a58d9SAndroid Build Coastguard Worker # test ssh tunnel connected , remote instance. 88*800a58d9SAndroid Build Coastguard Worker instance_object.ssh_tunnel_is_connected = False 89*800a58d9SAndroid Build Coastguard Worker instance_object.display = "" 90*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.call_count = 0 91*800a58d9SAndroid Build Coastguard Worker instance_object.vnc_port = 5555 92*800a58d9SAndroid Build Coastguard Worker extra_args_ssh_tunnel = None 93*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "AutoConnect", 94*800a58d9SAndroid Build Coastguard Worker return_value=ForwardedPorts(vnc_port=11111, adb_port=22222)) 95*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance( 96*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path, instance_object, fake_report, autoconnect="vnc") 97*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.assert_called_with(ip_addr=instance_object.ip, 98*800a58d9SAndroid Build Coastguard Worker rsa_key_file=ssh_private_key_path, 99*800a58d9SAndroid Build Coastguard Worker target_vnc_port=constants.CF_VNC_PORT, 100*800a58d9SAndroid Build Coastguard Worker target_adb_port=constants.CF_ADB_PORT, 101*800a58d9SAndroid Build Coastguard Worker ssh_user=constants.GCE_USER, 102*800a58d9SAndroid Build Coastguard Worker extra_args_ssh_tunnel=extra_args_ssh_tunnel) 103*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.assert_called_with(11111) 104*800a58d9SAndroid Build Coastguard Worker fake_device_dict = { 105*800a58d9SAndroid Build Coastguard Worker constants.IP: "1.1.1.1", 106*800a58d9SAndroid Build Coastguard Worker constants.INSTANCE_NAME: "fake_name", 107*800a58d9SAndroid Build Coastguard Worker constants.VNC_PORT: 11111, 108*800a58d9SAndroid Build Coastguard Worker constants.ADB_PORT: 22222, 109*800a58d9SAndroid Build Coastguard Worker constants.DEVICE_SERIAL: "127.0.0.1:22222" 110*800a58d9SAndroid Build Coastguard Worker } 111*800a58d9SAndroid Build Coastguard Worker fake_report.AddData.assert_called_with(key="devices", value=fake_device_dict) 112*800a58d9SAndroid Build Coastguard Worker 113*800a58d9SAndroid Build Coastguard Worker instance_object.display = "999x777 (99)" 114*800a58d9SAndroid Build Coastguard Worker extra_args_ssh_tunnel = "fake_extra_args_ssh_tunnel" 115*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.call_count = 0 116*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance( 117*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path, instance_object, fake_report, 118*800a58d9SAndroid Build Coastguard Worker extra_args_ssh_tunnel=extra_args_ssh_tunnel, 119*800a58d9SAndroid Build Coastguard Worker autoconnect="vnc") 120*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.assert_called_with(ip_addr=instance_object.ip, 121*800a58d9SAndroid Build Coastguard Worker rsa_key_file=ssh_private_key_path, 122*800a58d9SAndroid Build Coastguard Worker target_vnc_port=constants.CF_VNC_PORT, 123*800a58d9SAndroid Build Coastguard Worker target_adb_port=constants.CF_ADB_PORT, 124*800a58d9SAndroid Build Coastguard Worker ssh_user=constants.GCE_USER, 125*800a58d9SAndroid Build Coastguard Worker extra_args_ssh_tunnel=extra_args_ssh_tunnel) 126*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.assert_called_with(11111, "999", "777") 127*800a58d9SAndroid Build Coastguard Worker fake_report.AddData.assert_called_with(key="devices", value=fake_device_dict) 128*800a58d9SAndroid Build Coastguard Worker 129*800a58d9SAndroid Build Coastguard Worker # test fail reconnect report. 130*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "AutoConnect", 131*800a58d9SAndroid Build Coastguard Worker return_value=ForwardedPorts(vnc_port=None, adb_port=None)) 132*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance( 133*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path, instance_object, fake_report, autoconnect="vnc") 134*800a58d9SAndroid Build Coastguard Worker fake_device_dict = { 135*800a58d9SAndroid Build Coastguard Worker constants.IP: "1.1.1.1", 136*800a58d9SAndroid Build Coastguard Worker constants.INSTANCE_NAME: "fake_name", 137*800a58d9SAndroid Build Coastguard Worker constants.VNC_PORT: None, 138*800a58d9SAndroid Build Coastguard Worker constants.ADB_PORT: None 139*800a58d9SAndroid Build Coastguard Worker } 140*800a58d9SAndroid Build Coastguard Worker fake_report.AddData.assert_called_with(key="device_failing_reconnect", 141*800a58d9SAndroid Build Coastguard Worker value=fake_device_dict) 142*800a58d9SAndroid Build Coastguard Worker 143*800a58d9SAndroid Build Coastguard Worker # test reconnect local instance. 144*800a58d9SAndroid Build Coastguard Worker instance_object.islocal = True 145*800a58d9SAndroid Build Coastguard Worker instance_object.display = "" 146*800a58d9SAndroid Build Coastguard Worker instance_object.vnc_port = 5555 147*800a58d9SAndroid Build Coastguard Worker instance_object.ssh_tunnel_is_connected = False 148*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.call_count = 0 149*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance( 150*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path, instance_object, fake_report, autoconnect="vnc") 151*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.assert_not_called() 152*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.assert_called_with(5555) 153*800a58d9SAndroid Build Coastguard Worker fake_device_dict = { 154*800a58d9SAndroid Build Coastguard Worker constants.IP: "1.1.1.1", 155*800a58d9SAndroid Build Coastguard Worker constants.INSTANCE_NAME: "fake_name", 156*800a58d9SAndroid Build Coastguard Worker constants.VNC_PORT: 5555, 157*800a58d9SAndroid Build Coastguard Worker constants.ADB_PORT: "8686" 158*800a58d9SAndroid Build Coastguard Worker } 159*800a58d9SAndroid Build Coastguard Worker fake_report.AddData.assert_called_with(key="devices", value=fake_device_dict) 160*800a58d9SAndroid Build Coastguard Worker 161*800a58d9SAndroid Build Coastguard Worker # pylint: disable=no-member 162*800a58d9SAndroid Build Coastguard Worker def testReconnectInstanceWithWebRTC(self): 163*800a58d9SAndroid Build Coastguard Worker """Test reconnect instances with WebRTC.""" 164*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path = "/fake/acloud_rsa" 165*800a58d9SAndroid Build Coastguard Worker fake_report = mock.MagicMock() 166*800a58d9SAndroid Build Coastguard Worker instance_object = mock.MagicMock() 167*800a58d9SAndroid Build Coastguard Worker instance_object.ip = "1.1.1.1" 168*800a58d9SAndroid Build Coastguard Worker instance_object.islocal = False 169*800a58d9SAndroid Build Coastguard Worker instance_object.adb_port = "8686" 170*800a58d9SAndroid Build Coastguard Worker instance_object.avd_type = "cuttlefish" 171*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_call", return_value=True) 172*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "LaunchVncClient") 173*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "AutoConnect") 174*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "LaunchBrowser") 175*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "GetWebrtcPortFromSSHTunnel", return_value=None) 176*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "EstablishWebRTCSshTunnel") 177*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "PickFreePort", return_value=12345) 178*800a58d9SAndroid Build Coastguard Worker self.Patch(AdbTools, "IsAdbConnected", return_value=False) 179*800a58d9SAndroid Build Coastguard Worker self.Patch(AdbTools, "IsAdbConnectionAlive", return_value=False) 180*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "IsCommandRunning", return_value=False) 181*800a58d9SAndroid Build Coastguard Worker 182*800a58d9SAndroid Build Coastguard Worker # test ssh tunnel not reconnect to the remote instance. 183*800a58d9SAndroid Build Coastguard Worker instance_object.vnc_port = 6666 184*800a58d9SAndroid Build Coastguard Worker instance_object.display = "" 185*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.call_count = 0 186*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance(ssh_private_key_path, instance_object, fake_report, 187*800a58d9SAndroid Build Coastguard Worker None, "webrtc") 188*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.assert_not_called() 189*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.assert_not_called() 190*800a58d9SAndroid Build Coastguard Worker utils.EstablishWebRTCSshTunnel.assert_called_with(extra_args_ssh_tunnel=None, 191*800a58d9SAndroid Build Coastguard Worker webrtc_local_port=12345, 192*800a58d9SAndroid Build Coastguard Worker ip_addr='1.1.1.1', 193*800a58d9SAndroid Build Coastguard Worker rsa_key_file='/fake/acloud_rsa', 194*800a58d9SAndroid Build Coastguard Worker ssh_user='vsoc-01') 195*800a58d9SAndroid Build Coastguard Worker utils.LaunchBrowser.assert_called_with('localhost', 12345) 196*800a58d9SAndroid Build Coastguard Worker utils.PickFreePort.assert_called_once() 197*800a58d9SAndroid Build Coastguard Worker utils.PickFreePort.reset_mock() 198*800a58d9SAndroid Build Coastguard Worker 199*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "GetWebrtcPortFromSSHTunnel", return_value="11111") 200*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance(ssh_private_key_path, instance_object, fake_report, 201*800a58d9SAndroid Build Coastguard Worker None, "webrtc") 202*800a58d9SAndroid Build Coastguard Worker utils.PickFreePort.assert_not_called() 203*800a58d9SAndroid Build Coastguard Worker 204*800a58d9SAndroid Build Coastguard Worker # local webrtc instance 205*800a58d9SAndroid Build Coastguard Worker instance_object.islocal = True 206*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance(ssh_private_key_path, instance_object, fake_report, 207*800a58d9SAndroid Build Coastguard Worker None, "webrtc") 208*800a58d9SAndroid Build Coastguard Worker utils.PickFreePort.assert_not_called() 209*800a58d9SAndroid Build Coastguard Worker 210*800a58d9SAndroid Build Coastguard Worker # autoconnect adb only should launch nothing. 211*800a58d9SAndroid Build Coastguard Worker utils.LaunchBrowser.reset_mock() 212*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.reset_mock() 213*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance(ssh_private_key_path, instance_object, fake_report, 214*800a58d9SAndroid Build Coastguard Worker None, "adb") 215*800a58d9SAndroid Build Coastguard Worker utils.LaunchBrowser.assert_not_called() 216*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.assert_not_called() 217*800a58d9SAndroid Build Coastguard Worker 218*800a58d9SAndroid Build Coastguard Worker 219*800a58d9SAndroid Build Coastguard Worker def testReconnectInstanceAvdtype(self): 220*800a58d9SAndroid Build Coastguard Worker """Test Reconnect Instances of avd_type.""" 221*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path = "/fake/acloud_rsa" 222*800a58d9SAndroid Build Coastguard Worker fake_report = mock.MagicMock() 223*800a58d9SAndroid Build Coastguard Worker instance_object = mock.MagicMock() 224*800a58d9SAndroid Build Coastguard Worker instance_object.ip = "1.1.1.1" 225*800a58d9SAndroid Build Coastguard Worker instance_object.vnc_port = 9999 226*800a58d9SAndroid Build Coastguard Worker instance_object.adb_port = "9999" 227*800a58d9SAndroid Build Coastguard Worker instance_object.islocal = False 228*800a58d9SAndroid Build Coastguard Worker instance_object.ssh_tunnel_is_connected = False 229*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "AutoConnect") 230*800a58d9SAndroid Build Coastguard Worker self.Patch(reconnect, "StartVnc") 231*800a58d9SAndroid Build Coastguard Worker #test reconnect remote instance when avd_type as gce. 232*800a58d9SAndroid Build Coastguard Worker instance_object.avd_type = "gce" 233*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance( 234*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path, instance_object, fake_report, autoconnect="vnc") 235*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.assert_called_with(ip_addr=instance_object.ip, 236*800a58d9SAndroid Build Coastguard Worker rsa_key_file=ssh_private_key_path, 237*800a58d9SAndroid Build Coastguard Worker target_vnc_port=constants.GCE_VNC_PORT, 238*800a58d9SAndroid Build Coastguard Worker target_adb_port=constants.GCE_ADB_PORT, 239*800a58d9SAndroid Build Coastguard Worker ssh_user=constants.GCE_USER, 240*800a58d9SAndroid Build Coastguard Worker extra_args_ssh_tunnel=None) 241*800a58d9SAndroid Build Coastguard Worker reconnect.StartVnc.assert_called_once() 242*800a58d9SAndroid Build Coastguard Worker 243*800a58d9SAndroid Build Coastguard Worker #test reconnect remote instance when avd_type as cuttlefish. 244*800a58d9SAndroid Build Coastguard Worker instance_object.avd_type = "cuttlefish" 245*800a58d9SAndroid Build Coastguard Worker reconnect.StartVnc.call_count = 0 246*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance( 247*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path, instance_object, fake_report, autoconnect="vnc") 248*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.assert_called_with(ip_addr=instance_object.ip, 249*800a58d9SAndroid Build Coastguard Worker rsa_key_file=ssh_private_key_path, 250*800a58d9SAndroid Build Coastguard Worker target_vnc_port=constants.CF_VNC_PORT, 251*800a58d9SAndroid Build Coastguard Worker target_adb_port=constants.CF_ADB_PORT, 252*800a58d9SAndroid Build Coastguard Worker ssh_user=constants.GCE_USER, 253*800a58d9SAndroid Build Coastguard Worker extra_args_ssh_tunnel=None) 254*800a58d9SAndroid Build Coastguard Worker reconnect.StartVnc.assert_called_once() 255*800a58d9SAndroid Build Coastguard Worker 256*800a58d9SAndroid Build Coastguard Worker def testReconnectInstanceUnknownAvdType(self): 257*800a58d9SAndroid Build Coastguard Worker """Test reconnect instances of unknown avd type.""" 258*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path = "/fake/acloud_rsa" 259*800a58d9SAndroid Build Coastguard Worker fake_report = mock.MagicMock() 260*800a58d9SAndroid Build Coastguard Worker instance_object = mock.MagicMock() 261*800a58d9SAndroid Build Coastguard Worker instance_object.avd_type = "unknown" 262*800a58d9SAndroid Build Coastguard Worker self.assertRaises(errors.UnknownAvdType, 263*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance, 264*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path, 265*800a58d9SAndroid Build Coastguard Worker instance_object, 266*800a58d9SAndroid Build Coastguard Worker fake_report) 267*800a58d9SAndroid Build Coastguard Worker 268*800a58d9SAndroid Build Coastguard Worker def testReconnectInstanceNoAvdType(self): 269*800a58d9SAndroid Build Coastguard Worker """Test reconnect instances with no avd type.""" 270*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path = "/fake/acloud_rsa" 271*800a58d9SAndroid Build Coastguard Worker fake_report = mock.MagicMock() 272*800a58d9SAndroid Build Coastguard Worker instance_object = mock.MagicMock() 273*800a58d9SAndroid Build Coastguard Worker self.assertRaises(errors.UnknownAvdType, 274*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance, 275*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path, 276*800a58d9SAndroid Build Coastguard Worker instance_object, 277*800a58d9SAndroid Build Coastguard Worker fake_report) 278*800a58d9SAndroid Build Coastguard Worker 279*800a58d9SAndroid Build Coastguard Worker def testStartVnc(self): 280*800a58d9SAndroid Build Coastguard Worker """Test start Vnc.""" 281*800a58d9SAndroid Build Coastguard Worker self.Patch(subprocess, "check_call", return_value=True) 282*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "IsCommandRunning", return_value=False) 283*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "LaunchVncClient") 284*800a58d9SAndroid Build Coastguard Worker vnc_port = 5555 285*800a58d9SAndroid Build Coastguard Worker display = "" 286*800a58d9SAndroid Build Coastguard Worker reconnect.StartVnc(vnc_port, display) 287*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.assert_called_with(5555) 288*800a58d9SAndroid Build Coastguard Worker 289*800a58d9SAndroid Build Coastguard Worker display = "888x777 (99)" 290*800a58d9SAndroid Build Coastguard Worker utils.AutoConnect.call_count = 0 291*800a58d9SAndroid Build Coastguard Worker reconnect.StartVnc(vnc_port, display) 292*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.assert_called_with(5555, "888", "777") 293*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.reset_mock() 294*800a58d9SAndroid Build Coastguard Worker 295*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "IsCommandRunning", return_value=True) 296*800a58d9SAndroid Build Coastguard Worker reconnect.StartVnc(vnc_port, display) 297*800a58d9SAndroid Build Coastguard Worker utils.LaunchVncClient.assert_not_called() 298*800a58d9SAndroid Build Coastguard Worker 299*800a58d9SAndroid Build Coastguard Worker # pylint: disable=protected-access 300*800a58d9SAndroid Build Coastguard Worker def testIsWebrtcEnable(self): 301*800a58d9SAndroid Build Coastguard Worker """Test _IsWebrtcEnable.""" 302*800a58d9SAndroid Build Coastguard Worker fake_ins = mock.MagicMock() 303*800a58d9SAndroid Build Coastguard Worker fake_ins.islocal = True 304*800a58d9SAndroid Build Coastguard Worker fake_ins.cf_runtime_cfg = mock.MagicMock() 305*800a58d9SAndroid Build Coastguard Worker fake_ins.cf_runtime_cfg.enable_webrtc = False 306*800a58d9SAndroid Build Coastguard Worker reconnect._IsWebrtcEnable(fake_ins, "fake_user", "ssh_pkey_path", "") 307*800a58d9SAndroid Build Coastguard Worker self.assertFalse(reconnect._IsWebrtcEnable(fake_ins, "fake_user", "ssh_pkey_path", "")) 308*800a58d9SAndroid Build Coastguard Worker 309*800a58d9SAndroid Build Coastguard Worker fake_ins.islocal = False 310*800a58d9SAndroid Build Coastguard Worker fake_runtime_config = mock.MagicMock() 311*800a58d9SAndroid Build Coastguard Worker fake_runtime_config.enable_webrtc = True 312*800a58d9SAndroid Build Coastguard Worker self.Patch(ssh_object, "Ssh") 313*800a58d9SAndroid Build Coastguard Worker self.Patch(ssh_object.Ssh, "GetCmdOutput", return_value="fake_rawdata") 314*800a58d9SAndroid Build Coastguard Worker self.Patch(cvd_runtime_config, "CvdRuntimeConfig", 315*800a58d9SAndroid Build Coastguard Worker return_value=fake_runtime_config) 316*800a58d9SAndroid Build Coastguard Worker self.assertTrue(reconnect._IsWebrtcEnable(fake_ins, "fake_user", "ssh_pkey_path", "")) 317*800a58d9SAndroid Build Coastguard Worker 318*800a58d9SAndroid Build Coastguard Worker self.Patch(cvd_runtime_config, "CvdRuntimeConfig", 319*800a58d9SAndroid Build Coastguard Worker side_effect=errors.ConfigError) 320*800a58d9SAndroid Build Coastguard Worker self.assertFalse(reconnect._IsWebrtcEnable(fake_ins, "fake_user", "ssh_pkey_path", "")) 321*800a58d9SAndroid Build Coastguard Worker 322*800a58d9SAndroid Build Coastguard Worker def testRun(self): 323*800a58d9SAndroid Build Coastguard Worker """Test Run.""" 324*800a58d9SAndroid Build Coastguard Worker fake_args = mock.MagicMock() 325*800a58d9SAndroid Build Coastguard Worker fake_args.autoconnect = "webrtc" 326*800a58d9SAndroid Build Coastguard Worker fake_args.instance_names = ["fake-ins-name"] 327*800a58d9SAndroid Build Coastguard Worker fake_ins1 = mock.MagicMock() 328*800a58d9SAndroid Build Coastguard Worker fake_ins1.avd_type = "cuttlefish" 329*800a58d9SAndroid Build Coastguard Worker fake_ins1.islocal = False 330*800a58d9SAndroid Build Coastguard Worker fake_ins2 = mock.MagicMock() 331*800a58d9SAndroid Build Coastguard Worker fake_ins2.avd_type = "cuttlefish" 332*800a58d9SAndroid Build Coastguard Worker fake_ins2.islocal = False 333*800a58d9SAndroid Build Coastguard Worker fake_ins_gf = mock.MagicMock() 334*800a58d9SAndroid Build Coastguard Worker fake_ins_gf.avd_type = "goldfish" 335*800a58d9SAndroid Build Coastguard Worker fake_ins_gf.islocal = False 336*800a58d9SAndroid Build Coastguard Worker fake_ins_gf.vnc_port = 1234 337*800a58d9SAndroid Build Coastguard Worker ins_to_reconnect = [fake_ins1] 338*800a58d9SAndroid Build Coastguard Worker # mock args.all equal to True and return 3 instances. 339*800a58d9SAndroid Build Coastguard Worker all_ins_to_reconnect = [fake_ins1, fake_ins2, fake_ins_gf] 340*800a58d9SAndroid Build Coastguard Worker cfg = mock.MagicMock() 341*800a58d9SAndroid Build Coastguard Worker cfg.ssh_private_key_path = None 342*800a58d9SAndroid Build Coastguard Worker cfg.extra_args_ssh_tunnel = None 343*800a58d9SAndroid Build Coastguard Worker self.Patch(config, "GetAcloudConfig", return_value=cfg) 344*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "GetInstancesFromInstanceNames", 345*800a58d9SAndroid Build Coastguard Worker return_value=ins_to_reconnect) 346*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "ChooseInstances", 347*800a58d9SAndroid Build Coastguard Worker return_value=all_ins_to_reconnect) 348*800a58d9SAndroid Build Coastguard Worker self.Patch(auth, "CreateCredentials") 349*800a58d9SAndroid Build Coastguard Worker self.Patch(android_compute_client, "AndroidComputeClient") 350*800a58d9SAndroid Build Coastguard Worker self.Patch(android_compute_client.AndroidComputeClient, 351*800a58d9SAndroid Build Coastguard Worker "AddSshRsaInstanceMetadata") 352*800a58d9SAndroid Build Coastguard Worker self.Patch(reconnect, "ReconnectInstance") 353*800a58d9SAndroid Build Coastguard Worker 354*800a58d9SAndroid Build Coastguard Worker reconnect.Run(fake_args) 355*800a58d9SAndroid Build Coastguard Worker list_instance.GetInstancesFromInstanceNames.assert_called_once() 356*800a58d9SAndroid Build Coastguard Worker self.assertEqual(reconnect.ReconnectInstance.call_count, 1) 357*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance.reset_mock() 358*800a58d9SAndroid Build Coastguard Worker 359*800a58d9SAndroid Build Coastguard Worker # should reconnect all instances 360*800a58d9SAndroid Build Coastguard Worker fake_args.instance_names = None 361*800a58d9SAndroid Build Coastguard Worker reconnect.Run(fake_args) 362*800a58d9SAndroid Build Coastguard Worker list_instance.ChooseInstances.assert_called_once() 363*800a58d9SAndroid Build Coastguard Worker self.assertEqual(reconnect.ReconnectInstance.call_count, 3) 364*800a58d9SAndroid Build Coastguard Worker reconnect.ReconnectInstance.reset_mock() 365*800a58d9SAndroid Build Coastguard Worker 366*800a58d9SAndroid Build Coastguard Worker fake_ins1.islocal = True 367*800a58d9SAndroid Build Coastguard Worker fake_ins2.avd_type = "unknown" 368*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "ChooseInstances", 369*800a58d9SAndroid Build Coastguard Worker return_value=[fake_ins1, fake_ins2]) 370*800a58d9SAndroid Build Coastguard Worker reconnect.Run(fake_args) 371*800a58d9SAndroid Build Coastguard Worker self.assertEqual(reconnect.ReconnectInstance.call_count, 1) 372*800a58d9SAndroid Build Coastguard Worker 373*800a58d9SAndroid Build Coastguard Worker def testGetSshConnectHostname(self): 374*800a58d9SAndroid Build Coastguard Worker """Test GetSshConnectHostname.""" 375*800a58d9SAndroid Build Coastguard Worker self.Patch(gcompute_client, "GetGCEHostName", return_value="fake_host") 376*800a58d9SAndroid Build Coastguard Worker instance = mock.MagicMock() 377*800a58d9SAndroid Build Coastguard Worker instance.islocal = True 378*800a58d9SAndroid Build Coastguard Worker cfg = mock.MagicMock() 379*800a58d9SAndroid Build Coastguard Worker self.assertEqual(None, reconnect.GetSshConnectHostname(cfg, instance)) 380*800a58d9SAndroid Build Coastguard Worker 381*800a58d9SAndroid Build Coastguard Worker # Remote instance will get the GCE hostname. 382*800a58d9SAndroid Build Coastguard Worker instance.islocal = False 383*800a58d9SAndroid Build Coastguard Worker cfg.connect_hostname = True 384*800a58d9SAndroid Build Coastguard Worker self.assertEqual("fake_host", 385*800a58d9SAndroid Build Coastguard Worker reconnect.GetSshConnectHostname(cfg, instance)) 386*800a58d9SAndroid Build Coastguard Worker 387*800a58d9SAndroid Build Coastguard Worker 388*800a58d9SAndroid Build Coastguard Workerif __name__ == "__main__": 389*800a58d9SAndroid Build Coastguard Worker unittest.main() 390