xref: /aosp_15_r20/tools/acloud/reconnect/reconnect_test.py (revision 800a58d989c669b8eb8a71d8df53b1ba3d411444)
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