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