xref: /aosp_15_r20/tools/acloud/public/actions/common_operations_test.py (revision 800a58d989c669b8eb8a71d8df53b1ba3d411444)
1*800a58d9SAndroid Build Coastguard Worker#!/usr/bin/env python
2*800a58d9SAndroid Build Coastguard Worker#
3*800a58d9SAndroid Build Coastguard Worker# Copyright 2018 - 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"""Tests for acloud.public.actions.common_operations."""
17*800a58d9SAndroid Build Coastguard Worker
18*800a58d9SAndroid Build Coastguard Workerfrom __future__ import absolute_import
19*800a58d9SAndroid Build Coastguard Workerfrom __future__ import division
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 import errors
26*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal import constants
27*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import android_build_client
28*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import android_compute_client
29*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import auth
30*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import driver_test_lib
31*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import utils
32*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import ssh
33*800a58d9SAndroid Build Coastguard Workerfrom acloud.public import report
34*800a58d9SAndroid Build Coastguard Workerfrom acloud.public.actions import common_operations
35*800a58d9SAndroid Build Coastguard Worker
36*800a58d9SAndroid Build Coastguard Worker
37*800a58d9SAndroid Build Coastguard Workerclass CommonOperationsTest(driver_test_lib.BaseDriverTest):
38*800a58d9SAndroid Build Coastguard Worker    """Test Common Operations."""
39*800a58d9SAndroid Build Coastguard Worker    maxDiff = None
40*800a58d9SAndroid Build Coastguard Worker    IP = ssh.IP(external="127.0.0.1", internal="10.0.0.1")
41*800a58d9SAndroid Build Coastguard Worker    INSTANCE = "fake-instance"
42*800a58d9SAndroid Build Coastguard Worker    CMD = "test-cmd"
43*800a58d9SAndroid Build Coastguard Worker    AVD_TYPE = "fake-type"
44*800a58d9SAndroid Build Coastguard Worker    BRANCH = "fake-branch"
45*800a58d9SAndroid Build Coastguard Worker    BUILD_TARGET = "fake-target"
46*800a58d9SAndroid Build Coastguard Worker    BUILD_ID = "fake-build-id"
47*800a58d9SAndroid Build Coastguard Worker    LOGS = [{"path": "/log", "type": "TEXT"}]
48*800a58d9SAndroid Build Coastguard Worker
49*800a58d9SAndroid Build Coastguard Worker    # pylint: disable=protected-access
50*800a58d9SAndroid Build Coastguard Worker    def setUp(self):
51*800a58d9SAndroid Build Coastguard Worker        """Set up the test."""
52*800a58d9SAndroid Build Coastguard Worker        super().setUp()
53*800a58d9SAndroid Build Coastguard Worker        self.build_client = mock.MagicMock()
54*800a58d9SAndroid Build Coastguard Worker        self.device_factory = mock.MagicMock()
55*800a58d9SAndroid Build Coastguard Worker        self.Patch(
56*800a58d9SAndroid Build Coastguard Worker            android_build_client,
57*800a58d9SAndroid Build Coastguard Worker            "AndroidBuildClient",
58*800a58d9SAndroid Build Coastguard Worker            return_value=self.build_client)
59*800a58d9SAndroid Build Coastguard Worker        self.compute_client = mock.MagicMock()
60*800a58d9SAndroid Build Coastguard Worker        self.compute_client.gce_hostname = None
61*800a58d9SAndroid Build Coastguard Worker        self.Patch(
62*800a58d9SAndroid Build Coastguard Worker            android_compute_client,
63*800a58d9SAndroid Build Coastguard Worker            "AndroidComputeClient",
64*800a58d9SAndroid Build Coastguard Worker            return_value=self.compute_client)
65*800a58d9SAndroid Build Coastguard Worker        self.Patch(auth, "CreateCredentials", return_value=mock.MagicMock())
66*800a58d9SAndroid Build Coastguard Worker        self.Patch(self.compute_client, "GetInstanceIP", return_value=self.IP)
67*800a58d9SAndroid Build Coastguard Worker        self.Patch(
68*800a58d9SAndroid Build Coastguard Worker            self.device_factory, "CreateInstance", return_value=self.INSTANCE)
69*800a58d9SAndroid Build Coastguard Worker        self.Patch(
70*800a58d9SAndroid Build Coastguard Worker            self.device_factory,
71*800a58d9SAndroid Build Coastguard Worker            "GetComputeClient",
72*800a58d9SAndroid Build Coastguard Worker            return_value=self.compute_client)
73*800a58d9SAndroid Build Coastguard Worker        self.Patch(self.device_factory, "GetVncPorts", return_value=[6444])
74*800a58d9SAndroid Build Coastguard Worker        self.Patch(self.device_factory, "GetAdbPorts", return_value=[6520])
75*800a58d9SAndroid Build Coastguard Worker        self.Patch(self.device_factory, "GetBuildInfoDict",
76*800a58d9SAndroid Build Coastguard Worker                   return_value={"branch": self.BRANCH,
77*800a58d9SAndroid Build Coastguard Worker                                 "build_id": self.BUILD_ID,
78*800a58d9SAndroid Build Coastguard Worker                                 "build_target": self.BUILD_TARGET,
79*800a58d9SAndroid Build Coastguard Worker                                 "gcs_bucket_build_id": self.BUILD_ID})
80*800a58d9SAndroid Build Coastguard Worker        self.Patch(self.device_factory, "GetLogs",
81*800a58d9SAndroid Build Coastguard Worker                   return_value={self.INSTANCE: self.LOGS})
82*800a58d9SAndroid Build Coastguard Worker        self.Patch(
83*800a58d9SAndroid Build Coastguard Worker            self.device_factory,
84*800a58d9SAndroid Build Coastguard Worker            "GetFetchCvdWrapperLogIfExist", return_value={})
85*800a58d9SAndroid Build Coastguard Worker
86*800a58d9SAndroid Build Coastguard Worker    @staticmethod
87*800a58d9SAndroid Build Coastguard Worker    def _CreateCfg():
88*800a58d9SAndroid Build Coastguard Worker        """A helper method that creates a mock configuration object."""
89*800a58d9SAndroid Build Coastguard Worker        cfg = mock.MagicMock()
90*800a58d9SAndroid Build Coastguard Worker        cfg.service_account_name = "[email protected]"
91*800a58d9SAndroid Build Coastguard Worker        cfg.service_account_private_key_path = "/fake/path/to/key"
92*800a58d9SAndroid Build Coastguard Worker        cfg.zone = "fake_zone"
93*800a58d9SAndroid Build Coastguard Worker        cfg.disk_image_name = "fake_image.tar.gz"
94*800a58d9SAndroid Build Coastguard Worker        cfg.disk_image_mime_type = "fake/type"
95*800a58d9SAndroid Build Coastguard Worker        cfg.ssh_private_key_path = "cfg/private/key"
96*800a58d9SAndroid Build Coastguard Worker        cfg.ssh_public_key_path = ""
97*800a58d9SAndroid Build Coastguard Worker        cfg.extra_args_ssh_tunnel="extra args"
98*800a58d9SAndroid Build Coastguard Worker        return cfg
99*800a58d9SAndroid Build Coastguard Worker
100*800a58d9SAndroid Build Coastguard Worker    def testDevicePoolCreateDevices(self):
101*800a58d9SAndroid Build Coastguard Worker        """Test Device Pool Create Devices."""
102*800a58d9SAndroid Build Coastguard Worker        pool = common_operations.DevicePool(self.device_factory)
103*800a58d9SAndroid Build Coastguard Worker        pool.CreateDevices(5)
104*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.device_factory.CreateInstance.call_count, 5)
105*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(len(pool.devices), 5)
106*800a58d9SAndroid Build Coastguard Worker
107*800a58d9SAndroid Build Coastguard Worker    def testCreateDevices(self):
108*800a58d9SAndroid Build Coastguard Worker        """Test Create Devices."""
109*800a58d9SAndroid Build Coastguard Worker        cfg = self._CreateCfg()
110*800a58d9SAndroid Build Coastguard Worker        _report = common_operations.CreateDevices(self.CMD, cfg,
111*800a58d9SAndroid Build Coastguard Worker                                                  self.device_factory, 1,
112*800a58d9SAndroid Build Coastguard Worker                                                  self.AVD_TYPE)
113*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(_report.command, self.CMD)
114*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(_report.status, report.Status.SUCCESS)
115*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
116*800a58d9SAndroid Build Coastguard Worker            _report.data,
117*800a58d9SAndroid Build Coastguard Worker            {"devices": [{
118*800a58d9SAndroid Build Coastguard Worker                "ip": self.IP.external + ":6520",
119*800a58d9SAndroid Build Coastguard Worker                "instance_name": self.INSTANCE,
120*800a58d9SAndroid Build Coastguard Worker                "branch": self.BRANCH,
121*800a58d9SAndroid Build Coastguard Worker                "build_id": self.BUILD_ID,
122*800a58d9SAndroid Build Coastguard Worker                "build_target": self.BUILD_TARGET,
123*800a58d9SAndroid Build Coastguard Worker                "gcs_bucket_build_id": self.BUILD_ID,
124*800a58d9SAndroid Build Coastguard Worker                "logs": self.LOGS
125*800a58d9SAndroid Build Coastguard Worker            }]})
126*800a58d9SAndroid Build Coastguard Worker
127*800a58d9SAndroid Build Coastguard Worker    def testCreateDevicesWithAdbPort(self):
128*800a58d9SAndroid Build Coastguard Worker        """Test Create Devices with adb port for cuttlefish avd type."""
129*800a58d9SAndroid Build Coastguard Worker        forwarded_ports = mock.Mock(adb_port=12345, vnc_port=56789)
130*800a58d9SAndroid Build Coastguard Worker        mock_auto_connect = self.Patch(utils, "AutoConnect",
131*800a58d9SAndroid Build Coastguard Worker                                       return_value=forwarded_ports)
132*800a58d9SAndroid Build Coastguard Worker        cfg = self._CreateCfg()
133*800a58d9SAndroid Build Coastguard Worker        _report = common_operations.CreateDevices(self.CMD, cfg,
134*800a58d9SAndroid Build Coastguard Worker                                                  self.device_factory, 1,
135*800a58d9SAndroid Build Coastguard Worker                                                  "cuttlefish",
136*800a58d9SAndroid Build Coastguard Worker                                                  autoconnect=True,
137*800a58d9SAndroid Build Coastguard Worker                                                  client_adb_port=12345)
138*800a58d9SAndroid Build Coastguard Worker
139*800a58d9SAndroid Build Coastguard Worker        mock_auto_connect.assert_called_with(
140*800a58d9SAndroid Build Coastguard Worker            ip_addr="127.0.0.1", rsa_key_file="cfg/private/key",
141*800a58d9SAndroid Build Coastguard Worker            target_vnc_port=6444, target_adb_port=6520,
142*800a58d9SAndroid Build Coastguard Worker            ssh_user=constants.GCE_USER, client_adb_port=12345,
143*800a58d9SAndroid Build Coastguard Worker            extra_args_ssh_tunnel="extra args")
144*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(_report.command, self.CMD)
145*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(_report.status, report.Status.SUCCESS)
146*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
147*800a58d9SAndroid Build Coastguard Worker            _report.data,
148*800a58d9SAndroid Build Coastguard Worker            {"devices": [{
149*800a58d9SAndroid Build Coastguard Worker                "ip": self.IP.external + ":6520",
150*800a58d9SAndroid Build Coastguard Worker                "instance_name": self.INSTANCE,
151*800a58d9SAndroid Build Coastguard Worker                "branch": self.BRANCH,
152*800a58d9SAndroid Build Coastguard Worker                "build_id": self.BUILD_ID,
153*800a58d9SAndroid Build Coastguard Worker                "adb_port": 12345,
154*800a58d9SAndroid Build Coastguard Worker                "device_serial": "127.0.0.1:12345",
155*800a58d9SAndroid Build Coastguard Worker                "vnc_port": 56789,
156*800a58d9SAndroid Build Coastguard Worker                "build_target": self.BUILD_TARGET,
157*800a58d9SAndroid Build Coastguard Worker                "gcs_bucket_build_id": self.BUILD_ID,
158*800a58d9SAndroid Build Coastguard Worker                "logs": self.LOGS
159*800a58d9SAndroid Build Coastguard Worker            }]})
160*800a58d9SAndroid Build Coastguard Worker
161*800a58d9SAndroid Build Coastguard Worker    def testCreateDevicesMultipleDevices(self):
162*800a58d9SAndroid Build Coastguard Worker        """Test Create Devices with multiple cuttlefish devices."""
163*800a58d9SAndroid Build Coastguard Worker        forwarded_ports_1 = mock.Mock(adb_port=12345, vnc_port=56789)
164*800a58d9SAndroid Build Coastguard Worker        forwarded_ports_2 = mock.Mock(adb_port=23456, vnc_port=67890)
165*800a58d9SAndroid Build Coastguard Worker        self.Patch(self.device_factory, "GetVncPorts", return_value=[6444, 6445])
166*800a58d9SAndroid Build Coastguard Worker        self.Patch(self.device_factory, "GetAdbPorts", return_value=[6520, 6521])
167*800a58d9SAndroid Build Coastguard Worker        self.Patch(utils, "PickFreePort", return_value=12345)
168*800a58d9SAndroid Build Coastguard Worker        mock_auto_connect = self.Patch(
169*800a58d9SAndroid Build Coastguard Worker            utils, "AutoConnect", side_effects=[forwarded_ports_1,
170*800a58d9SAndroid Build Coastguard Worker                                                forwarded_ports_2])
171*800a58d9SAndroid Build Coastguard Worker        cfg = self._CreateCfg()
172*800a58d9SAndroid Build Coastguard Worker        _report = common_operations.CreateDevices(self.CMD, cfg,
173*800a58d9SAndroid Build Coastguard Worker                                                  self.device_factory, 1,
174*800a58d9SAndroid Build Coastguard Worker                                                  "cuttlefish",
175*800a58d9SAndroid Build Coastguard Worker                                                  autoconnect=True,
176*800a58d9SAndroid Build Coastguard Worker                                                  client_adb_port=None)
177*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(2, mock_auto_connect.call_count)
178*800a58d9SAndroid Build Coastguard Worker        mock_auto_connect.assert_any_call(
179*800a58d9SAndroid Build Coastguard Worker            ip_addr="127.0.0.1", rsa_key_file="cfg/private/key",
180*800a58d9SAndroid Build Coastguard Worker            target_vnc_port=6444, target_adb_port=6520,
181*800a58d9SAndroid Build Coastguard Worker            ssh_user=constants.GCE_USER, client_adb_port=None,
182*800a58d9SAndroid Build Coastguard Worker            extra_args_ssh_tunnel="extra args")
183*800a58d9SAndroid Build Coastguard Worker        mock_auto_connect.assert_any_call(
184*800a58d9SAndroid Build Coastguard Worker            ip_addr="127.0.0.1", rsa_key_file="cfg/private/key",
185*800a58d9SAndroid Build Coastguard Worker            target_vnc_port=6445, target_adb_port=6521,
186*800a58d9SAndroid Build Coastguard Worker            ssh_user=constants.GCE_USER, client_adb_port=None,
187*800a58d9SAndroid Build Coastguard Worker            extra_args_ssh_tunnel="extra args")
188*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(_report.command, self.CMD)
189*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(_report.status, report.Status.SUCCESS)
190*800a58d9SAndroid Build Coastguard Worker
191*800a58d9SAndroid Build Coastguard Worker    def testCreateDevicesInternalIP(self):
192*800a58d9SAndroid Build Coastguard Worker        """Test Create Devices and report internal IP."""
193*800a58d9SAndroid Build Coastguard Worker        cfg = self._CreateCfg()
194*800a58d9SAndroid Build Coastguard Worker        _report = common_operations.CreateDevices(self.CMD, cfg,
195*800a58d9SAndroid Build Coastguard Worker                                                  self.device_factory, 1,
196*800a58d9SAndroid Build Coastguard Worker                                                  self.AVD_TYPE,
197*800a58d9SAndroid Build Coastguard Worker                                                  report_internal_ip=True)
198*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(_report.command, self.CMD)
199*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(_report.status, report.Status.SUCCESS)
200*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
201*800a58d9SAndroid Build Coastguard Worker            _report.data,
202*800a58d9SAndroid Build Coastguard Worker            {"devices": [{
203*800a58d9SAndroid Build Coastguard Worker                "ip": self.IP.internal + ":6520",
204*800a58d9SAndroid Build Coastguard Worker                "instance_name": self.INSTANCE,
205*800a58d9SAndroid Build Coastguard Worker                "branch": self.BRANCH,
206*800a58d9SAndroid Build Coastguard Worker                "build_id": self.BUILD_ID,
207*800a58d9SAndroid Build Coastguard Worker                "build_target": self.BUILD_TARGET,
208*800a58d9SAndroid Build Coastguard Worker                "gcs_bucket_build_id": self.BUILD_ID,
209*800a58d9SAndroid Build Coastguard Worker                "logs": self.LOGS
210*800a58d9SAndroid Build Coastguard Worker            }]})
211*800a58d9SAndroid Build Coastguard Worker
212*800a58d9SAndroid Build Coastguard Worker    def testCreateDevicesWithSshParameters(self):
213*800a58d9SAndroid Build Coastguard Worker        """Test Create Devices with ssh user and key."""
214*800a58d9SAndroid Build Coastguard Worker        forwarded_ports = mock.Mock(adb_port=12345, vnc_port=56789)
215*800a58d9SAndroid Build Coastguard Worker        mock_auto_connect = self.Patch(utils, "AutoConnect",
216*800a58d9SAndroid Build Coastguard Worker                                       return_value=forwarded_ports)
217*800a58d9SAndroid Build Coastguard Worker        mock_establish_webrtc = self.Patch(utils, "EstablishWebRTCSshTunnel")
218*800a58d9SAndroid Build Coastguard Worker        self.Patch(utils, "PickFreePort", return_value=12345)
219*800a58d9SAndroid Build Coastguard Worker        cfg = self._CreateCfg()
220*800a58d9SAndroid Build Coastguard Worker        _report = common_operations.CreateDevices(
221*800a58d9SAndroid Build Coastguard Worker            self.CMD, cfg, self.device_factory, 1, constants.TYPE_CF,
222*800a58d9SAndroid Build Coastguard Worker            autoconnect=True, connect_webrtc=True,
223*800a58d9SAndroid Build Coastguard Worker            ssh_user="user", ssh_private_key_path="private/key")
224*800a58d9SAndroid Build Coastguard Worker
225*800a58d9SAndroid Build Coastguard Worker        mock_auto_connect.assert_called_with(
226*800a58d9SAndroid Build Coastguard Worker            ip_addr="127.0.0.1", rsa_key_file="private/key",
227*800a58d9SAndroid Build Coastguard Worker            target_vnc_port=6444, target_adb_port=6520, ssh_user="user",
228*800a58d9SAndroid Build Coastguard Worker            client_adb_port=None, extra_args_ssh_tunnel="extra args")
229*800a58d9SAndroid Build Coastguard Worker        mock_establish_webrtc.assert_called_with(
230*800a58d9SAndroid Build Coastguard Worker            ip_addr="127.0.0.1", rsa_key_file="private/key",
231*800a58d9SAndroid Build Coastguard Worker            ssh_user="user", extra_args_ssh_tunnel="extra args",
232*800a58d9SAndroid Build Coastguard Worker            webrtc_local_port=12345)
233*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(_report.status, report.Status.SUCCESS)
234*800a58d9SAndroid Build Coastguard Worker
235*800a58d9SAndroid Build Coastguard Worker    def testGetErrorType(self):
236*800a58d9SAndroid Build Coastguard Worker        """Test GetErrorType."""
237*800a58d9SAndroid Build Coastguard Worker        # Test with CheckGCEZonesQuotaError()
238*800a58d9SAndroid Build Coastguard Worker        error = errors.CheckGCEZonesQuotaError()
239*800a58d9SAndroid Build Coastguard Worker        expected_result = constants.GCE_QUOTA_ERROR
240*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(common_operations._GetErrorType(error), expected_result)
241*800a58d9SAndroid Build Coastguard Worker
242*800a58d9SAndroid Build Coastguard Worker        # Test with DownloadArtifactError()
243*800a58d9SAndroid Build Coastguard Worker        error = errors.DownloadArtifactError()
244*800a58d9SAndroid Build Coastguard Worker        expected_result = constants.ACLOUD_DOWNLOAD_ARTIFACT_ERROR
245*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(common_operations._GetErrorType(error), expected_result)
246*800a58d9SAndroid Build Coastguard Worker
247*800a58d9SAndroid Build Coastguard Worker        # Test with DeviceConnectionError()
248*800a58d9SAndroid Build Coastguard Worker        error = errors.DeviceConnectionError()
249*800a58d9SAndroid Build Coastguard Worker        expected_result = constants.ACLOUD_SSH_CONNECT_ERROR
250*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(common_operations._GetErrorType(error), expected_result)
251*800a58d9SAndroid Build Coastguard Worker
252*800a58d9SAndroid Build Coastguard Worker        # Test with ACLOUD_UNKNOWN_ERROR
253*800a58d9SAndroid Build Coastguard Worker        error = errors.DriverError()
254*800a58d9SAndroid Build Coastguard Worker        expected_result = constants.ACLOUD_UNKNOWN_ERROR
255*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(common_operations._GetErrorType(error), expected_result)
256*800a58d9SAndroid Build Coastguard Worker
257*800a58d9SAndroid Build Coastguard Worker        # Test with error message about GCE quota issue
258*800a58d9SAndroid Build Coastguard Worker        error = errors.DriverError("Quota exceeded for quota read group.")
259*800a58d9SAndroid Build Coastguard Worker        expected_result = constants.GCE_QUOTA_ERROR
260*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(common_operations._GetErrorType(error), expected_result)
261*800a58d9SAndroid Build Coastguard Worker
262*800a58d9SAndroid Build Coastguard Worker        error = errors.DriverError("ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS")
263*800a58d9SAndroid Build Coastguard Worker        expected_result = constants.GCE_QUOTA_ERROR
264*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(common_operations._GetErrorType(error), expected_result)
265*800a58d9SAndroid Build Coastguard Worker
266*800a58d9SAndroid Build Coastguard Worker    def testCreateDevicesWithFetchCvdWrapper(self):
267*800a58d9SAndroid Build Coastguard Worker        """Test Create Devices with FetchCvdWrapper."""
268*800a58d9SAndroid Build Coastguard Worker        self.Patch(
269*800a58d9SAndroid Build Coastguard Worker            self.device_factory,
270*800a58d9SAndroid Build Coastguard Worker            "GetFetchCvdWrapperLogIfExist", return_value={"fetch_log": "abc"})
271*800a58d9SAndroid Build Coastguard Worker        cfg = self._CreateCfg()
272*800a58d9SAndroid Build Coastguard Worker        _report = common_operations.CreateDevices(self.CMD, cfg,
273*800a58d9SAndroid Build Coastguard Worker                                                  self.device_factory, 1,
274*800a58d9SAndroid Build Coastguard Worker                                                  constants.TYPE_CF)
275*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(_report.command, self.CMD)
276*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(_report.status, report.Status.SUCCESS)
277*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
278*800a58d9SAndroid Build Coastguard Worker            _report.data,
279*800a58d9SAndroid Build Coastguard Worker            {"devices": [{
280*800a58d9SAndroid Build Coastguard Worker                "ip": self.IP.external + ":6520",
281*800a58d9SAndroid Build Coastguard Worker                "instance_name": self.INSTANCE,
282*800a58d9SAndroid Build Coastguard Worker                "branch": self.BRANCH,
283*800a58d9SAndroid Build Coastguard Worker                "build_id": self.BUILD_ID,
284*800a58d9SAndroid Build Coastguard Worker                "build_target": self.BUILD_TARGET,
285*800a58d9SAndroid Build Coastguard Worker                "gcs_bucket_build_id": self.BUILD_ID,
286*800a58d9SAndroid Build Coastguard Worker                "logs": self.LOGS,
287*800a58d9SAndroid Build Coastguard Worker                "fetch_cvd_wrapper_log": {
288*800a58d9SAndroid Build Coastguard Worker                    "fetch_log": "abc"
289*800a58d9SAndroid Build Coastguard Worker                },
290*800a58d9SAndroid Build Coastguard Worker            }]})
291*800a58d9SAndroid Build Coastguard Worker
292*800a58d9SAndroid Build Coastguard Worker
293*800a58d9SAndroid Build Coastguard Workerif __name__ == "__main__":
294*800a58d9SAndroid Build Coastguard Worker    unittest.main()
295