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