xref: /aosp_15_r20/tools/acloud/delete/delete_test.py (revision 800a58d989c669b8eb8a71d8df53b1ba3d411444)
1 *800a58d9SAndroid Build Coastguard Worker# Copyright 2018 - The Android Open Source Project
2 *800a58d9SAndroid Build Coastguard Worker#
3 *800a58d9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4 *800a58d9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5 *800a58d9SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6 *800a58d9SAndroid Build Coastguard Worker#
7 *800a58d9SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8 *800a58d9SAndroid Build Coastguard Worker#
9 *800a58d9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10 *800a58d9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11 *800a58d9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 *800a58d9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13 *800a58d9SAndroid Build Coastguard Worker# limitations under the License.
14 *800a58d9SAndroid Build Coastguard Worker"""Tests for 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