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