xref: /aosp_15_r20/tools/acloud/public/device_driver_test.py (revision 800a58d989c669b8eb8a71d8df53b1ba3d411444)
1*800a58d9SAndroid Build Coastguard Worker#!/usr/bin/env python
2*800a58d9SAndroid Build Coastguard Worker#
3*800a58d9SAndroid Build Coastguard Worker# Copyright 2016 - The Android Open Source Project
4*800a58d9SAndroid Build Coastguard Worker#
5*800a58d9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*800a58d9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*800a58d9SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*800a58d9SAndroid Build Coastguard Worker#
9*800a58d9SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
10*800a58d9SAndroid Build Coastguard Worker#
11*800a58d9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*800a58d9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*800a58d9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*800a58d9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*800a58d9SAndroid Build Coastguard Worker# limitations under the License.
16*800a58d9SAndroid Build Coastguard Worker
17*800a58d9SAndroid Build Coastguard Worker"""Tests for acloud.public.device_driver."""
18*800a58d9SAndroid Build Coastguard Worker
19*800a58d9SAndroid Build Coastguard Workerimport uuid
20*800a58d9SAndroid Build Coastguard Worker
21*800a58d9SAndroid Build Coastguard Workerimport unittest
22*800a58d9SAndroid Build Coastguard Worker
23*800a58d9SAndroid Build Coastguard Workerfrom unittest import mock
24*800a58d9SAndroid Build Coastguard Worker
25*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import auth
26*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import android_build_client
27*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import android_compute_client
28*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import driver_test_lib
29*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import gstorage_client
30*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import ssh
31*800a58d9SAndroid Build Coastguard Workerfrom acloud.public import device_driver
32*800a58d9SAndroid Build Coastguard Worker
33*800a58d9SAndroid Build Coastguard Worker
34*800a58d9SAndroid Build Coastguard Workerdef _CreateCfg():
35*800a58d9SAndroid Build Coastguard Worker    """A helper method that creates a mock configuration object."""
36*800a58d9SAndroid Build Coastguard Worker    cfg = mock.MagicMock()
37*800a58d9SAndroid Build Coastguard Worker    cfg.service_account_name = "[email protected]"
38*800a58d9SAndroid Build Coastguard Worker    cfg.service_account_private_key_path = "/fake/path/to/key"
39*800a58d9SAndroid Build Coastguard Worker    cfg.zone = "fake_zone"
40*800a58d9SAndroid Build Coastguard Worker    cfg.disk_image_name = "fake_image.tar.gz"
41*800a58d9SAndroid Build Coastguard Worker    cfg.disk_image_mime_type = "fake/type"
42*800a58d9SAndroid Build Coastguard Worker    cfg.storage_bucket_name = "fake_bucket"
43*800a58d9SAndroid Build Coastguard Worker    cfg.extra_data_disk_size_gb = 4
44*800a58d9SAndroid Build Coastguard Worker    cfg.precreated_data_image_map = {
45*800a58d9SAndroid Build Coastguard Worker        4: "extradisk-image-4gb",
46*800a58d9SAndroid Build Coastguard Worker        10: "extradisk-image-10gb"
47*800a58d9SAndroid Build Coastguard Worker    }
48*800a58d9SAndroid Build Coastguard Worker    cfg.extra_scopes = None
49*800a58d9SAndroid Build Coastguard Worker    cfg.ssh_private_key_path = ""
50*800a58d9SAndroid Build Coastguard Worker    cfg.ssh_public_key_path = ""
51*800a58d9SAndroid Build Coastguard Worker
52*800a58d9SAndroid Build Coastguard Worker    return cfg
53*800a58d9SAndroid Build Coastguard Worker
54*800a58d9SAndroid Build Coastguard Worker
55*800a58d9SAndroid Build Coastguard Workerclass DeviceDriverTest(driver_test_lib.BaseDriverTest):
56*800a58d9SAndroid Build Coastguard Worker    """Test device_driver."""
57*800a58d9SAndroid Build Coastguard Worker
58*800a58d9SAndroid Build Coastguard Worker    def setUp(self):
59*800a58d9SAndroid Build Coastguard Worker        """Set up the test."""
60*800a58d9SAndroid Build Coastguard Worker        super().setUp()
61*800a58d9SAndroid Build Coastguard Worker        self.build_client = mock.MagicMock()
62*800a58d9SAndroid Build Coastguard Worker        self.Patch(android_build_client, "AndroidBuildClient",
63*800a58d9SAndroid Build Coastguard Worker                   return_value=self.build_client)
64*800a58d9SAndroid Build Coastguard Worker        self.storage_client = mock.MagicMock()
65*800a58d9SAndroid Build Coastguard Worker        self.Patch(
66*800a58d9SAndroid Build Coastguard Worker            gstorage_client, "StorageClient", return_value=self.storage_client)
67*800a58d9SAndroid Build Coastguard Worker        self.compute_client = mock.MagicMock()
68*800a58d9SAndroid Build Coastguard Worker        self.Patch(
69*800a58d9SAndroid Build Coastguard Worker            android_compute_client,
70*800a58d9SAndroid Build Coastguard Worker            "AndroidComputeClient",
71*800a58d9SAndroid Build Coastguard Worker            return_value=self.compute_client)
72*800a58d9SAndroid Build Coastguard Worker        self.Patch(auth, "CreateCredentials", return_value=mock.MagicMock())
73*800a58d9SAndroid Build Coastguard Worker        self.fake_avd_spec = mock.MagicMock()
74*800a58d9SAndroid Build Coastguard Worker        self.fake_avd_spec.unlock_screen = False
75*800a58d9SAndroid Build Coastguard Worker        self.fake_avd_spec.client_adb_port = 1234
76*800a58d9SAndroid Build Coastguard Worker
77*800a58d9SAndroid Build Coastguard Worker    def testCreateGCETypeAVD(self):
78*800a58d9SAndroid Build Coastguard Worker        """Test CreateGCETypeAVD."""
79*800a58d9SAndroid Build Coastguard Worker        cfg = _CreateCfg()
80*800a58d9SAndroid Build Coastguard Worker        fake_gs_url = "fake_gs_url"
81*800a58d9SAndroid Build Coastguard Worker        fake_ip = ssh.IP(external="140.1.1.1", internal="10.1.1.1")
82*800a58d9SAndroid Build Coastguard Worker        fake_instance = "fake-instance"
83*800a58d9SAndroid Build Coastguard Worker        fake_image = "fake-image"
84*800a58d9SAndroid Build Coastguard Worker        fake_build_target = "fake_target"
85*800a58d9SAndroid Build Coastguard Worker        fake_build_id = "12345"
86*800a58d9SAndroid Build Coastguard Worker
87*800a58d9SAndroid Build Coastguard Worker        # Mock uuid
88*800a58d9SAndroid Build Coastguard Worker        fake_uuid = mock.MagicMock(hex="1234")
89*800a58d9SAndroid Build Coastguard Worker        self.Patch(uuid, "uuid4", return_value=fake_uuid)
90*800a58d9SAndroid Build Coastguard Worker        fake_gs_object = fake_uuid.hex + "-" + cfg.disk_image_name
91*800a58d9SAndroid Build Coastguard Worker        self.storage_client.GetUrl.return_value = fake_gs_url
92*800a58d9SAndroid Build Coastguard Worker
93*800a58d9SAndroid Build Coastguard Worker        # Mock compute client methods
94*800a58d9SAndroid Build Coastguard Worker        disk_name = "extradisk-image-4gb"
95*800a58d9SAndroid Build Coastguard Worker        self.compute_client.GetInstanceIP.return_value = fake_ip
96*800a58d9SAndroid Build Coastguard Worker        self.compute_client.GenerateImageName.return_value = fake_image
97*800a58d9SAndroid Build Coastguard Worker        self.compute_client.GenerateInstanceName.return_value = fake_instance
98*800a58d9SAndroid Build Coastguard Worker        self.compute_client.GetDataDiskName.return_value = disk_name
99*800a58d9SAndroid Build Coastguard Worker
100*800a58d9SAndroid Build Coastguard Worker        # Verify
101*800a58d9SAndroid Build Coastguard Worker        report = device_driver.CreateGCETypeAVD(
102*800a58d9SAndroid Build Coastguard Worker            cfg, fake_build_target, fake_build_id, avd_spec=self.fake_avd_spec)
103*800a58d9SAndroid Build Coastguard Worker        self.build_client.CopyTo.assert_called_with(
104*800a58d9SAndroid Build Coastguard Worker            fake_build_target, fake_build_id, artifact_name=cfg.disk_image_name,
105*800a58d9SAndroid Build Coastguard Worker            destination_bucket=cfg.storage_bucket_name,
106*800a58d9SAndroid Build Coastguard Worker            destination_path=fake_gs_object)
107*800a58d9SAndroid Build Coastguard Worker        self.compute_client.CreateImage.assert_called_with(
108*800a58d9SAndroid Build Coastguard Worker            image_name=fake_image, source_uri=fake_gs_url)
109*800a58d9SAndroid Build Coastguard Worker        self.compute_client.CreateInstance.assert_called_with(
110*800a58d9SAndroid Build Coastguard Worker            instance=fake_instance,
111*800a58d9SAndroid Build Coastguard Worker            image_name=fake_image,
112*800a58d9SAndroid Build Coastguard Worker            extra_disk_name=disk_name,
113*800a58d9SAndroid Build Coastguard Worker            avd_spec=self.fake_avd_spec,
114*800a58d9SAndroid Build Coastguard Worker            extra_scopes=None)
115*800a58d9SAndroid Build Coastguard Worker        self.compute_client.DeleteImage.assert_called_with(fake_image)
116*800a58d9SAndroid Build Coastguard Worker        self.storage_client.Delete(cfg.storage_bucket_name, fake_gs_object)
117*800a58d9SAndroid Build Coastguard Worker
118*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
119*800a58d9SAndroid Build Coastguard Worker            report.data,
120*800a58d9SAndroid Build Coastguard Worker            {
121*800a58d9SAndroid Build Coastguard Worker                "devices": [
122*800a58d9SAndroid Build Coastguard Worker                    {
123*800a58d9SAndroid Build Coastguard Worker                        "instance_name": fake_instance,
124*800a58d9SAndroid Build Coastguard Worker                        "ip": fake_ip.external,
125*800a58d9SAndroid Build Coastguard Worker                    },
126*800a58d9SAndroid Build Coastguard Worker                ],
127*800a58d9SAndroid Build Coastguard Worker            }
128*800a58d9SAndroid Build Coastguard Worker        )
129*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(report.command, "create")
130*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(report.status, "SUCCESS")
131*800a58d9SAndroid Build Coastguard Worker
132*800a58d9SAndroid Build Coastguard Worker    # pylint: disable=invalid-name
133*800a58d9SAndroid Build Coastguard Worker    def testCreateGCETypeAVDInternalIP(self):
134*800a58d9SAndroid Build Coastguard Worker        """Test CreateGCETypeAVD with internal IP."""
135*800a58d9SAndroid Build Coastguard Worker        cfg = _CreateCfg()
136*800a58d9SAndroid Build Coastguard Worker        fake_ip = ssh.IP(external="140.1.1.1", internal="10.1.1.1")
137*800a58d9SAndroid Build Coastguard Worker        fake_instance = "fake-instance"
138*800a58d9SAndroid Build Coastguard Worker        fake_build_target = "fake_target"
139*800a58d9SAndroid Build Coastguard Worker        fake_build_id = "12345"
140*800a58d9SAndroid Build Coastguard Worker
141*800a58d9SAndroid Build Coastguard Worker        self.compute_client.GetInstanceIP.return_value = fake_ip
142*800a58d9SAndroid Build Coastguard Worker        self.compute_client.GenerateInstanceName.return_value = fake_instance
143*800a58d9SAndroid Build Coastguard Worker
144*800a58d9SAndroid Build Coastguard Worker        report = device_driver.CreateGCETypeAVD(
145*800a58d9SAndroid Build Coastguard Worker            cfg, fake_build_target, fake_build_id, report_internal_ip=True,
146*800a58d9SAndroid Build Coastguard Worker            avd_spec=self.fake_avd_spec)
147*800a58d9SAndroid Build Coastguard Worker
148*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
149*800a58d9SAndroid Build Coastguard Worker            report.data,
150*800a58d9SAndroid Build Coastguard Worker            {
151*800a58d9SAndroid Build Coastguard Worker                "devices": [
152*800a58d9SAndroid Build Coastguard Worker                    {
153*800a58d9SAndroid Build Coastguard Worker                        "instance_name": fake_instance,
154*800a58d9SAndroid Build Coastguard Worker                        "ip": fake_ip.internal,
155*800a58d9SAndroid Build Coastguard Worker                    },
156*800a58d9SAndroid Build Coastguard Worker                ],
157*800a58d9SAndroid Build Coastguard Worker            }
158*800a58d9SAndroid Build Coastguard Worker        )
159*800a58d9SAndroid Build Coastguard Worker
160*800a58d9SAndroid Build Coastguard Worker    def testDeleteAndroidVirtualDevices(self):
161*800a58d9SAndroid Build Coastguard Worker        """Test DeleteAndroidVirtualDevices."""
162*800a58d9SAndroid Build Coastguard Worker        cfg = _CreateCfg()
163*800a58d9SAndroid Build Coastguard Worker        instance_names = ["fake-instance-1", "fake-instance-2"]
164*800a58d9SAndroid Build Coastguard Worker        self.compute_client.GetZonesByInstances.return_value = (
165*800a58d9SAndroid Build Coastguard Worker            {cfg.zone: instance_names})
166*800a58d9SAndroid Build Coastguard Worker        self.compute_client.DeleteInstances.return_value = (instance_names, [],
167*800a58d9SAndroid Build Coastguard Worker                                                            [])
168*800a58d9SAndroid Build Coastguard Worker        report = device_driver.DeleteAndroidVirtualDevices(cfg, instance_names)
169*800a58d9SAndroid Build Coastguard Worker        self.compute_client.DeleteInstances.assert_called_once_with(
170*800a58d9SAndroid Build Coastguard Worker            instance_names, cfg.zone)
171*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(report.data, {
172*800a58d9SAndroid Build Coastguard Worker            "deleted": [
173*800a58d9SAndroid Build Coastguard Worker                {
174*800a58d9SAndroid Build Coastguard Worker                    "name": instance_names[0],
175*800a58d9SAndroid Build Coastguard Worker                    "type": "instance",
176*800a58d9SAndroid Build Coastguard Worker                },
177*800a58d9SAndroid Build Coastguard Worker                {
178*800a58d9SAndroid Build Coastguard Worker                    "name": instance_names[1],
179*800a58d9SAndroid Build Coastguard Worker                    "type": "instance",
180*800a58d9SAndroid Build Coastguard Worker                },
181*800a58d9SAndroid Build Coastguard Worker            ],
182*800a58d9SAndroid Build Coastguard Worker        })
183*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(report.command, "delete")
184*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(report.status, "SUCCESS")
185*800a58d9SAndroid Build Coastguard Worker
186*800a58d9SAndroid Build Coastguard Worker
187*800a58d9SAndroid Build Coastguard Workerif __name__ == "__main__":
188*800a58d9SAndroid Build Coastguard Worker    unittest.main()
189