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 delete.""" 15*800a58d9SAndroid Build Coastguard Worker 16*800a58d9SAndroid Build Coastguard Workerimport subprocess 17*800a58d9SAndroid Build Coastguard Workerimport unittest 18*800a58d9SAndroid Build Coastguard Worker 19*800a58d9SAndroid Build Coastguard Workerfrom unittest import mock 20*800a58d9SAndroid Build Coastguard Worker 21*800a58d9SAndroid Build Coastguard Workerfrom acloud import errors 22*800a58d9SAndroid Build Coastguard Workerfrom acloud.delete import delete 23*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import driver_test_lib 24*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import oxygen_client 25*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import utils 26*800a58d9SAndroid Build Coastguard Workerfrom acloud.list import list as list_instances 27*800a58d9SAndroid Build Coastguard Workerfrom acloud.public import config 28*800a58d9SAndroid Build Coastguard Workerfrom acloud.public import device_driver 29*800a58d9SAndroid Build Coastguard Workerfrom acloud.public import report 30*800a58d9SAndroid Build Coastguard Worker 31*800a58d9SAndroid Build Coastguard Worker 32*800a58d9SAndroid Build Coastguard Worker# pylint: disable=invalid-name,protected-access,unused-argument,no-member 33*800a58d9SAndroid Build Coastguard Workerclass DeleteTest(driver_test_lib.BaseDriverTest): 34*800a58d9SAndroid Build Coastguard Worker """Test delete functions.""" 35*800a58d9SAndroid Build Coastguard Worker 36*800a58d9SAndroid Build Coastguard Worker def testDeleteLocalCuttlefishInstanceSuccess(self): 37*800a58d9SAndroid Build Coastguard Worker """Test DeleteLocalCuttlefishInstance.""" 38*800a58d9SAndroid Build Coastguard Worker instance_object = mock.MagicMock() 39*800a58d9SAndroid Build Coastguard Worker instance_object.name = "local-instance" 40*800a58d9SAndroid Build Coastguard Worker mock_lock = mock.Mock() 41*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.return_value = True 42*800a58d9SAndroid Build Coastguard Worker instance_object.GetLock.return_value = mock_lock 43*800a58d9SAndroid Build Coastguard Worker 44*800a58d9SAndroid Build Coastguard Worker delete_report = report.Report(command="delete") 45*800a58d9SAndroid Build Coastguard Worker delete.DeleteLocalCuttlefishInstance(instance_object, delete_report) 46*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.data, { 47*800a58d9SAndroid Build Coastguard Worker "deleted": [ 48*800a58d9SAndroid Build Coastguard Worker { 49*800a58d9SAndroid Build Coastguard Worker "type": "instance", 50*800a58d9SAndroid Build Coastguard Worker "name": "local-instance", 51*800a58d9SAndroid Build Coastguard Worker }, 52*800a58d9SAndroid Build Coastguard Worker ], 53*800a58d9SAndroid Build Coastguard Worker }) 54*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "SUCCESS") 55*800a58d9SAndroid Build Coastguard Worker mock_lock.SetInUse.assert_called_once_with(False) 56*800a58d9SAndroid Build Coastguard Worker mock_lock.Unlock.assert_called_once() 57*800a58d9SAndroid Build Coastguard Worker 58*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.return_value = False 59*800a58d9SAndroid Build Coastguard Worker delete.DeleteLocalCuttlefishInstance(instance_object, delete_report) 60*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "FAIL") 61*800a58d9SAndroid Build Coastguard Worker 62*800a58d9SAndroid Build Coastguard Worker def testDeleteLocalCuttlefishInstanceFailure(self): 63*800a58d9SAndroid Build Coastguard Worker """Test DeleteLocalCuttlefishInstance with command failure.""" 64*800a58d9SAndroid Build Coastguard Worker instance_object = mock.MagicMock() 65*800a58d9SAndroid Build Coastguard Worker instance_object.name = "local-instance" 66*800a58d9SAndroid Build Coastguard Worker instance_object.Delete.side_effect = subprocess.CalledProcessError( 67*800a58d9SAndroid Build Coastguard Worker 1, "cmd") 68*800a58d9SAndroid Build Coastguard Worker mock_lock = mock.Mock() 69*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.return_value = True 70*800a58d9SAndroid Build Coastguard Worker instance_object.GetLock.return_value = mock_lock 71*800a58d9SAndroid Build Coastguard Worker 72*800a58d9SAndroid Build Coastguard Worker delete_report = report.Report(command="delete") 73*800a58d9SAndroid Build Coastguard Worker delete.DeleteLocalCuttlefishInstance(instance_object, delete_report) 74*800a58d9SAndroid Build Coastguard Worker 75*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "FAIL") 76*800a58d9SAndroid Build Coastguard Worker mock_lock.SetInUse.assert_called_once_with(False) 77*800a58d9SAndroid Build Coastguard Worker mock_lock.Unlock.assert_called_once() 78*800a58d9SAndroid Build Coastguard Worker 79*800a58d9SAndroid Build Coastguard Worker def testDeleteLocalGoldfishInstanceSuccess(self): 80*800a58d9SAndroid Build Coastguard Worker """Test DeleteLocalGoldfishInstance.""" 81*800a58d9SAndroid Build Coastguard Worker mock_adb_tools = mock.Mock() 82*800a58d9SAndroid Build Coastguard Worker mock_adb_tools.EmuCommand.return_value = 0 83*800a58d9SAndroid Build Coastguard Worker mock_instance = mock.Mock(adb=mock_adb_tools, 84*800a58d9SAndroid Build Coastguard Worker adb_port=5555, 85*800a58d9SAndroid Build Coastguard Worker device_serial="serial", 86*800a58d9SAndroid Build Coastguard Worker instance_dir="/unit/test") 87*800a58d9SAndroid Build Coastguard Worker # name is a positional argument of Mock(). 88*800a58d9SAndroid Build Coastguard Worker mock_instance.name = "unittest" 89*800a58d9SAndroid Build Coastguard Worker mock_lock = mock.Mock() 90*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.return_value = True 91*800a58d9SAndroid Build Coastguard Worker mock_instance.GetLock.return_value = mock_lock 92*800a58d9SAndroid Build Coastguard Worker 93*800a58d9SAndroid Build Coastguard Worker delete_report = report.Report(command="delete") 94*800a58d9SAndroid Build Coastguard Worker delete.DeleteLocalGoldfishInstance(mock_instance, delete_report) 95*800a58d9SAndroid Build Coastguard Worker 96*800a58d9SAndroid Build Coastguard Worker mock_adb_tools.EmuCommand.assert_called_with("kill") 97*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.data, { 98*800a58d9SAndroid Build Coastguard Worker "deleted": [ 99*800a58d9SAndroid Build Coastguard Worker { 100*800a58d9SAndroid Build Coastguard Worker "type": "instance", 101*800a58d9SAndroid Build Coastguard Worker "name": "unittest", 102*800a58d9SAndroid Build Coastguard Worker }, 103*800a58d9SAndroid Build Coastguard Worker ], 104*800a58d9SAndroid Build Coastguard Worker }) 105*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "SUCCESS") 106*800a58d9SAndroid Build Coastguard Worker mock_lock.SetInUse.assert_called_once_with(False) 107*800a58d9SAndroid Build Coastguard Worker mock_lock.Unlock.assert_called_once() 108*800a58d9SAndroid Build Coastguard Worker 109*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.return_value = False 110*800a58d9SAndroid Build Coastguard Worker delete.DeleteLocalGoldfishInstance(mock_instance, delete_report) 111*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "FAIL") 112*800a58d9SAndroid Build Coastguard Worker 113*800a58d9SAndroid Build Coastguard Worker def testDeleteLocalGoldfishInstanceFailure(self): 114*800a58d9SAndroid Build Coastguard Worker """Test DeleteLocalGoldfishInstance with adb command failure.""" 115*800a58d9SAndroid Build Coastguard Worker mock_adb_tools = mock.Mock() 116*800a58d9SAndroid Build Coastguard Worker mock_adb_tools.EmuCommand.return_value = 1 117*800a58d9SAndroid Build Coastguard Worker mock_instance = mock.Mock(adb=mock_adb_tools, 118*800a58d9SAndroid Build Coastguard Worker adb_port=5555, 119*800a58d9SAndroid Build Coastguard Worker device_serial="serial", 120*800a58d9SAndroid Build Coastguard Worker instance_dir="/unit/test") 121*800a58d9SAndroid Build Coastguard Worker # name is a positional argument of Mock(). 122*800a58d9SAndroid Build Coastguard Worker mock_instance.name = "unittest" 123*800a58d9SAndroid Build Coastguard Worker mock_lock = mock.Mock() 124*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.return_value = True 125*800a58d9SAndroid Build Coastguard Worker mock_instance.GetLock.return_value = mock_lock 126*800a58d9SAndroid Build Coastguard Worker 127*800a58d9SAndroid Build Coastguard Worker delete_report = report.Report(command="delete") 128*800a58d9SAndroid Build Coastguard Worker delete.DeleteLocalGoldfishInstance(mock_instance, delete_report) 129*800a58d9SAndroid Build Coastguard Worker 130*800a58d9SAndroid Build Coastguard Worker mock_adb_tools.EmuCommand.assert_called_with("kill") 131*800a58d9SAndroid Build Coastguard Worker self.assertTrue(len(delete_report.errors) > 0) 132*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "FAIL") 133*800a58d9SAndroid Build Coastguard Worker mock_lock.SetInUse.assert_called_once_with(False) 134*800a58d9SAndroid Build Coastguard Worker mock_lock.Unlock.assert_called_once() 135*800a58d9SAndroid Build Coastguard Worker 136*800a58d9SAndroid Build Coastguard Worker def testResetLocalInstanceLockByName(self): 137*800a58d9SAndroid Build Coastguard Worker """test ResetLocalInstanceLockByName.""" 138*800a58d9SAndroid Build Coastguard Worker mock_lock = mock.Mock() 139*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.return_value = True 140*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instances, "GetLocalInstanceLockByName", 141*800a58d9SAndroid Build Coastguard Worker return_value=mock_lock) 142*800a58d9SAndroid Build Coastguard Worker delete_report = report.Report(command="delete") 143*800a58d9SAndroid Build Coastguard Worker delete.ResetLocalInstanceLockByName("unittest", delete_report) 144*800a58d9SAndroid Build Coastguard Worker 145*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.data, { 146*800a58d9SAndroid Build Coastguard Worker "deleted": [ 147*800a58d9SAndroid Build Coastguard Worker { 148*800a58d9SAndroid Build Coastguard Worker "type": "instance", 149*800a58d9SAndroid Build Coastguard Worker "name": "unittest", 150*800a58d9SAndroid Build Coastguard Worker }, 151*800a58d9SAndroid Build Coastguard Worker ], 152*800a58d9SAndroid Build Coastguard Worker }) 153*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.assert_called_once() 154*800a58d9SAndroid Build Coastguard Worker mock_lock.SetInUse.assert_called_once_with(False) 155*800a58d9SAndroid Build Coastguard Worker mock_lock.Unlock.assert_called_once() 156*800a58d9SAndroid Build Coastguard Worker 157*800a58d9SAndroid Build Coastguard Worker mock_lock.Lock.return_value = False 158*800a58d9SAndroid Build Coastguard Worker delete.ResetLocalInstanceLockByName("unittest", delete_report) 159*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "FAIL") 160*800a58d9SAndroid Build Coastguard Worker 161*800a58d9SAndroid Build Coastguard Worker def testResetLocalInstanceLockByNameFailure(self): 162*800a58d9SAndroid Build Coastguard Worker """test ResetLocalInstanceLockByName with an invalid name.""" 163*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instances, "GetLocalInstanceLockByName", 164*800a58d9SAndroid Build Coastguard Worker return_value=None) 165*800a58d9SAndroid Build Coastguard Worker delete_report = report.Report(command="delete") 166*800a58d9SAndroid Build Coastguard Worker delete.ResetLocalInstanceLockByName("unittest", delete_report) 167*800a58d9SAndroid Build Coastguard Worker 168*800a58d9SAndroid Build Coastguard Worker self.assertTrue(len(delete_report.errors) > 0) 169*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "FAIL") 170*800a58d9SAndroid Build Coastguard Worker 171*800a58d9SAndroid Build Coastguard Worker @mock.patch("acloud.delete.delete.emulator_console.RemoteEmulatorConsole") 172*800a58d9SAndroid Build Coastguard Worker def testDeleteHostGoldfishInstance(self, mock_console): 173*800a58d9SAndroid Build Coastguard Worker """test DeleteHostGoldfishInstance.""" 174*800a58d9SAndroid Build Coastguard Worker mock_console_obj = mock.MagicMock() 175*800a58d9SAndroid Build Coastguard Worker mock_console.return_value = mock_console_obj 176*800a58d9SAndroid Build Coastguard Worker mock_console_obj.__enter__.return_value = mock_console_obj 177*800a58d9SAndroid Build Coastguard Worker 178*800a58d9SAndroid Build Coastguard Worker cfg_attrs = {"ssh_private_key_path": "cfg_key_path", 179*800a58d9SAndroid Build Coastguard Worker "extra_args_ssh_tunnel": "extra args"} 180*800a58d9SAndroid Build Coastguard Worker mock_cfg = mock.Mock(spec_set=list(cfg_attrs.keys()), **cfg_attrs) 181*800a58d9SAndroid Build Coastguard Worker instance_name = "host-goldfish-192.0.2.1-5554-123456-sdk_x86_64-sdk" 182*800a58d9SAndroid Build Coastguard Worker delete_report = report.Report(command="delete") 183*800a58d9SAndroid Build Coastguard Worker 184*800a58d9SAndroid Build Coastguard Worker delete.DeleteHostGoldfishInstance(mock_cfg, instance_name, 185*800a58d9SAndroid Build Coastguard Worker None, None, delete_report) 186*800a58d9SAndroid Build Coastguard Worker mock_console.assert_called_with("192.0.2.1", 5554, "vsoc-01", 187*800a58d9SAndroid Build Coastguard Worker "cfg_key_path", "extra args") 188*800a58d9SAndroid Build Coastguard Worker mock_console_obj.Kill.assert_called() 189*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "SUCCESS") 190*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.data, { 191*800a58d9SAndroid Build Coastguard Worker "deleted": [ 192*800a58d9SAndroid Build Coastguard Worker { 193*800a58d9SAndroid Build Coastguard Worker "type": "instance", 194*800a58d9SAndroid Build Coastguard Worker "name": instance_name, 195*800a58d9SAndroid Build Coastguard Worker }, 196*800a58d9SAndroid Build Coastguard Worker ], 197*800a58d9SAndroid Build Coastguard Worker }) 198*800a58d9SAndroid Build Coastguard Worker 199*800a58d9SAndroid Build Coastguard Worker mock_console_obj.reset_mock() 200*800a58d9SAndroid Build Coastguard Worker mock_console_obj.Kill.side_effect = errors.DeviceConnectionError 201*800a58d9SAndroid Build Coastguard Worker delete_report = report.Report(command="delete") 202*800a58d9SAndroid Build Coastguard Worker 203*800a58d9SAndroid Build Coastguard Worker delete.DeleteHostGoldfishInstance(mock_cfg, instance_name, 204*800a58d9SAndroid Build Coastguard Worker "user", "key_path", delete_report) 205*800a58d9SAndroid Build Coastguard Worker mock_console.assert_called_with("192.0.2.1", 5554, "user", 206*800a58d9SAndroid Build Coastguard Worker "key_path", "extra args") 207*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "FAIL") 208*800a58d9SAndroid Build Coastguard Worker self.assertEqual(len(delete_report.errors), 1) 209*800a58d9SAndroid Build Coastguard Worker 210*800a58d9SAndroid Build Coastguard Worker @mock.patch.object(delete, "ssh") 211*800a58d9SAndroid Build Coastguard Worker @mock.patch.object(delete, "cvd_utils") 212*800a58d9SAndroid Build Coastguard Worker def testCleanUpRemoteHost(self, mock_cvd_utils, mock_ssh): 213*800a58d9SAndroid Build Coastguard Worker """Test CleanUpRemoteHost.""" 214*800a58d9SAndroid Build Coastguard Worker mock_ssh_ip = mock.Mock() 215*800a58d9SAndroid Build Coastguard Worker mock_ssh.IP.return_value = mock_ssh_ip 216*800a58d9SAndroid Build Coastguard Worker mock_ssh_obj = mock.Mock() 217*800a58d9SAndroid Build Coastguard Worker mock_ssh.Ssh.return_value = mock_ssh_obj 218*800a58d9SAndroid Build Coastguard Worker cfg_attrs = {"ssh_private_key_path": "cfg_key_path"} 219*800a58d9SAndroid Build Coastguard Worker mock_cfg = mock.Mock(spec_set=list(cfg_attrs.keys()), **cfg_attrs) 220*800a58d9SAndroid Build Coastguard Worker delete_report = report.Report(command="delete") 221*800a58d9SAndroid Build Coastguard Worker delete.CleanUpRemoteHost(mock_cfg, "192.0.2.1", "vsoc-01", None, ".", 222*800a58d9SAndroid Build Coastguard Worker delete_report) 223*800a58d9SAndroid Build Coastguard Worker 224*800a58d9SAndroid Build Coastguard Worker mock_ssh.IP.assert_called_with(ip="192.0.2.1") 225*800a58d9SAndroid Build Coastguard Worker mock_ssh.Ssh.assert_called_with( 226*800a58d9SAndroid Build Coastguard Worker ip=mock_ssh_ip, 227*800a58d9SAndroid Build Coastguard Worker user="vsoc-01", 228*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path="cfg_key_path") 229*800a58d9SAndroid Build Coastguard Worker mock_cvd_utils.CleanUpRemoteCvd.assert_called_with( 230*800a58d9SAndroid Build Coastguard Worker mock_ssh_obj, ".", raise_error=True) 231*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "SUCCESS") 232*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.data, { 233*800a58d9SAndroid Build Coastguard Worker "deleted": [ 234*800a58d9SAndroid Build Coastguard Worker { 235*800a58d9SAndroid Build Coastguard Worker "type": "remote host", 236*800a58d9SAndroid Build Coastguard Worker "name": "192.0.2.1", 237*800a58d9SAndroid Build Coastguard Worker }, 238*800a58d9SAndroid Build Coastguard Worker ], 239*800a58d9SAndroid Build Coastguard Worker }) 240*800a58d9SAndroid Build Coastguard Worker 241*800a58d9SAndroid Build Coastguard Worker mock_ssh_ip.reset_mock() 242*800a58d9SAndroid Build Coastguard Worker mock_ssh_obj.reset_mock() 243*800a58d9SAndroid Build Coastguard Worker mock_cvd_utils.reset_mock() 244*800a58d9SAndroid Build Coastguard Worker mock_cvd_utils.CleanUpRemoteCvd.side_effect = ( 245*800a58d9SAndroid Build Coastguard Worker subprocess.CalledProcessError(cmd="test", returncode=1)) 246*800a58d9SAndroid Build Coastguard Worker delete_report = report.Report(command="delete") 247*800a58d9SAndroid Build Coastguard Worker 248*800a58d9SAndroid Build Coastguard Worker delete.CleanUpRemoteHost(mock_cfg, "192.0.2.2", "user", "key_path", 249*800a58d9SAndroid Build Coastguard Worker "acloud_cf_1", delete_report) 250*800a58d9SAndroid Build Coastguard Worker mock_ssh.IP.assert_called_with(ip="192.0.2.2") 251*800a58d9SAndroid Build Coastguard Worker mock_ssh.Ssh.assert_called_with( 252*800a58d9SAndroid Build Coastguard Worker ip=mock_ssh_ip, 253*800a58d9SAndroid Build Coastguard Worker user="user", 254*800a58d9SAndroid Build Coastguard Worker ssh_private_key_path="key_path") 255*800a58d9SAndroid Build Coastguard Worker mock_cvd_utils.CleanUpRemoteCvd.assert_called_with( 256*800a58d9SAndroid Build Coastguard Worker mock_ssh_obj, "acloud_cf_1", raise_error=True) 257*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "FAIL") 258*800a58d9SAndroid Build Coastguard Worker self.assertEqual(len(delete_report.errors), 1) 259*800a58d9SAndroid Build Coastguard Worker 260*800a58d9SAndroid Build Coastguard Worker @mock.patch.object(delete, "DeleteInstances", return_value="") 261*800a58d9SAndroid Build Coastguard Worker @mock.patch.object(delete, "ResetLocalInstanceLockByName") 262*800a58d9SAndroid Build Coastguard Worker @mock.patch.object(delete, "CleanUpRemoteHost") 263*800a58d9SAndroid Build Coastguard Worker @mock.patch.object(delete, "DeleteHostGoldfishInstance") 264*800a58d9SAndroid Build Coastguard Worker @mock.patch.object(delete, "DeleteRemoteInstances", return_value="") 265*800a58d9SAndroid Build Coastguard Worker def testDeleteInstanceByNames(self, mock_delete_remote_ins, 266*800a58d9SAndroid Build Coastguard Worker mock_delete_host_gf_ins, 267*800a58d9SAndroid Build Coastguard Worker mock_clean_up_remote_host, mock_reset_lock, 268*800a58d9SAndroid Build Coastguard Worker mock_delete_local_ins): 269*800a58d9SAndroid Build Coastguard Worker """test DeleteInstanceByNames.""" 270*800a58d9SAndroid Build Coastguard Worker cfg = mock.Mock() 271*800a58d9SAndroid Build Coastguard Worker # Test delete local instances. 272*800a58d9SAndroid Build Coastguard Worker instances = ["local-instance-1", "local-instance-2"] 273*800a58d9SAndroid Build Coastguard Worker mock_local_ins = mock.Mock() 274*800a58d9SAndroid Build Coastguard Worker mock_local_ins.name = "local-instance-1" 275*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instances, "GetLocalInstancesByNames", 276*800a58d9SAndroid Build Coastguard Worker return_value=[mock_local_ins]) 277*800a58d9SAndroid Build Coastguard Worker delete.DeleteInstanceByNames(cfg, instances, None, None) 278*800a58d9SAndroid Build Coastguard Worker mock_delete_local_ins.assert_called_with(cfg, [mock_local_ins]) 279*800a58d9SAndroid Build Coastguard Worker mock_reset_lock.assert_called_with("local-instance-2", mock.ANY) 280*800a58d9SAndroid Build Coastguard Worker 281*800a58d9SAndroid Build Coastguard Worker # Test delete remote host instances. 282*800a58d9SAndroid Build Coastguard Worker instances = ["host-goldfish-192.0.2.1-5554-123456-sdk_x86_64-sdk", 283*800a58d9SAndroid Build Coastguard Worker "host-192.0.2.2-3-123456-aosp_cf_x86_64_phone"] 284*800a58d9SAndroid Build Coastguard Worker delete.DeleteInstanceByNames(cfg, instances, "user", "key") 285*800a58d9SAndroid Build Coastguard Worker mock_delete_host_gf_ins.assert_called_with( 286*800a58d9SAndroid Build Coastguard Worker cfg, instances[0], "user", "key", mock.ANY) 287*800a58d9SAndroid Build Coastguard Worker mock_clean_up_remote_host.assert_called_with( 288*800a58d9SAndroid Build Coastguard Worker cfg, "192.0.2.2", "user", "key", "acloud_cf_3", mock.ANY) 289*800a58d9SAndroid Build Coastguard Worker 290*800a58d9SAndroid Build Coastguard Worker # Test delete remote instances. 291*800a58d9SAndroid Build Coastguard Worker instances = ["ins-id1-cf-x86-phone-userdebug", 292*800a58d9SAndroid Build Coastguard Worker "ins-id2-cf-x86-phone-userdebug"] 293*800a58d9SAndroid Build Coastguard Worker delete.DeleteInstanceByNames(cfg, instances, None, None) 294*800a58d9SAndroid Build Coastguard Worker mock_delete_remote_ins.assert_called() 295*800a58d9SAndroid Build Coastguard Worker 296*800a58d9SAndroid Build Coastguard Worker @mock.patch.object(oxygen_client.OxygenClient, "ReleaseDevice") 297*800a58d9SAndroid Build Coastguard Worker def testReleaseOxygenDevice(self, mock_release): 298*800a58d9SAndroid Build Coastguard Worker """test ReleaseOxygenDevice""" 299*800a58d9SAndroid Build Coastguard Worker cfg = mock.Mock() 300*800a58d9SAndroid Build Coastguard Worker cfg.oxygen_client = "oxygen_client" 301*800a58d9SAndroid Build Coastguard Worker ip = "0.0.0.0" 302*800a58d9SAndroid Build Coastguard Worker # Raise exception for multiple instances 303*800a58d9SAndroid Build Coastguard Worker instances = ["local-instance-1", "local-instance-2"] 304*800a58d9SAndroid Build Coastguard Worker self.assertRaises(errors.CommandArgError, delete._ReleaseOxygenDevice, cfg, instances, ip) 305*800a58d9SAndroid Build Coastguard Worker 306*800a58d9SAndroid Build Coastguard Worker # Test release device with oxygen client 307*800a58d9SAndroid Build Coastguard Worker instances = ["local-instance-1"] 308*800a58d9SAndroid Build Coastguard Worker delete._ReleaseOxygenDevice(cfg, instances, ip) 309*800a58d9SAndroid Build Coastguard Worker mock_release.assert_called_once() 310*800a58d9SAndroid Build Coastguard Worker 311*800a58d9SAndroid Build Coastguard Worker mock_release.side_effect = subprocess.CalledProcessError( 312*800a58d9SAndroid Build Coastguard Worker 0, "fake_cmd", 313*800a58d9SAndroid Build Coastguard Worker "Error received while trying to release device: error_msg") 314*800a58d9SAndroid Build Coastguard Worker delete_report = delete._ReleaseOxygenDevice(cfg, instances, ip) 315*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.errors, ["error_msg"]) 316*800a58d9SAndroid Build Coastguard Worker 317*800a58d9SAndroid Build Coastguard Worker mock_release.side_effect = subprocess.CalledProcessError( 318*800a58d9SAndroid Build Coastguard Worker 0, "fake_cmd", 319*800a58d9SAndroid Build Coastguard Worker "error") 320*800a58d9SAndroid Build Coastguard Worker delete_report = delete._ReleaseOxygenDevice(cfg, instances, ip) 321*800a58d9SAndroid Build Coastguard Worker self.assertEqual(delete_report.status, "FAIL") 322*800a58d9SAndroid Build Coastguard Worker 323*800a58d9SAndroid Build Coastguard Worker def testDeleteInstances(self): 324*800a58d9SAndroid Build Coastguard Worker """test DeleteInstances.""" 325*800a58d9SAndroid Build Coastguard Worker fake_ins = mock.MagicMock() 326*800a58d9SAndroid Build Coastguard Worker fake_ins.islocal = False 327*800a58d9SAndroid Build Coastguard Worker fake_ins.avd_type = "cuttlefish" 328*800a58d9SAndroid Build Coastguard Worker fake_ins.vnc_port = None 329*800a58d9SAndroid Build Coastguard Worker 330*800a58d9SAndroid Build Coastguard Worker fake_ins2 = mock.MagicMock() 331*800a58d9SAndroid Build Coastguard Worker fake_ins2.islocal = True 332*800a58d9SAndroid Build Coastguard Worker fake_ins2.avd_type = "cuttlefish" 333*800a58d9SAndroid Build Coastguard Worker fake_ins2.vnc_port = None 334*800a58d9SAndroid Build Coastguard Worker 335*800a58d9SAndroid Build Coastguard Worker fake_ins3 = mock.MagicMock() 336*800a58d9SAndroid Build Coastguard Worker fake_ins3.islocal = True 337*800a58d9SAndroid Build Coastguard Worker fake_ins3.avd_type = "goldfish" 338*800a58d9SAndroid Build Coastguard Worker fake_ins3.vnc_port = None 339*800a58d9SAndroid Build Coastguard Worker 340*800a58d9SAndroid Build Coastguard Worker fake_ins4 = mock.MagicMock() 341*800a58d9SAndroid Build Coastguard Worker fake_ins4.islocal = True 342*800a58d9SAndroid Build Coastguard Worker fake_ins4.avd_type = "unknown" 343*800a58d9SAndroid Build Coastguard Worker fake_ins4.vnc_port = 12345 344*800a58d9SAndroid Build Coastguard Worker 345*800a58d9SAndroid Build Coastguard Worker self.Patch(delete, "DeleteLocalGoldfishInstance") 346*800a58d9SAndroid Build Coastguard Worker self.Patch(delete, "DeleteLocalCuttlefishInstance") 347*800a58d9SAndroid Build Coastguard Worker self.Patch(delete, "DeleteRemoteInstances") 348*800a58d9SAndroid Build Coastguard Worker self.Patch(utils, "CleanupSSVncviewer") 349*800a58d9SAndroid Build Coastguard Worker 350*800a58d9SAndroid Build Coastguard Worker fake_instances_to_delete = [] 351*800a58d9SAndroid Build Coastguard Worker delete.DeleteInstances(None, fake_instances_to_delete) 352*800a58d9SAndroid Build Coastguard Worker delete.DeleteRemoteInstances.assert_not_called() 353*800a58d9SAndroid Build Coastguard Worker 354*800a58d9SAndroid Build Coastguard Worker fake_instances_to_delete = [ 355*800a58d9SAndroid Build Coastguard Worker fake_ins, fake_ins2, fake_ins3, fake_ins4] 356*800a58d9SAndroid Build Coastguard Worker delete.DeleteInstances(None, fake_instances_to_delete) 357*800a58d9SAndroid Build Coastguard Worker delete.DeleteRemoteInstances.assert_called_once() 358*800a58d9SAndroid Build Coastguard Worker delete.DeleteLocalGoldfishInstance.assert_called_once() 359*800a58d9SAndroid Build Coastguard Worker delete.DeleteLocalCuttlefishInstance.assert_called_once() 360*800a58d9SAndroid Build Coastguard Worker utils.CleanupSSVncviewer.assert_called_once() 361*800a58d9SAndroid Build Coastguard Worker 362*800a58d9SAndroid Build Coastguard Worker def testDeleteRemoteInstances(self): 363*800a58d9SAndroid Build Coastguard Worker """test DeleteRemoteInstances.""" 364*800a58d9SAndroid Build Coastguard Worker fake_cfg = mock.MagicMock() 365*800a58d9SAndroid Build Coastguard Worker fake_cfg.SupportRemoteInstance = mock.MagicMock() 366*800a58d9SAndroid Build Coastguard Worker fake_cfg.SupportRemoteInstance.return_value = True 367*800a58d9SAndroid Build Coastguard Worker fake_instances_to_delete = ["fake_ins"] 368*800a58d9SAndroid Build Coastguard Worker delete_report = report.Report(command="delete") 369*800a58d9SAndroid Build Coastguard Worker self.Patch(device_driver, "DeleteAndroidVirtualDevices", 370*800a58d9SAndroid Build Coastguard Worker return_value=delete_report) 371*800a58d9SAndroid Build Coastguard Worker delete.DeleteRemoteInstances(fake_cfg, fake_instances_to_delete) 372*800a58d9SAndroid Build Coastguard Worker device_driver.DeleteAndroidVirtualDevices.assert_called_once() 373*800a58d9SAndroid Build Coastguard Worker 374*800a58d9SAndroid Build Coastguard Worker fake_cfg.SupportRemoteInstance.return_value = False 375*800a58d9SAndroid Build Coastguard Worker self.assertRaises(errors.ConfigError, 376*800a58d9SAndroid Build Coastguard Worker delete.DeleteRemoteInstances, 377*800a58d9SAndroid Build Coastguard Worker fake_cfg, fake_instances_to_delete) 378*800a58d9SAndroid Build Coastguard Worker 379*800a58d9SAndroid Build Coastguard Worker def testRun(self): 380*800a58d9SAndroid Build Coastguard Worker """test Run.""" 381*800a58d9SAndroid Build Coastguard Worker args = mock.MagicMock() 382*800a58d9SAndroid Build Coastguard Worker args.oxygen = False 383*800a58d9SAndroid Build Coastguard Worker args.instance_names = None 384*800a58d9SAndroid Build Coastguard Worker args.remote_host = None 385*800a58d9SAndroid Build Coastguard Worker args.local_only = True 386*800a58d9SAndroid Build Coastguard Worker args.adb_port = None 387*800a58d9SAndroid Build Coastguard Worker args.all = True 388*800a58d9SAndroid Build Coastguard Worker 389*800a58d9SAndroid Build Coastguard Worker self.Patch(delete, "_ReleaseOxygenDevice") 390*800a58d9SAndroid Build Coastguard Worker self.Patch(delete, "DeleteInstanceByNames") 391*800a58d9SAndroid Build Coastguard Worker self.Patch(delete, "CleanUpRemoteHost") 392*800a58d9SAndroid Build Coastguard Worker fake_cfg = mock.MagicMock() 393*800a58d9SAndroid Build Coastguard Worker fake_cfg.SupportRemoteInstance = mock.MagicMock() 394*800a58d9SAndroid Build Coastguard Worker self.Patch(config, "GetAcloudConfig", return_value=fake_cfg) 395*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instances, "GetLocalInstances", 396*800a58d9SAndroid Build Coastguard Worker return_value=[]) 397*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instances, "GetRemoteInstances", 398*800a58d9SAndroid Build Coastguard Worker return_value=["remote_instances"]) 399*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instances, "FilterInstancesByAdbPort", 400*800a58d9SAndroid Build Coastguard Worker return_value=["filter_by_port_instance"]) 401*800a58d9SAndroid Build Coastguard Worker self.Patch(list_instances, "ChooseInstancesFromList", 402*800a58d9SAndroid Build Coastguard Worker return_value=["choice_instance"]) 403*800a58d9SAndroid Build Coastguard Worker self.Patch(delete, "DeleteInstances") 404*800a58d9SAndroid Build Coastguard Worker 405*800a58d9SAndroid Build Coastguard Worker delete.Run(args) 406*800a58d9SAndroid Build Coastguard Worker delete.DeleteInstances.assert_called_with(fake_cfg, []) 407*800a58d9SAndroid Build Coastguard Worker 408*800a58d9SAndroid Build Coastguard Worker list_instances.GetLocalInstances.return_value = ["local_instances"] 409*800a58d9SAndroid Build Coastguard Worker delete.Run(args) 410*800a58d9SAndroid Build Coastguard Worker delete.DeleteInstances.assert_called_with(fake_cfg, ["local_instances"]) 411*800a58d9SAndroid Build Coastguard Worker 412*800a58d9SAndroid Build Coastguard Worker args.all = False 413*800a58d9SAndroid Build Coastguard Worker delete.Run(args) 414*800a58d9SAndroid Build Coastguard Worker delete.DeleteInstances.assert_called_with(fake_cfg, ["choice_instance"]) 415*800a58d9SAndroid Build Coastguard Worker 416*800a58d9SAndroid Build Coastguard Worker args.adb_port = "12345" 417*800a58d9SAndroid Build Coastguard Worker delete.Run(args) 418*800a58d9SAndroid Build Coastguard Worker delete.DeleteInstances.assert_called_with(fake_cfg, ["filter_by_port_instance"]) 419*800a58d9SAndroid Build Coastguard Worker 420*800a58d9SAndroid Build Coastguard Worker args.local_only = False 421*800a58d9SAndroid Build Coastguard Worker args.all = True 422*800a58d9SAndroid Build Coastguard Worker args.adb_port = None 423*800a58d9SAndroid Build Coastguard Worker delete.Run(args) 424*800a58d9SAndroid Build Coastguard Worker delete.DeleteInstances.assert_called_with( 425*800a58d9SAndroid Build Coastguard Worker fake_cfg, ["local_instances", "remote_instances"]) 426*800a58d9SAndroid Build Coastguard Worker 427*800a58d9SAndroid Build Coastguard Worker args.remote_host = True 428*800a58d9SAndroid Build Coastguard Worker delete.Run(args) 429*800a58d9SAndroid Build Coastguard Worker delete.CleanUpRemoteHost.assert_called_once() 430*800a58d9SAndroid Build Coastguard Worker 431*800a58d9SAndroid Build Coastguard Worker args.instance_names = ["fake_ins_name"] 432*800a58d9SAndroid Build Coastguard Worker delete.Run(args) 433*800a58d9SAndroid Build Coastguard Worker delete.DeleteInstanceByNames.assert_called_once() 434*800a58d9SAndroid Build Coastguard Worker 435*800a58d9SAndroid Build Coastguard Worker args.oxygen = True 436*800a58d9SAndroid Build Coastguard Worker delete.Run(args) 437*800a58d9SAndroid Build Coastguard Worker delete._ReleaseOxygenDevice.assert_called_once() 438*800a58d9SAndroid Build Coastguard Worker 439*800a58d9SAndroid Build Coastguard Worker 440*800a58d9SAndroid Build Coastguard Workerif __name__ == "__main__": 441*800a58d9SAndroid Build Coastguard Worker unittest.main() 442