1"""Tests for cloud.android.driver.public.actions.create_cheeps_actions."""
2import unittest
3import uuid
4
5import mock
6
7from acloud.create import cheeps_remote_image_remote_instance
8from acloud.internal import constants
9from acloud.internal.lib import android_build_client
10from acloud.internal.lib import android_compute_client
11from acloud.internal.lib import auth
12from acloud.internal.lib import cheeps_compute_client
13from acloud.internal.lib import driver_test_lib
14from acloud.internal.lib import ssh
15
16
17class CheepsRemoteImageRemoteInstanceTest(driver_test_lib.BaseDriverTest):
18    """Test cheeps_remote_image_remote_instance."""
19
20    IP = ssh.IP(external="127.0.0.1", internal="10.0.0.1")
21    INSTANCE = "fake-instance"
22    IMAGE = "fake-image"
23    GPU = "nvidia-tesla-k80"
24    CHEEPS_HOST_IMAGE_NAME = "fake-stable-host-image-name"
25    CHEEPS_HOST_IMAGE_PROJECT = "fake-stable-host-image-project"
26    ANDROID_BUILD_ID = 12345
27    ANDROID_BUILD_TARGET = "fake-target"
28
29    def setUp(self):
30        """Set up the test."""
31        super(CheepsRemoteImageRemoteInstanceTest, self).setUp()
32        self.build_client = mock.MagicMock()
33        self.Patch(
34            android_build_client,
35            "AndroidBuildClient",
36            return_value=self.build_client)
37        self.compute_client = mock.MagicMock()
38        self.Patch(
39            cheeps_compute_client,
40            "CheepsComputeClient",
41            return_value=self.compute_client)
42        self.Patch(
43            android_compute_client,
44            "AndroidComputeClient",
45            return_value=self.compute_client)
46        self.Patch(auth, "CreateCredentials", return_value=mock.MagicMock())
47
48        # Mock uuid
49        fake_uuid = mock.MagicMock(hex="1234")
50        self.Patch(uuid, "uuid4", return_value=fake_uuid)
51
52        # Mock compute client methods
53        self.compute_client.GetInstanceIP.return_value = self.IP
54        self.compute_client.GenerateImageName.return_value = self.IMAGE
55        self.compute_client.GenerateInstanceName.return_value = self.INSTANCE
56
57    def _CreateCfg(self):
58        """A helper method that creates a mock configuration object."""
59        cfg = mock.MagicMock()
60        cfg.service_account_name = "fake@service.com"
61        cfg.service_account_private_key_path = "/fake/path/to/key"
62        cfg.zone = "fake_zone"
63        cfg.ssh_private_key_path = ""
64        cfg.ssh_public_key_path = ""
65        cfg.stable_cheeps_host_image_name = self.CHEEPS_HOST_IMAGE_NAME
66        cfg.stable_cheeps_host_image_project = self.CHEEPS_HOST_IMAGE_PROJECT
67        return cfg
68
69    def _CreateAvdSpec(self, stable_cheeps_host_image_name=None,
70                       stable_cheeps_host_image_project=None):
71        avd_spec = mock.MagicMock()
72        avd_spec.cfg = self._CreateCfg()
73        avd_spec.remote_image = {constants.BUILD_ID: self.ANDROID_BUILD_ID,
74                                 constants.BUILD_TARGET: self.ANDROID_BUILD_TARGET}
75        avd_spec.autoconnect = False
76        avd_spec.report_internal_ip = False
77        avd_spec.stable_cheeps_host_image_name = stable_cheeps_host_image_name
78        avd_spec.stable_cheeps_host_image_project = stable_cheeps_host_image_project
79        return avd_spec
80
81    def testCreate(self):
82        """Test CreateDevices."""
83        avd_spec = self._CreateAvdSpec()
84        instance = cheeps_remote_image_remote_instance.CheepsRemoteImageRemoteInstance()
85        report = instance.Create(avd_spec, no_prompts=False)
86
87        # Verify
88        self.compute_client.CreateInstance.assert_called_with(
89            instance=self.INSTANCE,
90            image_name=self.CHEEPS_HOST_IMAGE_NAME,
91            image_project=self.CHEEPS_HOST_IMAGE_PROJECT,
92            avd_spec=avd_spec)
93
94        self.assertEqual(report.data, {
95            "devices": [{
96                "build_id": self.ANDROID_BUILD_ID,
97                "instance_name": self.INSTANCE,
98                "ip": self.IP.external,
99            },],
100        })
101        self.assertEqual(report.command, "create_cheeps")
102        self.assertEqual(report.status, "SUCCESS")
103
104    def testStableCheepsHostImageArgsOverrideConfig(self):
105        """Test that Cheeps host image specifed through args (which goes into
106        avd_spec) override values set in Acloud config."""
107        stable_cheeps_host_image_name = 'override-stable-host-image-name'
108        stable_cheeps_host_image_project = 'override-stable-host-image-project'
109        self.assertNotEqual(stable_cheeps_host_image_name,
110                            self.CHEEPS_HOST_IMAGE_NAME)
111        self.assertNotEqual(stable_cheeps_host_image_project,
112                            self.CHEEPS_HOST_IMAGE_PROJECT)
113
114        avd_spec = self._CreateAvdSpec(stable_cheeps_host_image_name,
115                                       stable_cheeps_host_image_project)
116        instance = cheeps_remote_image_remote_instance.CheepsRemoteImageRemoteInstance()
117        instance.Create(avd_spec, no_prompts=False)
118
119        # Verify
120        self.compute_client.CreateInstance.assert_called_with(
121            instance=self.INSTANCE,
122            image_name=stable_cheeps_host_image_name,
123            image_project=stable_cheeps_host_image_project,
124            avd_spec=avd_spec)
125
126if __name__ == "__main__":
127    unittest.main()
128