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