1#!/usr/bin/env python 2# 3# Copyright 2018 - The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16"""Tests for acloud.public.actions.create_goldfish_actions.""" 17import uuid 18import unittest 19import mock 20 21from acloud.internal import constants 22from acloud.internal.lib import android_build_client 23from acloud.internal.lib import android_compute_client 24from acloud.internal.lib import auth 25from acloud.internal.lib import driver_test_lib 26from acloud.internal.lib import gcompute_client 27from acloud.internal.lib import goldfish_compute_client 28from acloud.public.actions import create_goldfish_action 29 30 31class CreateGoldfishActionTest(driver_test_lib.BaseDriverTest): 32 """Tests create_goldfish_action.""" 33 34 IP = gcompute_client.IP(external="127.0.0.1", internal="10.0.0.1") 35 INSTANCE = "fake-instance" 36 IMAGE = "fake-image" 37 BUILD_TARGET = "fake-build-target" 38 EMULATOR_TARGET = "emu-fake-target" 39 BUILD_ID = "12345" 40 EMULATOR_BUILD_ID = "1234567" 41 GPU = "nvidia-tesla-k80" 42 BRANCH = "fake-branch" 43 EMULATOR_BRANCH = "emu-fake-branch" 44 GOLDFISH_HOST_IMAGE_NAME = "fake-stable-host-image-name" 45 GOLDFISH_HOST_IMAGE_PROJECT = "fake-stable-host-image-project" 46 EXTRA_DATA_DISK_GB = 4 47 EXTRA_SCOPES = None 48 49 def setUp(self): 50 """Sets up the test.""" 51 super(CreateGoldfishActionTest, self).setUp() 52 self.build_client = mock.MagicMock() 53 self.Patch( 54 android_build_client, 55 "AndroidBuildClient", 56 return_value=self.build_client) 57 self.compute_client = mock.MagicMock() 58 self.Patch( 59 goldfish_compute_client, 60 "GoldfishComputeClient", 61 return_value=self.compute_client) 62 self.Patch( 63 android_compute_client, 64 "AndroidComputeClient", 65 return_value=self.compute_client) 66 self.Patch(auth, "CreateCredentials", return_value=mock.MagicMock()) 67 #Initialize new avd_spec 68 self.avd_spec = mock.MagicMock() 69 self.avd_spec.cfg = self._CreateCfg() 70 self.avd_spec.remote_image = {constants.BUILD_ID: self.BUILD_ID, 71 constants.BUILD_BRANCH: self.BRANCH, 72 constants.BUILD_TARGET: self.BUILD_TARGET} 73 self.avd_spec.emulator_build_id = self.EMULATOR_BUILD_ID 74 self.avd_spec.gpu = self.GPU 75 self.avd_spec.serial_log_file = None 76 self.avd_spec.autoconnect = False 77 78 def _CreateCfg(self): 79 """A helper method that creates a mock configuration object.""" 80 cfg = mock.MagicMock() 81 cfg.service_account_name = "fake@service.com" 82 cfg.service_account_private_key_path = "/fake/path/to/key" 83 cfg.zone = "fake_zone" 84 cfg.ssh_private_key_path = "" 85 cfg.ssh_public_key_path = "" 86 cfg.stable_goldfish_host_image_name = self.GOLDFISH_HOST_IMAGE_NAME 87 cfg.stable_goldfish_host_image_project = self.GOLDFISH_HOST_IMAGE_PROJECT 88 cfg.emulator_build_target = self.EMULATOR_TARGET 89 cfg.extra_data_disk_size_gb = self.EXTRA_DATA_DISK_GB 90 cfg.extra_scopes = self.EXTRA_SCOPES 91 return cfg 92 93 def testCreateDevices(self): 94 """Tests CreateDevices.""" 95 cfg = self._CreateCfg() 96 97 # Mock uuid 98 fake_uuid = mock.MagicMock(hex="1234") 99 self.Patch(uuid, "uuid4", return_value=fake_uuid) 100 101 # Mock compute client methods 102 self.compute_client.GetInstanceIP.return_value = self.IP 103 self.compute_client.GenerateImageName.return_value = self.IMAGE 104 self.compute_client.GenerateInstanceName.return_value = self.INSTANCE 105 106 # Mock build client method 107 self.build_client.GetBranch.side_effect = [ 108 self.BRANCH, self.EMULATOR_BRANCH 109 ] 110 111 none_avd_spec = None 112 113 # Call CreateDevices with avd_spec is None 114 report = create_goldfish_action.CreateDevices( 115 none_avd_spec, cfg, self.BUILD_TARGET, self.BUILD_ID, 116 self.EMULATOR_BUILD_ID, self.GPU) 117 118 # Verify 119 self.compute_client.CreateInstance.assert_called_with( 120 instance=self.INSTANCE, 121 blank_data_disk_size_gb=self.EXTRA_DATA_DISK_GB, 122 image_name=self.GOLDFISH_HOST_IMAGE_NAME, 123 image_project=self.GOLDFISH_HOST_IMAGE_PROJECT, 124 build_target=self.BUILD_TARGET, 125 branch=self.BRANCH, 126 build_id=self.BUILD_ID, 127 emulator_branch=self.EMULATOR_BRANCH, 128 emulator_build_id=self.EMULATOR_BUILD_ID, 129 gpu=self.GPU, 130 avd_spec=none_avd_spec, 131 extra_scopes=self.EXTRA_SCOPES) 132 133 self.assertEquals(report.data, { 134 "devices": [ 135 { 136 "instance_name": self.INSTANCE, 137 "ip": self.IP.external, 138 "branch": self.BRANCH, 139 "build_id": self.BUILD_ID, 140 "build_target": self.BUILD_TARGET, 141 "emulator_branch": self.EMULATOR_BRANCH, 142 "emulator_build_id": self.EMULATOR_BUILD_ID, 143 "emulator_build_target": self.EMULATOR_TARGET, 144 }, 145 ], 146 }) 147 self.assertEquals(report.command, "create_gf") 148 self.assertEquals(report.status, "SUCCESS") 149 150 # Call CreateDevices with avd_spec 151 self.build_client.GetBranch.side_effect = [ 152 self.BRANCH, self.EMULATOR_BRANCH 153 ] 154 report = create_goldfish_action.CreateDevices(avd_spec=self.avd_spec) 155 # Verify 156 self.compute_client.CreateInstance.assert_called_with( 157 instance=self.INSTANCE, 158 blank_data_disk_size_gb=self.EXTRA_DATA_DISK_GB, 159 image_name=self.GOLDFISH_HOST_IMAGE_NAME, 160 image_project=self.GOLDFISH_HOST_IMAGE_PROJECT, 161 build_target=self.BUILD_TARGET, 162 branch=self.BRANCH, 163 build_id=self.BUILD_ID, 164 emulator_branch=self.EMULATOR_BRANCH, 165 emulator_build_id=self.EMULATOR_BUILD_ID, 166 gpu=self.GPU, 167 avd_spec=self.avd_spec, 168 extra_scopes=self.EXTRA_SCOPES) 169 170 def testCreateDevicesWithoutBuildId(self): 171 """Test CreateDevices when emulator sys image build id is not provided.""" 172 cfg = self._CreateCfg() 173 174 # Mock uuid 175 fake_uuid = mock.MagicMock(hex="1234") 176 self.Patch(uuid, "uuid4", return_value=fake_uuid) 177 178 # Mock compute client methods 179 self.compute_client.GetInstanceIP.return_value = self.IP 180 self.compute_client.GenerateImageName.return_value = self.IMAGE 181 self.compute_client.GenerateInstanceName.return_value = self.INSTANCE 182 183 # Mock build client method 184 self.build_client.GetBranch.side_effect = [ 185 self.BRANCH, self.EMULATOR_BRANCH 186 ] 187 188 # Mock _FetchBuildIdFromFile method 189 self.Patch( 190 create_goldfish_action, 191 "_FetchBuildIdFromFile", 192 return_value=self.BUILD_ID) 193 194 none_avd_spec = None 195 # Call CreateDevices with no avd_spec 196 report = create_goldfish_action.CreateDevices( 197 none_avd_spec, 198 cfg, 199 self.BUILD_TARGET, 200 None, 201 self.EMULATOR_BUILD_ID, 202 self.GPU, 203 branch=self.BRANCH) 204 205 # Verify 206 self.compute_client.CreateInstance.assert_called_with( 207 instance=self.INSTANCE, 208 blank_data_disk_size_gb=self.EXTRA_DATA_DISK_GB, 209 image_name=self.GOLDFISH_HOST_IMAGE_NAME, 210 image_project=self.GOLDFISH_HOST_IMAGE_PROJECT, 211 build_target=self.BUILD_TARGET, 212 branch=self.BRANCH, 213 build_id=self.BUILD_ID, 214 emulator_branch=self.EMULATOR_BRANCH, 215 emulator_build_id=self.EMULATOR_BUILD_ID, 216 gpu=self.GPU, 217 avd_spec=none_avd_spec, 218 extra_scopes=self.EXTRA_SCOPES) 219 220 self.assertEquals(report.data, { 221 "devices": [{ 222 "instance_name": self.INSTANCE, 223 "ip": self.IP.external, 224 "branch": self.BRANCH, 225 "build_id": self.BUILD_ID, 226 "build_target": self.BUILD_TARGET, 227 "emulator_branch": self.EMULATOR_BRANCH, 228 "emulator_build_id": self.EMULATOR_BUILD_ID, 229 "emulator_build_target": self.EMULATOR_TARGET, 230 },], 231 }) 232 self.assertEquals(report.command, "create_gf") 233 self.assertEquals(report.status, "SUCCESS") 234 235 # Call CreateDevices with avd_spec 236 self.build_client.GetBranch.side_effect = [ 237 self.BRANCH, self.EMULATOR_BRANCH 238 ] 239 report = create_goldfish_action.CreateDevices(avd_spec=self.avd_spec) 240 # Verify 241 self.compute_client.CreateInstance.assert_called_with( 242 instance=self.INSTANCE, 243 blank_data_disk_size_gb=self.EXTRA_DATA_DISK_GB, 244 image_name=self.GOLDFISH_HOST_IMAGE_NAME, 245 image_project=self.GOLDFISH_HOST_IMAGE_PROJECT, 246 build_target=self.BUILD_TARGET, 247 branch=self.BRANCH, 248 build_id=self.BUILD_ID, 249 emulator_branch=self.EMULATOR_BRANCH, 250 emulator_build_id=self.EMULATOR_BUILD_ID, 251 gpu=self.GPU, 252 avd_spec=self.avd_spec, 253 extra_scopes=self.EXTRA_SCOPES) 254 255 #pylint: disable=invalid-name 256 def testCreateDevicesWithoutEmulatorBuildId(self): 257 """Test CreateDevices when emulator build id is not provided.""" 258 cfg = self._CreateCfg() 259 260 # Mock uuid 261 fake_uuid = mock.MagicMock(hex="1234") 262 self.Patch(uuid, "uuid4", return_value=fake_uuid) 263 264 # Mock compute client methods 265 self.compute_client.GetInstanceIP.return_value = self.IP 266 self.compute_client.GenerateImageName.return_value = self.IMAGE 267 self.compute_client.GenerateInstanceName.return_value = self.INSTANCE 268 269 # Mock build client method 270 self.build_client.GetBranch.side_effect = [ 271 self.BRANCH, self.EMULATOR_BRANCH 272 ] 273 274 # Mock _FetchBuildIdFromFile method 275 self.Patch( 276 create_goldfish_action, 277 "_FetchBuildIdFromFile", 278 return_value=self.EMULATOR_BUILD_ID) 279 280 none_avd_spec = None 281 # Call CreateDevices 282 report = create_goldfish_action.CreateDevices( 283 none_avd_spec, cfg, self.BUILD_TARGET, self.BUILD_ID, None, 284 self.GPU) 285 286 # Verify 287 self.compute_client.CreateInstance.assert_called_with( 288 instance=self.INSTANCE, 289 blank_data_disk_size_gb=self.EXTRA_DATA_DISK_GB, 290 image_name=self.GOLDFISH_HOST_IMAGE_NAME, 291 image_project=self.GOLDFISH_HOST_IMAGE_PROJECT, 292 build_target=self.BUILD_TARGET, 293 branch=self.BRANCH, 294 build_id=self.BUILD_ID, 295 emulator_branch=self.EMULATOR_BRANCH, 296 emulator_build_id=self.EMULATOR_BUILD_ID, 297 gpu=self.GPU, 298 avd_spec=none_avd_spec, 299 extra_scopes=self.EXTRA_SCOPES) 300 301 self.assertEquals(report.data, { 302 "devices": [{ 303 "instance_name": self.INSTANCE, 304 "ip": self.IP.external, 305 "branch": self.BRANCH, 306 "build_id": self.BUILD_ID, 307 "build_target": self.BUILD_TARGET, 308 "emulator_branch": self.EMULATOR_BRANCH, 309 "emulator_build_id": self.EMULATOR_BUILD_ID, 310 "emulator_build_target": self.EMULATOR_TARGET, 311 },], 312 }) 313 self.assertEquals(report.command, "create_gf") 314 self.assertEquals(report.status, "SUCCESS") 315 316 # Call CreateDevices with avd_spec 317 self.build_client.GetBranch.side_effect = [ 318 self.BRANCH, self.EMULATOR_BRANCH 319 ] 320 report = create_goldfish_action.CreateDevices(avd_spec=self.avd_spec) 321 # Verify 322 self.compute_client.CreateInstance.assert_called_with( 323 instance=self.INSTANCE, 324 blank_data_disk_size_gb=self.EXTRA_DATA_DISK_GB, 325 image_name=self.GOLDFISH_HOST_IMAGE_NAME, 326 image_project=self.GOLDFISH_HOST_IMAGE_PROJECT, 327 build_target=self.BUILD_TARGET, 328 branch=self.BRANCH, 329 build_id=self.BUILD_ID, 330 emulator_branch=self.EMULATOR_BRANCH, 331 emulator_build_id=self.EMULATOR_BUILD_ID, 332 gpu=self.GPU, 333 avd_spec=self.avd_spec, 334 extra_scopes=self.EXTRA_SCOPES) 335 336 337if __name__ == "__main__": 338 unittest.main() 339