1#!/usr/bin/env python 2# 3# Copyright 2019 - 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.internal.lib.cheeps_compute_client.""" 17 18import unittest 19 20from unittest import mock 21 22from acloud.internal import constants 23from acloud.internal.lib import cheeps_compute_client 24from acloud.internal.lib import driver_test_lib 25from acloud.internal.lib import gcompute_client 26 27 28class CheepsComputeClientTest(driver_test_lib.BaseDriverTest): 29 """Test CheepsComputeClient.""" 30 31 SSH_PUBLIC_KEY_PATH = "" 32 INSTANCE = "fake-instance" 33 IMAGE = "fake-image" 34 IMAGE_PROJECT = "fake-image-project" 35 MACHINE_TYPE = "fake-machine-type" 36 NETWORK = "fake-network" 37 ZONE = "fake-zone" 38 METADATA = {"metadata_key": "metadata_value"} 39 BOOT_DISK_SIZE_GB = 10 40 ANDROID_BUILD_ID = 123 41 ANDROID_BUILD_TARGET = 'cheese-userdebug' 42 DPI = 320 43 X_RES = 720 44 Y_RES = 1280 45 USER = "test_user" 46 PASSWORD = "test_password" 47 CHEEPS_BETTY_IMAGE = 'abcasdf' 48 CHEEPS_FEATURES = ['a', 'b', 'c'] 49 50 def _GetFakeConfig(self): 51 """Create a fake configuration object. 52 53 Returns: 54 A fake configuration mock object. 55 """ 56 57 fake_cfg = mock.MagicMock() 58 fake_cfg.ssh_public_key_path = self.SSH_PUBLIC_KEY_PATH 59 fake_cfg.machine_type = self.MACHINE_TYPE 60 fake_cfg.network = self.NETWORK 61 fake_cfg.zone = self.ZONE 62 fake_cfg.resolution = "{x}x{y}x32x{dpi}".format( 63 x=self.X_RES, y=self.Y_RES, dpi=self.DPI) 64 fake_cfg.metadata_variable = self.METADATA 65 return fake_cfg 66 67 def setUp(self): 68 """Set up the test.""" 69 70 super().setUp() 71 self.Patch(cheeps_compute_client.CheepsComputeClient, 72 "InitResourceHandle") 73 self.cheeps_compute_client = ( 74 cheeps_compute_client.CheepsComputeClient(self._GetFakeConfig(), 75 mock.MagicMock())) 76 self.Patch( 77 gcompute_client.ComputeClient, "CompareMachineSize", return_value=1) 78 self.Patch( 79 gcompute_client.ComputeClient, 80 "GetImage", 81 return_value={"diskSizeGb": self.BOOT_DISK_SIZE_GB}) 82 self.Patch(gcompute_client.ComputeClient, "CreateInstance") 83 84 def testCreateInstance(self): 85 """Test CreateInstance.""" 86 87 expected_metadata = { 88 'android_build_id': self.ANDROID_BUILD_ID, 89 'android_build_target': self.ANDROID_BUILD_TARGET, 90 'avd_type': "cheeps", 91 'betty_image': self.CHEEPS_BETTY_IMAGE, 92 'cheeps_features': ','.join(self.CHEEPS_FEATURES), 93 'cvd_01_dpi': str(self.DPI), 94 'cvd_01_x_res': str(self.X_RES), 95 'cvd_01_y_res': str(self.Y_RES), 96 'display': "%sx%s (%s)"%( 97 str(self.X_RES), 98 str(self.Y_RES), 99 str(self.DPI)), 100 'user': self.USER, 101 'password': self.PASSWORD, 102 } 103 expected_metadata.update(self.METADATA) 104 105 avd_spec = mock.MagicMock() 106 avd_spec.hw_property = {constants.HW_X_RES: str(self.X_RES), 107 constants.HW_Y_RES: str(self.Y_RES), 108 constants.HW_ALIAS_DPI: str(self.DPI)} 109 avd_spec.username = self.USER 110 avd_spec.password = self.PASSWORD 111 avd_spec.remote_image = { 112 constants.BUILD_ID: self.ANDROID_BUILD_ID, 113 constants.BUILD_TARGET: self.ANDROID_BUILD_TARGET, 114 } 115 avd_spec.cheeps_betty_image = self.CHEEPS_BETTY_IMAGE 116 avd_spec.cheeps_features = self.CHEEPS_FEATURES 117 118 self.cheeps_compute_client.CreateInstance( 119 self.INSTANCE, 120 self.IMAGE, 121 self.IMAGE_PROJECT, 122 avd_spec) 123 # pylint: disable=no-member 124 gcompute_client.ComputeClient.CreateInstance.assert_called_with( 125 self.cheeps_compute_client, 126 instance=self.INSTANCE, 127 image_name=self.IMAGE, 128 image_project=self.IMAGE_PROJECT, 129 disk_args=None, 130 metadata=expected_metadata, 131 machine_type=self.MACHINE_TYPE, 132 network=self.NETWORK, 133 zone=self.ZONE) 134 135 def testCreateInstanceMissingParams(self): 136 """Test CreateInstance with optional avd_spec parameters missing.""" 137 expected_metadata = { 138 'android_build_id': self.ANDROID_BUILD_ID, 139 'android_build_target': self.ANDROID_BUILD_TARGET, 140 'avd_type': "cheeps", 141 'betty_image': None, 142 'cheeps_features': "", 143 'cvd_01_dpi': str(self.DPI), 144 'cvd_01_x_res': str(self.X_RES), 145 'cvd_01_y_res': str(self.Y_RES), 146 'display': "%sx%s (%s)"%( 147 str(self.X_RES), 148 str(self.Y_RES), 149 str(self.DPI)), 150 } 151 expected_metadata.update(self.METADATA) 152 153 154 avd_spec = mock.MagicMock() 155 avd_spec.hw_property = {constants.HW_X_RES: str(self.X_RES), 156 constants.HW_Y_RES: str(self.Y_RES), 157 constants.HW_ALIAS_DPI: str(self.DPI)} 158 avd_spec.username = None 159 avd_spec.password = None 160 avd_spec.remote_image = { 161 constants.BUILD_ID: self.ANDROID_BUILD_ID, 162 constants.BUILD_TARGET: self.ANDROID_BUILD_TARGET, 163 } 164 avd_spec.cheeps_betty_image = None 165 avd_spec.cheeps_features = [] 166 167 self.cheeps_compute_client.CreateInstance( 168 self.INSTANCE, 169 self.IMAGE, 170 self.IMAGE_PROJECT, 171 avd_spec) 172 # pylint: disable=no-member 173 gcompute_client.ComputeClient.CreateInstance.assert_called_with( 174 self.cheeps_compute_client, 175 instance=self.INSTANCE, 176 image_name=self.IMAGE, 177 image_project=self.IMAGE_PROJECT, 178 disk_args=None, 179 metadata=expected_metadata, 180 machine_type=self.MACHINE_TYPE, 181 network=self.NETWORK, 182 zone=self.ZONE) 183 184if __name__ == "__main__": 185 unittest.main() 186