• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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