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 list.""" 15*800a58d9SAndroid Build Coastguard Worker 16*800a58d9SAndroid Build Coastguard Workerimport unittest 17*800a58d9SAndroid Build Coastguard Worker 18*800a58d9SAndroid Build Coastguard Workerfrom unittest import mock 19*800a58d9SAndroid Build Coastguard Worker 20*800a58d9SAndroid Build Coastguard Workerfrom acloud import errors 21*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import auth 22*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import cvd_runtime_config 23*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import driver_test_lib 24*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import gcompute_client 25*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import ssh 26*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import utils 27*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import adb_tools 28*800a58d9SAndroid Build Coastguard Workerfrom acloud.list import list as list_instance 29*800a58d9SAndroid Build Coastguard Workerfrom acloud.list import instance 30*800a58d9SAndroid Build Coastguard Workerfrom acloud.public import config 31*800a58d9SAndroid Build Coastguard Worker 32*800a58d9SAndroid Build Coastguard Worker 33*800a58d9SAndroid Build Coastguard Workerclass InstanceObject: 34*800a58d9SAndroid Build Coastguard Worker """Mock to store data of instance.""" 35*800a58d9SAndroid Build Coastguard Worker 36*800a58d9SAndroid Build Coastguard Worker def __init__(self, name): 37*800a58d9SAndroid Build Coastguard Worker self.name = name 38*800a58d9SAndroid Build Coastguard Worker 39*800a58d9SAndroid Build Coastguard Worker 40*800a58d9SAndroid Build Coastguard Workerclass ListTest(driver_test_lib.BaseDriverTest): 41*800a58d9SAndroid Build Coastguard Worker """Test list.""" 42*800a58d9SAndroid Build Coastguard Worker 43*800a58d9SAndroid Build Coastguard Worker def setUp(self): 44*800a58d9SAndroid Build Coastguard Worker """Set up the test.""" 45*800a58d9SAndroid Build Coastguard Worker super().setUp() 46*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "_GetElapsedTime", return_value=0) 47*800a58d9SAndroid Build Coastguard Worker self.Patch(instance.RemoteInstance, "_GetZoneName") 48*800a58d9SAndroid Build Coastguard Worker self.Patch(instance.RemoteInstance, "_GetProjectName") 49*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetInstanceIP", return_value=ssh.IP()) 50*800a58d9SAndroid Build Coastguard Worker self.Patch(instance.RemoteInstance, "GetAdbVncPortFromSSHTunnel") 51*800a58d9SAndroid Build Coastguard Worker self.Patch(adb_tools, "AdbTools") 52*800a58d9SAndroid Build Coastguard Worker self.Patch(adb_tools.AdbTools, "IsAdbConnected", return_value=False) 53*800a58d9SAndroid Build Coastguard Worker self.Patch(auth, "CreateCredentials") 54*800a58d9SAndroid Build Coastguard Worker self.Patch(gcompute_client, "ComputeClient") 55*800a58d9SAndroid Build Coastguard Worker self.Patch(gcompute_client.ComputeClient, "ListInstances") 56*800a58d9SAndroid Build Coastguard Worker 57*800a58d9SAndroid Build Coastguard Worker def testGetInstancesFromInstanceNames(self): 58*800a58d9SAndroid Build Coastguard Worker """test get instances from instance names.""" 59*800a58d9SAndroid Build Coastguard Worker cfg = mock.MagicMock() 60*800a58d9SAndroid Build Coastguard Worker instance_names = ["alive_instance1", "alive_local_instance"] 61*800a58d9SAndroid Build Coastguard Worker 62*800a58d9SAndroid Build Coastguard Worker alive_instance1 = InstanceObject("alive_instance1") 63*800a58d9SAndroid Build Coastguard Worker alive_instance2 = InstanceObject("alive_instance2") 64*800a58d9SAndroid Build Coastguard Worker alive_local_instance = InstanceObject("alive_local_instance") 65*800a58d9SAndroid Build Coastguard Worker 66*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "GetLocalInstancesByNames", 67*800a58d9SAndroid Build Coastguard Worker return_value=[alive_local_instance]) 68*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "GetRemoteInstances", 69*800a58d9SAndroid Build Coastguard Worker return_value=[alive_instance1, alive_instance2]) 70*800a58d9SAndroid Build Coastguard Worker instances_list = list_instance.GetInstancesFromInstanceNames(cfg, instance_names) 71*800a58d9SAndroid Build Coastguard Worker instances_name_in_list = [instance_object.name for instance_object in instances_list] 72*800a58d9SAndroid Build Coastguard Worker self.assertEqual(instances_name_in_list.sort(), instance_names.sort()) 73*800a58d9SAndroid Build Coastguard Worker 74*800a58d9SAndroid Build Coastguard Worker instance_names = ["alive_instance1", "alive_local_instance", "alive_local_instance"] 75*800a58d9SAndroid Build Coastguard Worker instances_list = list_instance.GetInstancesFromInstanceNames(cfg, instance_names) 76*800a58d9SAndroid Build Coastguard Worker instances_name_in_list = [instance_object.name for instance_object in instances_list] 77*800a58d9SAndroid Build Coastguard Worker self.assertEqual(instances_name_in_list.sort(), instance_names.sort()) 78*800a58d9SAndroid Build Coastguard Worker 79*800a58d9SAndroid Build Coastguard Worker # test get instance from instance name error with invalid input. 80*800a58d9SAndroid Build Coastguard Worker instance_names = ["miss2_local_instance", "alive_instance1"] 81*800a58d9SAndroid Build Coastguard Worker miss_instance_names = ["miss2_local_instance"] 82*800a58d9SAndroid Build Coastguard Worker self.assertRaisesRegex( 83*800a58d9SAndroid Build Coastguard Worker errors.NoInstancesFound, 84*800a58d9SAndroid Build Coastguard Worker "Did not find the following instances: %s" % ' '.join(miss_instance_names), 85*800a58d9SAndroid Build Coastguard Worker list_instance.GetInstancesFromInstanceNames, 86*800a58d9SAndroid Build Coastguard Worker cfg=cfg, 87*800a58d9SAndroid Build Coastguard Worker instance_names=instance_names) 88*800a58d9SAndroid Build Coastguard Worker 89*800a58d9SAndroid Build Coastguard Worker def testChooseOneRemoteInstance(self): 90*800a58d9SAndroid Build Coastguard Worker """test choose one remote instance from instance names.""" 91*800a58d9SAndroid Build Coastguard Worker cfg = mock.MagicMock() 92*800a58d9SAndroid Build Coastguard Worker 93*800a58d9SAndroid Build Coastguard Worker # Test only one instance case 94*800a58d9SAndroid Build Coastguard Worker instance_names = ["cf_instance1"] 95*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "GetCFRemoteInstances", return_value=instance_names) 96*800a58d9SAndroid Build Coastguard Worker expected_instance = "cf_instance1" 97*800a58d9SAndroid Build Coastguard Worker self.assertEqual(list_instance.ChooseOneRemoteInstance(cfg), expected_instance) 98*800a58d9SAndroid Build Coastguard Worker 99*800a58d9SAndroid Build Coastguard Worker # Test no instance case 100*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "GetCFRemoteInstances", return_value=[]) 101*800a58d9SAndroid Build Coastguard Worker with self.assertRaises(errors.NoInstancesFound): 102*800a58d9SAndroid Build Coastguard Worker list_instance.ChooseOneRemoteInstance(cfg) 103*800a58d9SAndroid Build Coastguard Worker 104*800a58d9SAndroid Build Coastguard Worker # Test two instances case. 105*800a58d9SAndroid Build Coastguard Worker instance_names = ["cf_instance1", "cf_instance2"] 106*800a58d9SAndroid Build Coastguard Worker choose_instance = ["cf_instance2"] 107*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "GetCFRemoteInstances", return_value=instance_names) 108*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "GetAnswerFromList", return_value=choose_instance) 109*800a58d9SAndroid Build Coastguard Worker expected_instance = "cf_instance2" 110*800a58d9SAndroid Build Coastguard Worker self.assertEqual(list_instance.ChooseOneRemoteInstance(cfg), expected_instance) 111*800a58d9SAndroid Build Coastguard Worker 112*800a58d9SAndroid Build Coastguard Worker def testGetLocalInstancesByNames(self): 113*800a58d9SAndroid Build Coastguard Worker """test GetLocalInstancesByNames.""" 114*800a58d9SAndroid Build Coastguard Worker self.Patch( 115*800a58d9SAndroid Build Coastguard Worker instance, "GetLocalInstanceIdByName", 116*800a58d9SAndroid Build Coastguard Worker side_effect=lambda name: 1 if name == "local-instance-1" else None) 117*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetLocalInstanceConfig", 118*800a58d9SAndroid Build Coastguard Worker return_value="path1") 119*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetDefaultCuttlefishConfig", 120*800a58d9SAndroid Build Coastguard Worker return_value="path2") 121*800a58d9SAndroid Build Coastguard Worker mock_cf_ins = mock.Mock() 122*800a58d9SAndroid Build Coastguard Worker mock_cf_ins.name = "local-instance-1" 123*800a58d9SAndroid Build Coastguard Worker mock_get_cf = self.Patch(list_instance, 124*800a58d9SAndroid Build Coastguard Worker "_GetLocalCuttlefishInstances", 125*800a58d9SAndroid Build Coastguard Worker return_value=[mock_cf_ins]) 126*800a58d9SAndroid Build Coastguard Worker mock_gf_ins = mock.Mock() 127*800a58d9SAndroid Build Coastguard Worker mock_gf_ins.name = "local-goldfish-instance-1" 128*800a58d9SAndroid Build Coastguard Worker self.Patch(instance.LocalGoldfishInstance, "GetExistingInstances", 129*800a58d9SAndroid Build Coastguard Worker return_value=[mock_gf_ins]) 130*800a58d9SAndroid Build Coastguard Worker 131*800a58d9SAndroid Build Coastguard Worker ins_list = list_instance.GetLocalInstancesByNames([ 132*800a58d9SAndroid Build Coastguard Worker mock_cf_ins.name, "local-instance-6", mock_gf_ins.name]) 133*800a58d9SAndroid Build Coastguard Worker self.assertEqual([mock_cf_ins, mock_gf_ins], ins_list) 134*800a58d9SAndroid Build Coastguard Worker mock_get_cf.assert_called_with([(1, "path1"), (1, "path2")]) 135*800a58d9SAndroid Build Coastguard Worker 136*800a58d9SAndroid Build Coastguard Worker # pylint: disable=attribute-defined-outside-init 137*800a58d9SAndroid Build Coastguard Worker def testFilterInstancesByAdbPort(self): 138*800a58d9SAndroid Build Coastguard Worker """test FilterInstancesByAdbPort.""" 139*800a58d9SAndroid Build Coastguard Worker alive_instance1 = InstanceObject("alive_instance1") 140*800a58d9SAndroid Build Coastguard Worker alive_instance1.adb_port = 1111 141*800a58d9SAndroid Build Coastguard Worker alive_instance1.fullname = "device serial: 127.0.0.1:1111 alive_instance1" 142*800a58d9SAndroid Build Coastguard Worker expected_instance = [alive_instance1] 143*800a58d9SAndroid Build Coastguard Worker # Test to find instance by adb port number. 144*800a58d9SAndroid Build Coastguard Worker self.assertEqual( 145*800a58d9SAndroid Build Coastguard Worker expected_instance, 146*800a58d9SAndroid Build Coastguard Worker list_instance.FilterInstancesByAdbPort(expected_instance, 1111)) 147*800a58d9SAndroid Build Coastguard Worker # Test for instance can't be found by adb port number. 148*800a58d9SAndroid Build Coastguard Worker with self.assertRaises(errors.NoInstancesFound): 149*800a58d9SAndroid Build Coastguard Worker list_instance.FilterInstancesByAdbPort(expected_instance, 2222) 150*800a58d9SAndroid Build Coastguard Worker 151*800a58d9SAndroid Build Coastguard Worker # pylint: disable=protected-access 152*800a58d9SAndroid Build Coastguard Worker def testGetLocalCuttlefishInstances(self): 153*800a58d9SAndroid Build Coastguard Worker """test _GetLocalCuttlefishInstances.""" 154*800a58d9SAndroid Build Coastguard Worker # Test getting two instance case 155*800a58d9SAndroid Build Coastguard Worker id_cfg_pairs = [(1, "fake_path1"), (2, "fake_path2")] 156*800a58d9SAndroid Build Coastguard Worker mock_isfile = self.Patch(list_instance.os.path, "isfile", 157*800a58d9SAndroid Build Coastguard Worker return_value=True) 158*800a58d9SAndroid Build Coastguard Worker 159*800a58d9SAndroid Build Coastguard Worker mock_lock = mock.Mock() 160*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.return_value = True 161*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetLocalInstanceLock", return_value=mock_lock) 162*800a58d9SAndroid Build Coastguard Worker 163*800a58d9SAndroid Build Coastguard Worker local_ins = mock.MagicMock() 164*800a58d9SAndroid Build Coastguard Worker local_ins.CvdStatus.return_value = True 165*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetCuttleFishLocalInstances", 166*800a58d9SAndroid Build Coastguard Worker return_value=[local_ins]) 167*800a58d9SAndroid Build Coastguard Worker 168*800a58d9SAndroid Build Coastguard Worker ins_list = list_instance._GetLocalCuttlefishInstances(id_cfg_pairs) 169*800a58d9SAndroid Build Coastguard Worker self.assertEqual(2, len(ins_list)) 170*800a58d9SAndroid Build Coastguard Worker mock_isfile.assert_called() 171*800a58d9SAndroid Build Coastguard Worker local_ins.CvdStatus.assert_called() 172*800a58d9SAndroid Build Coastguard Worker self.assertEqual(2, mock_lock.Lock.call_count) 173*800a58d9SAndroid Build Coastguard Worker self.assertEqual(2, mock_lock.Unlock.call_count) 174*800a58d9SAndroid Build Coastguard Worker 175*800a58d9SAndroid Build Coastguard Worker local_ins.CvdStatus.reset_mock() 176*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.reset_mock() 177*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.return_value = False 178*800a58d9SAndroid Build Coastguard Worker mock_lock.Unlock.reset_mock() 179*800a58d9SAndroid Build Coastguard Worker ins_list = list_instance._GetLocalCuttlefishInstances(id_cfg_pairs) 180*800a58d9SAndroid Build Coastguard Worker self.assertEqual(0, len(ins_list)) 181*800a58d9SAndroid Build Coastguard Worker local_ins.CvdStatus.assert_not_called() 182*800a58d9SAndroid Build Coastguard Worker self.assertEqual(2, mock_lock.Lock.call_count) 183*800a58d9SAndroid Build Coastguard Worker mock_lock.Unlock.assert_not_called() 184*800a58d9SAndroid Build Coastguard Worker 185*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.reset_mock() 186*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.return_value = True 187*800a58d9SAndroid Build Coastguard Worker local_ins.CvdStatus.return_value = False 188*800a58d9SAndroid Build Coastguard Worker ins_list = list_instance._GetLocalCuttlefishInstances(id_cfg_pairs) 189*800a58d9SAndroid Build Coastguard Worker self.assertEqual(0, len(ins_list)) 190*800a58d9SAndroid Build Coastguard Worker self.assertEqual(2, mock_lock.Lock.call_count) 191*800a58d9SAndroid Build Coastguard Worker self.assertEqual(2, mock_lock.Unlock.call_count) 192*800a58d9SAndroid Build Coastguard Worker 193*800a58d9SAndroid Build Coastguard Worker # pylint: disable=no-member 194*800a58d9SAndroid Build Coastguard Worker def testPrintInstancesDetails(self): 195*800a58d9SAndroid Build Coastguard Worker """test PrintInstancesDetails.""" 196*800a58d9SAndroid Build Coastguard Worker # Test instance Summary should be called if verbose 197*800a58d9SAndroid Build Coastguard Worker self.Patch(instance.Instance, "Summary") 198*800a58d9SAndroid Build Coastguard Worker cf_config = mock.MagicMock( 199*800a58d9SAndroid Build Coastguard Worker x_res=728, 200*800a58d9SAndroid Build Coastguard Worker y_res=728, 201*800a58d9SAndroid Build Coastguard Worker dpi=240, 202*800a58d9SAndroid Build Coastguard Worker instance_dir="fake_dir", 203*800a58d9SAndroid Build Coastguard Worker adb_ip_port="127.0.0.1:6520", 204*800a58d9SAndroid Build Coastguard Worker root_dir="root/cuttlefish_runtime" 205*800a58d9SAndroid Build Coastguard Worker ) 206*800a58d9SAndroid Build Coastguard Worker self.Patch(cvd_runtime_config, "CvdRuntimeConfig", 207*800a58d9SAndroid Build Coastguard Worker return_value=cf_config) 208*800a58d9SAndroid Build Coastguard Worker self.Patch(instance.LocalInstance, "_GetDevidInfoFromCvdStatus", 209*800a58d9SAndroid Build Coastguard Worker return_value=None) 210*800a58d9SAndroid Build Coastguard Worker 211*800a58d9SAndroid Build Coastguard Worker ins = instance.LocalInstance("fake_cf_path") 212*800a58d9SAndroid Build Coastguard Worker list_instance.PrintInstancesDetails([ins], verbose=True) 213*800a58d9SAndroid Build Coastguard Worker instance.Instance.Summary.assert_called_once() 214*800a58d9SAndroid Build Coastguard Worker 215*800a58d9SAndroid Build Coastguard Worker # Test Summary shouldn't be called if not verbose 216*800a58d9SAndroid Build Coastguard Worker self.Patch(instance.Instance, "Summary") 217*800a58d9SAndroid Build Coastguard Worker list_instance.PrintInstancesDetails([ins], verbose=False) 218*800a58d9SAndroid Build Coastguard Worker instance.Instance.Summary.assert_not_called() 219*800a58d9SAndroid Build Coastguard Worker 220*800a58d9SAndroid Build Coastguard Worker # Test Summary shouldn't be called if no instance found. 221*800a58d9SAndroid Build Coastguard Worker list_instance.PrintInstancesDetails([], verbose=True) 222*800a58d9SAndroid Build Coastguard Worker instance.Instance.Summary.assert_not_called() 223*800a58d9SAndroid Build Coastguard Worker 224*800a58d9SAndroid Build Coastguard Worker def testRun(self): 225*800a58d9SAndroid Build Coastguard Worker """test Run.""" 226*800a58d9SAndroid Build Coastguard Worker cfg = mock.MagicMock() 227*800a58d9SAndroid Build Coastguard Worker self.Patch(config, "GetAcloudConfig", return_value=cfg) 228*800a58d9SAndroid Build Coastguard Worker args = mock.MagicMock() 229*800a58d9SAndroid Build Coastguard Worker # local instance 230*800a58d9SAndroid Build Coastguard Worker args.local_only = True 231*800a58d9SAndroid Build Coastguard Worker args.verbose = False 232*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "IsSupportedPlatform", return_value=True) 233*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "PrintInstancesDetails") 234*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetAllLocalInstanceConfigs") 235*800a58d9SAndroid Build Coastguard Worker fake_local_ins1 = "local_ins1" 236*800a58d9SAndroid Build Coastguard Worker fake_local_ins2 = "local_ins2" 237*800a58d9SAndroid Build Coastguard Worker fake_local_gf_ins1 = "local_gf_ins1" 238*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "_GetLocalCuttlefishInstances", 239*800a58d9SAndroid Build Coastguard Worker return_value=[fake_local_ins1, fake_local_ins2]) 240*800a58d9SAndroid Build Coastguard Worker self.Patch(instance.LocalGoldfishInstance, "GetExistingInstances", 241*800a58d9SAndroid Build Coastguard Worker return_value=[fake_local_gf_ins1]) 242*800a58d9SAndroid Build Coastguard Worker list_instance.Run(args) 243*800a58d9SAndroid Build Coastguard Worker list_instance.PrintInstancesDetails.assert_called_with( 244*800a58d9SAndroid Build Coastguard Worker [fake_local_ins1, fake_local_ins2, fake_local_gf_ins1], False) 245*800a58d9SAndroid Build Coastguard Worker 246*800a58d9SAndroid Build Coastguard Worker # remote instance 247*800a58d9SAndroid Build Coastguard Worker args.local_only = False 248*800a58d9SAndroid Build Coastguard Worker fake_remote_ins1= "remote_ins1" 249*800a58d9SAndroid Build Coastguard Worker fake_remote_ins2 = "remote_ins2" 250*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "GetRemoteInstances", 251*800a58d9SAndroid Build Coastguard Worker return_value=[fake_remote_ins1, fake_remote_ins2]) 252*800a58d9SAndroid Build Coastguard Worker list_instance.Run(args) 253*800a58d9SAndroid Build Coastguard Worker list_instance.PrintInstancesDetails.assert_called_with( 254*800a58d9SAndroid Build Coastguard Worker [fake_local_ins1, fake_local_ins2, fake_local_gf_ins1, 255*800a58d9SAndroid Build Coastguard Worker fake_remote_ins1, fake_remote_ins2], False) 256*800a58d9SAndroid Build Coastguard Worker 257*800a58d9SAndroid Build Coastguard Worker def testGetRemoteInstances(self): 258*800a58d9SAndroid Build Coastguard Worker """test GetRemoteInstances.""" 259*800a58d9SAndroid Build Coastguard Worker fake_remote_ins1 = {"name": "fake_remote_ins1_name", 260*800a58d9SAndroid Build Coastguard Worker "creationTimestamp": "2021-01-14T13:00:00.000-07:00", 261*800a58d9SAndroid Build Coastguard Worker "status": "Active"} 262*800a58d9SAndroid Build Coastguard Worker fake_remote_ins2 = {"name": "fake_remote_ins2_name", 263*800a58d9SAndroid Build Coastguard Worker "creationTimestamp": "2021-01-14T13:00:00.000-07:00", 264*800a58d9SAndroid Build Coastguard Worker "status": "Active"} 265*800a58d9SAndroid Build Coastguard Worker gcompute_client.ComputeClient(None, None).ListInstances.return_value = [ 266*800a58d9SAndroid Build Coastguard Worker fake_remote_ins1, fake_remote_ins2] 267*800a58d9SAndroid Build Coastguard Worker self.assertEqual(list_instance.GetRemoteInstances(None)[0].name, 268*800a58d9SAndroid Build Coastguard Worker instance.RemoteInstance(fake_remote_ins1).name) 269*800a58d9SAndroid Build Coastguard Worker self.assertEqual(len(list_instance.GetRemoteInstances(None)), 2) 270*800a58d9SAndroid Build Coastguard Worker 271*800a58d9SAndroid Build Coastguard Worker def testGetCFRemoteInstances(self): 272*800a58d9SAndroid Build Coastguard Worker """test GetCFRemoteInstances.""" 273*800a58d9SAndroid Build Coastguard Worker fake_remote_ins1 = {"name": "cf-fake_remote_ins1_name", 274*800a58d9SAndroid Build Coastguard Worker "avd_type": "cuttlefish", 275*800a58d9SAndroid Build Coastguard Worker "creationTimestamp": "2021-01-14T13:00:00.000-07:00", 276*800a58d9SAndroid Build Coastguard Worker "status": "Active"} 277*800a58d9SAndroid Build Coastguard Worker fake_remote_ins2 = {"name": "nonecf-fake_remote_ins2_name", 278*800a58d9SAndroid Build Coastguard Worker "avd_type": "goldfish", 279*800a58d9SAndroid Build Coastguard Worker "creationTimestamp": "2021-01-14T13:00:00.000-07:00", 280*800a58d9SAndroid Build Coastguard Worker "status": "Active"} 281*800a58d9SAndroid Build Coastguard Worker remote_ins_list = [instance.RemoteInstance(fake_remote_ins1), 282*800a58d9SAndroid Build Coastguard Worker instance.RemoteInstance(fake_remote_ins2)] 283*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "GetRemoteInstances", 284*800a58d9SAndroid Build Coastguard Worker return_value=remote_ins_list) 285*800a58d9SAndroid Build Coastguard Worker self.assertEqual(len(list_instance.GetCFRemoteInstances(None)), 1) 286*800a58d9SAndroid Build Coastguard Worker 287*800a58d9SAndroid Build Coastguard Worker def testGetActiveCVD(self): 288*800a58d9SAndroid Build Coastguard Worker """test GetActiveCVD.""" 289*800a58d9SAndroid Build Coastguard Worker # get local instance config 290*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetLocalInstanceConfig", 291*800a58d9SAndroid Build Coastguard Worker return_value="fake_local_cfg_path") 292*800a58d9SAndroid Build Coastguard Worker fake_local_ins = mock.MagicMock() 293*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "LocalInstance", return_value=fake_local_ins) 294*800a58d9SAndroid Build Coastguard Worker fake_local_ins.CvdStatus.return_value = True 295*800a58d9SAndroid Build Coastguard Worker self.assertEqual(list_instance.GetActiveCVD(1), fake_local_ins) 296*800a58d9SAndroid Build Coastguard Worker 297*800a58d9SAndroid Build Coastguard Worker fake_local_ins.CvdStatus.return_value = False 298*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetDefaultCuttlefishConfig", 299*800a58d9SAndroid Build Coastguard Worker return_value=None) 300*800a58d9SAndroid Build Coastguard Worker self.assertEqual(list_instance.GetActiveCVD(1), None) 301*800a58d9SAndroid Build Coastguard Worker 302*800a58d9SAndroid Build Coastguard Worker # get default cf config 303*800a58d9SAndroid Build Coastguard Worker fake_local_ins.CvdStatus.return_value = True 304*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetLocalInstanceConfig", 305*800a58d9SAndroid Build Coastguard Worker return_value=None) 306*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetDefaultCuttlefishConfig", 307*800a58d9SAndroid Build Coastguard Worker return_value="fake_cf_config") 308*800a58d9SAndroid Build Coastguard Worker self.assertEqual(list_instance.GetActiveCVD(1), fake_local_ins) 309*800a58d9SAndroid Build Coastguard Worker self.assertEqual(list_instance.GetActiveCVD(2), None) 310*800a58d9SAndroid Build Coastguard Worker 311*800a58d9SAndroid Build Coastguard Worker fake_local_ins.CvdStatus.return_value = False 312*800a58d9SAndroid Build Coastguard Worker self.assertEqual(list_instance.GetActiveCVD(1), None) 313*800a58d9SAndroid Build Coastguard Worker 314*800a58d9SAndroid Build Coastguard Worker fake_local_ins.CvdStatus.return_value = True 315*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetDefaultCuttlefishConfig", 316*800a58d9SAndroid Build Coastguard Worker return_value=None) 317*800a58d9SAndroid Build Coastguard Worker self.assertEqual(list_instance.GetActiveCVD(1), None) 318*800a58d9SAndroid Build Coastguard Worker 319*800a58d9SAndroid Build Coastguard Worker def testChooseInstances(self): 320*800a58d9SAndroid Build Coastguard Worker """test ChooseInstances.""" 321*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "GetLocalInstances", 322*800a58d9SAndroid Build Coastguard Worker return_value=["local_ins1", "local_ins2"]) 323*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instance, "GetRemoteInstances", 324*800a58d9SAndroid Build Coastguard Worker return_value=["remote_ins1", "remote_ins2"]) 325*800a58d9SAndroid Build Coastguard Worker self.assertEqual(len(list_instance.ChooseInstances(None, True)), 4) 326*800a58d9SAndroid Build Coastguard Worker 327*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "GetAnswerFromList", return_value=["remote_ins1"]) 328*800a58d9SAndroid Build Coastguard Worker choose_instance = ["remote_ins1"] 329*800a58d9SAndroid Build Coastguard Worker self.assertEqual(list_instance.ChooseInstances(None), choose_instance) 330*800a58d9SAndroid Build Coastguard Worker 331*800a58d9SAndroid Build Coastguard Worker list_instance.GetLocalInstances.return_value = [] 332*800a58d9SAndroid Build Coastguard Worker list_instance.GetRemoteInstances.return_value = ["only_one_ins"] 333*800a58d9SAndroid Build Coastguard Worker self.assertEqual(list_instance.ChooseInstances(None), ["only_one_ins"]) 334*800a58d9SAndroid Build Coastguard Worker 335*800a58d9SAndroid Build Coastguard Worker def testGetLocalInstanceLockByName(self): 336*800a58d9SAndroid Build Coastguard Worker """test GetLocalInstanceLockByName.""" 337*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetLocalInstanceIdByName", 338*800a58d9SAndroid Build Coastguard Worker return_value="local_ins_id") 339*800a58d9SAndroid Build Coastguard Worker self.Patch(instance, "GetLocalInstanceLock") 340*800a58d9SAndroid Build Coastguard Worker list_instance.GetLocalInstanceLockByName("query_name") 341*800a58d9SAndroid Build Coastguard Worker instance.GetLocalInstanceLock.assert_called_once() 342*800a58d9SAndroid Build Coastguard Worker 343*800a58d9SAndroid Build Coastguard Worker instance.GetLocalInstanceIdByName.return_value = None 344*800a58d9SAndroid Build Coastguard Worker self.Patch(instance.LocalGoldfishInstance, 345*800a58d9SAndroid Build Coastguard Worker "GetIdByName", return_value="gf_ins_id") 346*800a58d9SAndroid Build Coastguard Worker self.Patch(instance.LocalGoldfishInstance, "GetLockById") 347*800a58d9SAndroid Build Coastguard Worker list_instance.GetLocalInstanceLockByName("query_name") 348*800a58d9SAndroid Build Coastguard Worker instance.LocalGoldfishInstance.GetLockById.assert_called_once() 349*800a58d9SAndroid Build Coastguard Worker 350*800a58d9SAndroid Build Coastguard Worker self.Patch(instance.LocalGoldfishInstance, 351*800a58d9SAndroid Build Coastguard Worker "GetIdByName", return_value= None) 352*800a58d9SAndroid Build Coastguard Worker self.assertEqual( 353*800a58d9SAndroid Build Coastguard Worker list_instance.GetLocalInstanceLockByName("query_name"), None) 354*800a58d9SAndroid Build Coastguard Worker 355*800a58d9SAndroid Build Coastguard Worker 356*800a58d9SAndroid Build Coastguard Workerif __name__ == "__main__": 357*800a58d9SAndroid Build Coastguard Worker unittest.main() 358