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