xref: /aosp_15_r20/tools/acloud/create/avd_spec_test.py (revision 800a58d989c669b8eb8a71d8df53b1ba3d411444)
1*800a58d9SAndroid Build Coastguard Worker# Copyright 2018 - The Android Open Source Project
2*800a58d9SAndroid Build Coastguard Worker#
3*800a58d9SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*800a58d9SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*800a58d9SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*800a58d9SAndroid Build Coastguard Worker#
7*800a58d9SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*800a58d9SAndroid Build Coastguard Worker#
9*800a58d9SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*800a58d9SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*800a58d9SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*800a58d9SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*800a58d9SAndroid Build Coastguard Worker# limitations under the License.
14*800a58d9SAndroid Build Coastguard Worker"""Tests for avd_spec."""
15*800a58d9SAndroid Build Coastguard Worker
16*800a58d9SAndroid Build Coastguard Workerimport glob
17*800a58d9SAndroid Build Coastguard Workerimport os
18*800a58d9SAndroid Build Coastguard Workerimport subprocess
19*800a58d9SAndroid Build Coastguard Workerimport unittest
20*800a58d9SAndroid Build Coastguard Worker
21*800a58d9SAndroid Build Coastguard Workerfrom unittest import mock
22*800a58d9SAndroid Build Coastguard Worker
23*800a58d9SAndroid Build Coastguard Workerfrom acloud import errors
24*800a58d9SAndroid Build Coastguard Workerfrom acloud.create import avd_spec
25*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal import constants
26*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import android_build_client
27*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import auth
28*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import driver_test_lib
29*800a58d9SAndroid Build Coastguard Workerfrom acloud.internal.lib import utils
30*800a58d9SAndroid Build Coastguard Workerfrom acloud.list import list as list_instances
31*800a58d9SAndroid Build Coastguard Workerfrom acloud.public import config
32*800a58d9SAndroid Build Coastguard Worker
33*800a58d9SAndroid Build Coastguard Worker
34*800a58d9SAndroid Build Coastguard Worker# pylint: disable=invalid-name,protected-access
35*800a58d9SAndroid Build Coastguard Workerclass AvdSpecTest(driver_test_lib.BaseDriverTest):
36*800a58d9SAndroid Build Coastguard Worker    """Test avd_spec methods."""
37*800a58d9SAndroid Build Coastguard Worker
38*800a58d9SAndroid Build Coastguard Worker    def setUp(self):
39*800a58d9SAndroid Build Coastguard Worker        """Initialize new avd_spec.AVDSpec."""
40*800a58d9SAndroid Build Coastguard Worker        super().setUp()
41*800a58d9SAndroid Build Coastguard Worker        self.args = mock.MagicMock()
42*800a58d9SAndroid Build Coastguard Worker        self.args.flavor = ""
43*800a58d9SAndroid Build Coastguard Worker        self.args.local_image = None
44*800a58d9SAndroid Build Coastguard Worker        self.args.local_kernel_image = None
45*800a58d9SAndroid Build Coastguard Worker        self.args.local_system_image = None
46*800a58d9SAndroid Build Coastguard Worker        self.args.local_vendor_boot_image = None
47*800a58d9SAndroid Build Coastguard Worker        self.args.config_file = ""
48*800a58d9SAndroid Build Coastguard Worker        self.args.build_target = "fake_build_target"
49*800a58d9SAndroid Build Coastguard Worker        self.args.adb_port = None
50*800a58d9SAndroid Build Coastguard Worker        self.args.launch_args = None
51*800a58d9SAndroid Build Coastguard Worker        self.Patch(list_instances, "ChooseOneRemoteInstance", return_value=mock.MagicMock())
52*800a58d9SAndroid Build Coastguard Worker        self.Patch(list_instances, "GetInstancesFromInstanceNames", return_value=mock.MagicMock())
53*800a58d9SAndroid Build Coastguard Worker
54*800a58d9SAndroid Build Coastguard Worker        # Setup mock Acloud config for usage in tests.
55*800a58d9SAndroid Build Coastguard Worker        self.mock_config = mock.MagicMock()
56*800a58d9SAndroid Build Coastguard Worker        self.mock_config.launch_args = None
57*800a58d9SAndroid Build Coastguard Worker        self.Patch(config, 'GetAcloudConfig', return_value=self.mock_config)
58*800a58d9SAndroid Build Coastguard Worker
59*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec = avd_spec.AVDSpec(self.args)
60*800a58d9SAndroid Build Coastguard Worker
61*800a58d9SAndroid Build Coastguard Worker    # pylint: disable=protected-access
62*800a58d9SAndroid Build Coastguard Worker    def testProcessLocalImageArgs(self):
63*800a58d9SAndroid Build Coastguard Worker        """Test process args.local_image."""
64*800a58d9SAndroid Build Coastguard Worker        self.Patch(glob, "glob", return_value=["fake.img"])
65*800a58d9SAndroid Build Coastguard Worker        expected_image_artifact = "/path/cf_x86_phone-img-eng.user.zip"
66*800a58d9SAndroid Build Coastguard Worker        expected_image_dir = "/path-to-image-dir"
67*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "exists",
68*800a58d9SAndroid Build Coastguard Worker                   side_effect=lambda path: path in (expected_image_artifact,
69*800a58d9SAndroid Build Coastguard Worker                                                     expected_image_dir))
70*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "isdir",
71*800a58d9SAndroid Build Coastguard Worker                   side_effect=lambda path: path == expected_image_dir)
72*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "isfile",
73*800a58d9SAndroid Build Coastguard Worker                   side_effect=lambda path: path == expected_image_artifact)
74*800a58d9SAndroid Build Coastguard Worker
75*800a58d9SAndroid Build Coastguard Worker        # Specified --local-image to a local zipped image file
76*800a58d9SAndroid Build Coastguard Worker        self.args.local_image = "/path/cf_x86_phone-img-eng.user.zip"
77*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._avd_type = constants.TYPE_CF
78*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._instance_type = constants.INSTANCE_TYPE_REMOTE
79*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessLocalImageArgs(self.args)
80*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._local_image_artifact,
81*800a58d9SAndroid Build Coastguard Worker                         expected_image_artifact)
82*800a58d9SAndroid Build Coastguard Worker
83*800a58d9SAndroid Build Coastguard Worker        # Specified --local-image to a dir contains images
84*800a58d9SAndroid Build Coastguard Worker        self.Patch(utils, "GetBuildEnvironmentVariable",
85*800a58d9SAndroid Build Coastguard Worker                   return_value="test_cf_x86")
86*800a58d9SAndroid Build Coastguard Worker        self.args.local_image = "/path-to-image-dir"
87*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._avd_type = constants.TYPE_CF
88*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._instance_type = constants.INSTANCE_TYPE_REMOTE
89*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessLocalImageArgs(self.args)
90*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._local_image_dir, expected_image_dir)
91*800a58d9SAndroid Build Coastguard Worker
92*800a58d9SAndroid Build Coastguard Worker        # Specified local_image without arg
93*800a58d9SAndroid Build Coastguard Worker        self.args.local_image = constants.FIND_IN_BUILD_ENV
94*800a58d9SAndroid Build Coastguard Worker        self.Patch(utils, "GetBuildEnvironmentVariable",
95*800a58d9SAndroid Build Coastguard Worker                   side_effect=["cf_x86_auto", "test_environ", "test_environ"])
96*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessLocalImageArgs(self.args)
97*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._local_image_dir, "test_environ")
98*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_image_artifact, expected_image_artifact)
99*800a58d9SAndroid Build Coastguard Worker
100*800a58d9SAndroid Build Coastguard Worker        # Specified --avd-type=goldfish --local-image with a dir
101*800a58d9SAndroid Build Coastguard Worker        self.Patch(utils, "GetBuildEnvironmentVariable",
102*800a58d9SAndroid Build Coastguard Worker                   return_value="test_environ")
103*800a58d9SAndroid Build Coastguard Worker        self.args.local_image = "/path-to-image-dir"
104*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._avd_type = constants.TYPE_GF
105*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._instance_type = constants.INSTANCE_TYPE_LOCAL
106*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessLocalImageArgs(self.args)
107*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._local_image_dir, expected_image_dir)
108*800a58d9SAndroid Build Coastguard Worker
109*800a58d9SAndroid Build Coastguard Worker    def testProcessLocalMixedImageArgs(self):
110*800a58d9SAndroid Build Coastguard Worker        """Test process args.local_kernel_image and args.local_system_image."""
111*800a58d9SAndroid Build Coastguard Worker        expected_image_dir = "/path-to-image-dir"
112*800a58d9SAndroid Build Coastguard Worker        expected_image_file = "/path-to-image-file"
113*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "exists",
114*800a58d9SAndroid Build Coastguard Worker                   side_effect=lambda path: path in (expected_image_file,
115*800a58d9SAndroid Build Coastguard Worker                                                     expected_image_dir))
116*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "isdir",
117*800a58d9SAndroid Build Coastguard Worker                   side_effect=lambda path: path == expected_image_dir)
118*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "isfile",
119*800a58d9SAndroid Build Coastguard Worker                   side_effect=lambda path: path == expected_image_file)
120*800a58d9SAndroid Build Coastguard Worker
121*800a58d9SAndroid Build Coastguard Worker        # Specified --local-*-image with dirs.
122*800a58d9SAndroid Build Coastguard Worker        self.args.local_kernel_image = expected_image_dir
123*800a58d9SAndroid Build Coastguard Worker        self.args.local_system_image = expected_image_dir
124*800a58d9SAndroid Build Coastguard Worker        self.args.local_system_dlkm_image = expected_image_dir
125*800a58d9SAndroid Build Coastguard Worker        self.args.local_vendor_image = expected_image_dir
126*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessImageArgs(self.args)
127*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_kernel_image, expected_image_dir)
128*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_system_image, expected_image_dir)
129*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_system_dlkm_image, expected_image_dir)
130*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_vendor_image, expected_image_dir)
131*800a58d9SAndroid Build Coastguard Worker
132*800a58d9SAndroid Build Coastguard Worker        # Specified --local-*-image with files.
133*800a58d9SAndroid Build Coastguard Worker        self.args.local_kernel_image = expected_image_file
134*800a58d9SAndroid Build Coastguard Worker        self.args.local_system_image = expected_image_file
135*800a58d9SAndroid Build Coastguard Worker        self.args.local_system_dlkm_image = expected_image_file
136*800a58d9SAndroid Build Coastguard Worker        self.args.local_vendor_boot_image = expected_image_file
137*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessImageArgs(self.args)
138*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_kernel_image, expected_image_file)
139*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_system_image, expected_image_file)
140*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_system_dlkm_image, expected_image_file)
141*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_vendor_boot_image, expected_image_file)
142*800a58d9SAndroid Build Coastguard Worker
143*800a58d9SAndroid Build Coastguard Worker        # Specified --local-*-image without args.
144*800a58d9SAndroid Build Coastguard Worker        self.args.local_kernel_image = constants.FIND_IN_BUILD_ENV
145*800a58d9SAndroid Build Coastguard Worker        self.args.local_system_image = constants.FIND_IN_BUILD_ENV
146*800a58d9SAndroid Build Coastguard Worker        self.args.local_system_dlkm_image = constants.FIND_IN_BUILD_ENV
147*800a58d9SAndroid Build Coastguard Worker        self.args.local_vendor_image = constants.FIND_IN_BUILD_ENV
148*800a58d9SAndroid Build Coastguard Worker        with mock.patch("acloud.create.avd_spec.utils."
149*800a58d9SAndroid Build Coastguard Worker                        "GetBuildEnvironmentVariable",
150*800a58d9SAndroid Build Coastguard Worker                        return_value=expected_image_dir):
151*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec._ProcessImageArgs(self.args)
152*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_kernel_image, expected_image_dir)
153*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_system_image, expected_image_dir)
154*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_system_dlkm_image, expected_image_dir)
155*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_vendor_image, expected_image_dir)
156*800a58d9SAndroid Build Coastguard Worker
157*800a58d9SAndroid Build Coastguard Worker    def testProcessAutoconnect(self):
158*800a58d9SAndroid Build Coastguard Worker        """Test process autoconnect."""
159*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._autoconnect = False
160*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessAutoconnect()
161*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._autoconnect, False)
162*800a58d9SAndroid Build Coastguard Worker
163*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._avd_type = constants.TYPE_CF
164*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._autoconnect = "webrtc"
165*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessAutoconnect()
166*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._autoconnect, "webrtc")
167*800a58d9SAndroid Build Coastguard Worker
168*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._autoconnect = "vnc"
169*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessAutoconnect()
170*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._autoconnect, "vnc")
171*800a58d9SAndroid Build Coastguard Worker
172*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._avd_type = constants.TYPE_GF
173*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._autoconnect = "webrtc"
174*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessAutoconnect()
175*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._autoconnect, "vnc")
176*800a58d9SAndroid Build Coastguard Worker
177*800a58d9SAndroid Build Coastguard Worker    def testProcessImageArgs(self):
178*800a58d9SAndroid Build Coastguard Worker        """Test process image source."""
179*800a58d9SAndroid Build Coastguard Worker        self.Patch(glob, "glob", return_value=["fake.img"])
180*800a58d9SAndroid Build Coastguard Worker        # No specified local_image, image source is from remote
181*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessImageArgs(self.args)
182*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._image_source, constants.IMAGE_SRC_REMOTE)
183*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._local_image_dir, None)
184*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_kernel_image, None)
185*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.local_system_image, None)
186*800a58d9SAndroid Build Coastguard Worker
187*800a58d9SAndroid Build Coastguard Worker        # Specified local_image with an arg for cf type
188*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "isfile", return_value=True)
189*800a58d9SAndroid Build Coastguard Worker        self.args.local_image = "/test_path/cf_x86_phone-img-eng.user.zip"
190*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._avd_type = constants.TYPE_CF
191*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._instance_type = constants.INSTANCE_TYPE_REMOTE
192*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessImageArgs(self.args)
193*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._image_source, constants.IMAGE_SRC_LOCAL)
194*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._local_image_artifact,
195*800a58d9SAndroid Build Coastguard Worker                         "/test_path/cf_x86_phone-img-eng.user.zip")
196*800a58d9SAndroid Build Coastguard Worker
197*800a58d9SAndroid Build Coastguard Worker        # Specified local_image with an arg for gce type
198*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "isfile", return_value=False)
199*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "exists", return_value=True)
200*800a58d9SAndroid Build Coastguard Worker        self.args.local_image = "/test_path_to_dir/"
201*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._avd_type = constants.TYPE_GCE
202*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessImageArgs(self.args)
203*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._image_source, constants.IMAGE_SRC_LOCAL)
204*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._local_image_artifact,
205*800a58d9SAndroid Build Coastguard Worker                         "/test_path_to_dir/avd-system.tar.gz")
206*800a58d9SAndroid Build Coastguard Worker
207*800a58d9SAndroid Build Coastguard Worker    @mock.patch.object(avd_spec.AVDSpec, "_GetGitRemote")
208*800a58d9SAndroid Build Coastguard Worker    def testGetBranchFromRepo(self, mock_gitremote):
209*800a58d9SAndroid Build Coastguard Worker        """Test get branch name from repo info."""
210*800a58d9SAndroid Build Coastguard Worker        # Check aosp repo gets proper branch prefix.
211*800a58d9SAndroid Build Coastguard Worker        fake_subprocess = mock.MagicMock()
212*800a58d9SAndroid Build Coastguard Worker        fake_subprocess.stdout = mock.MagicMock()
213*800a58d9SAndroid Build Coastguard Worker        fake_subprocess.stdout.readline = mock.MagicMock(return_value='')
214*800a58d9SAndroid Build Coastguard Worker        fake_subprocess.poll = mock.MagicMock(return_value=0)
215*800a58d9SAndroid Build Coastguard Worker        fake_subprocess.returncode = 0
216*800a58d9SAndroid Build Coastguard Worker        return_value = "Manifest branch: fake_branch"
217*800a58d9SAndroid Build Coastguard Worker        fake_subprocess.communicate = mock.MagicMock(return_value=(return_value, ''))
218*800a58d9SAndroid Build Coastguard Worker        self.Patch(subprocess, "Popen", return_value=fake_subprocess)
219*800a58d9SAndroid Build Coastguard Worker
220*800a58d9SAndroid Build Coastguard Worker        mock_gitremote.return_value = "aosp"
221*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetBranchFromRepo(), "aosp-fake_branch")
222*800a58d9SAndroid Build Coastguard Worker
223*800a58d9SAndroid Build Coastguard Worker        # Check default repo gets default branch prefix.
224*800a58d9SAndroid Build Coastguard Worker        mock_gitremote.return_value = ""
225*800a58d9SAndroid Build Coastguard Worker        return_value = "Manifest branch: fake_branch"
226*800a58d9SAndroid Build Coastguard Worker        fake_subprocess.communicate = mock.MagicMock(return_value=(return_value, ''))
227*800a58d9SAndroid Build Coastguard Worker        self.Patch(subprocess, "Popen", return_value=fake_subprocess)
228*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetBranchFromRepo(), "git_fake_branch")
229*800a58d9SAndroid Build Coastguard Worker
230*800a58d9SAndroid Build Coastguard Worker        # Can't get branch from repo info, set it as default branch.
231*800a58d9SAndroid Build Coastguard Worker        return_value = "Manifest branch:"
232*800a58d9SAndroid Build Coastguard Worker        fake_subprocess.communicate = mock.MagicMock(return_value=(return_value, ''))
233*800a58d9SAndroid Build Coastguard Worker        self.Patch(subprocess, "Popen", return_value=fake_subprocess)
234*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetBranchFromRepo(), "aosp-main")
235*800a58d9SAndroid Build Coastguard Worker
236*800a58d9SAndroid Build Coastguard Worker    def testGetBuildBranch(self):
237*800a58d9SAndroid Build Coastguard Worker        """Test GetBuildBranch function"""
238*800a58d9SAndroid Build Coastguard Worker        # Test infer branch from build_id and build_target.
239*800a58d9SAndroid Build Coastguard Worker        build_client = mock.MagicMock()
240*800a58d9SAndroid Build Coastguard Worker        build_id = "fake_build_id"
241*800a58d9SAndroid Build Coastguard Worker        build_target = "fake_build_target"
242*800a58d9SAndroid Build Coastguard Worker        expected_branch = "fake_build_branch"
243*800a58d9SAndroid Build Coastguard Worker        self.Patch(android_build_client, "AndroidBuildClient",
244*800a58d9SAndroid Build Coastguard Worker                   return_value=build_client)
245*800a58d9SAndroid Build Coastguard Worker        self.Patch(auth, "CreateCredentials", return_value=mock.MagicMock())
246*800a58d9SAndroid Build Coastguard Worker        self.Patch(build_client, "GetBranch", return_value=expected_branch)
247*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetBuildBranch(build_id, build_target),
248*800a58d9SAndroid Build Coastguard Worker                         expected_branch)
249*800a58d9SAndroid Build Coastguard Worker        # Infer branch from "repo info" when build_id and build_target is None.
250*800a58d9SAndroid Build Coastguard Worker        self.Patch(self.AvdSpec, "_GetBranchFromRepo", return_value="repo_branch")
251*800a58d9SAndroid Build Coastguard Worker        build_id = None
252*800a58d9SAndroid Build Coastguard Worker        build_target = None
253*800a58d9SAndroid Build Coastguard Worker        expected_branch = "repo_branch"
254*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetBuildBranch(build_id, build_target),
255*800a58d9SAndroid Build Coastguard Worker                         expected_branch)
256*800a58d9SAndroid Build Coastguard Worker
257*800a58d9SAndroid Build Coastguard Worker    # pylint: disable=protected-access
258*800a58d9SAndroid Build Coastguard Worker    def testGetBuildTarget(self):
259*800a58d9SAndroid Build Coastguard Worker        """Test get build target name."""
260*800a58d9SAndroid Build Coastguard Worker        branch = "git_branch"
261*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._flavor = constants.FLAVOR_IOT
262*800a58d9SAndroid Build Coastguard Worker        self.args.avd_type = constants.TYPE_GCE
263*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
264*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec._GetBuildTarget(self.args, branch),
265*800a58d9SAndroid Build Coastguard Worker            "gce_x86_64_iot-userdebug")
266*800a58d9SAndroid Build Coastguard Worker
267*800a58d9SAndroid Build Coastguard Worker        branch = "aosp-master"
268*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._flavor = constants.FLAVOR_PHONE
269*800a58d9SAndroid Build Coastguard Worker        self.args.avd_type = constants.TYPE_CF
270*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
271*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec._GetBuildTarget(self.args, branch),
272*800a58d9SAndroid Build Coastguard Worker            "aosp_cf_x86_64_phone-userdebug")
273*800a58d9SAndroid Build Coastguard Worker
274*800a58d9SAndroid Build Coastguard Worker        branch = "aosp-main"
275*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._flavor = constants.FLAVOR_PHONE
276*800a58d9SAndroid Build Coastguard Worker        self.args.avd_type = constants.TYPE_CF
277*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
278*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec._GetBuildTarget(self.args, branch),
279*800a58d9SAndroid Build Coastguard Worker            "aosp_cf_x86_64_phone-trunk_staging-userdebug")
280*800a58d9SAndroid Build Coastguard Worker
281*800a58d9SAndroid Build Coastguard Worker        branch = "git_branch"
282*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._flavor = constants.FLAVOR_PHONE
283*800a58d9SAndroid Build Coastguard Worker        self.args.avd_type = constants.TYPE_CF
284*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
285*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec._GetBuildTarget(self.args, branch),
286*800a58d9SAndroid Build Coastguard Worker            "cf_x86_64_phone-userdebug")
287*800a58d9SAndroid Build Coastguard Worker
288*800a58d9SAndroid Build Coastguard Worker    # pylint: disable=protected-access
289*800a58d9SAndroid Build Coastguard Worker    def testProcessHWPropertyWithInvalidArgs(self):
290*800a58d9SAndroid Build Coastguard Worker        """Test _ProcessHWPropertyArgs with invalid args."""
291*800a58d9SAndroid Build Coastguard Worker        # Checking wrong resolution.
292*800a58d9SAndroid Build Coastguard Worker        args = mock.MagicMock()
293*800a58d9SAndroid Build Coastguard Worker        args.hw_property = "cpu:3,resolution:1280"
294*800a58d9SAndroid Build Coastguard Worker        args.reuse_instance_name = None
295*800a58d9SAndroid Build Coastguard Worker        with self.assertRaises(errors.InvalidHWPropertyError):
296*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec._ProcessHWPropertyArgs(args)
297*800a58d9SAndroid Build Coastguard Worker
298*800a58d9SAndroid Build Coastguard Worker        # Checking property should be int.
299*800a58d9SAndroid Build Coastguard Worker        args = mock.MagicMock()
300*800a58d9SAndroid Build Coastguard Worker        args.hw_property = "cpu:3,dpi:fake"
301*800a58d9SAndroid Build Coastguard Worker        with self.assertRaises(errors.InvalidHWPropertyError):
302*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec._ProcessHWPropertyArgs(args)
303*800a58d9SAndroid Build Coastguard Worker
304*800a58d9SAndroid Build Coastguard Worker        # Checking disk property should be with 'g' suffix.
305*800a58d9SAndroid Build Coastguard Worker        args = mock.MagicMock()
306*800a58d9SAndroid Build Coastguard Worker        args.hw_property = "cpu:3,disk:2"
307*800a58d9SAndroid Build Coastguard Worker        with self.assertRaises(errors.InvalidHWPropertyError):
308*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec._ProcessHWPropertyArgs(args)
309*800a58d9SAndroid Build Coastguard Worker
310*800a58d9SAndroid Build Coastguard Worker        # Checking memory property should be with 'g' suffix.
311*800a58d9SAndroid Build Coastguard Worker        args = mock.MagicMock()
312*800a58d9SAndroid Build Coastguard Worker        args.hw_property = "cpu:3,memory:2"
313*800a58d9SAndroid Build Coastguard Worker        with self.assertRaises(errors.InvalidHWPropertyError):
314*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec._ProcessHWPropertyArgs(args)
315*800a58d9SAndroid Build Coastguard Worker
316*800a58d9SAndroid Build Coastguard Worker    # pylint: disable=protected-access
317*800a58d9SAndroid Build Coastguard Worker    @mock.patch.object(utils, "PrintColorString")
318*800a58d9SAndroid Build Coastguard Worker    def testCheckCFBuildTarget(self, print_warning):
319*800a58d9SAndroid Build Coastguard Worker        """Test _CheckCFBuildTarget."""
320*800a58d9SAndroid Build Coastguard Worker        # patch correct env variable.
321*800a58d9SAndroid Build Coastguard Worker        self.Patch(utils, "GetBuildEnvironmentVariable",
322*800a58d9SAndroid Build Coastguard Worker                   return_value="cf_x86_phone-userdebug")
323*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._CheckCFBuildTarget(constants.INSTANCE_TYPE_REMOTE)
324*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._CheckCFBuildTarget(constants.INSTANCE_TYPE_LOCAL)
325*800a58d9SAndroid Build Coastguard Worker
326*800a58d9SAndroid Build Coastguard Worker        self.Patch(utils, "GetBuildEnvironmentVariable",
327*800a58d9SAndroid Build Coastguard Worker                   return_value="aosp_cf_arm64_auto-userdebug")
328*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._CheckCFBuildTarget(constants.INSTANCE_TYPE_HOST)
329*800a58d9SAndroid Build Coastguard Worker        # patch wrong env variable.
330*800a58d9SAndroid Build Coastguard Worker        self.Patch(utils, "GetBuildEnvironmentVariable",
331*800a58d9SAndroid Build Coastguard Worker                   return_value="test_environ")
332*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._CheckCFBuildTarget(constants.INSTANCE_TYPE_REMOTE)
333*800a58d9SAndroid Build Coastguard Worker
334*800a58d9SAndroid Build Coastguard Worker        print_warning.assert_called_once()
335*800a58d9SAndroid Build Coastguard Worker
336*800a58d9SAndroid Build Coastguard Worker    # pylint: disable=protected-access
337*800a58d9SAndroid Build Coastguard Worker    def testParseHWPropertyStr(self):
338*800a58d9SAndroid Build Coastguard Worker        """Test _ParseHWPropertyStr."""
339*800a58d9SAndroid Build Coastguard Worker        expected_dict = {"cpu": "2", "x_res": "1080", "y_res": "1920",
340*800a58d9SAndroid Build Coastguard Worker                         "dpi": "240", "memory": "4096", "disk": "4096"}
341*800a58d9SAndroid Build Coastguard Worker        args_str = "cpu:2,resolution:1080x1920,dpi:240,memory:4g,disk:4g"
342*800a58d9SAndroid Build Coastguard Worker        result_dict = self.AvdSpec._ParseHWPropertyStr(args_str)
343*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(expected_dict == result_dict)
344*800a58d9SAndroid Build Coastguard Worker
345*800a58d9SAndroid Build Coastguard Worker        expected_dict = {"cpu": "2", "x_res": "1080", "y_res": "1920",
346*800a58d9SAndroid Build Coastguard Worker                         "dpi": "240", "memory": "512", "disk": "4096"}
347*800a58d9SAndroid Build Coastguard Worker        args_str = "cpu:2,resolution:1080x1920,dpi:240,memory:512m,disk:4g"
348*800a58d9SAndroid Build Coastguard Worker        result_dict = self.AvdSpec._ParseHWPropertyStr(args_str)
349*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(expected_dict == result_dict)
350*800a58d9SAndroid Build Coastguard Worker
351*800a58d9SAndroid Build Coastguard Worker    def testGetFlavorFromBuildTargetString(self):
352*800a58d9SAndroid Build Coastguard Worker        """Test _GetFlavorFromLocalImage."""
353*800a58d9SAndroid Build Coastguard Worker        img_path = "/fack_path/cf_x86_tv-img-eng.user.zip"
354*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetFlavorFromString(img_path),
355*800a58d9SAndroid Build Coastguard Worker                         "tv")
356*800a58d9SAndroid Build Coastguard Worker
357*800a58d9SAndroid Build Coastguard Worker        build_target_str = "aosp_cf_x86_auto"
358*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetFlavorFromString(
359*800a58d9SAndroid Build Coastguard Worker            build_target_str), "auto")
360*800a58d9SAndroid Build Coastguard Worker
361*800a58d9SAndroid Build Coastguard Worker        # Flavor is not supported.
362*800a58d9SAndroid Build Coastguard Worker        img_path = "/fack_path/cf_x86_error-img-eng.user.zip"
363*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetFlavorFromString(img_path),
364*800a58d9SAndroid Build Coastguard Worker                         None)
365*800a58d9SAndroid Build Coastguard Worker
366*800a58d9SAndroid Build Coastguard Worker    # pylint: disable=protected-access,too-many-statements
367*800a58d9SAndroid Build Coastguard Worker    def testProcessRemoteBuildArgs(self):
368*800a58d9SAndroid Build Coastguard Worker        """Test _ProcessRemoteBuildArgs."""
369*800a58d9SAndroid Build Coastguard Worker        self.args.branch = "git_master"
370*800a58d9SAndroid Build Coastguard Worker        self.args.build_id = "1234"
371*800a58d9SAndroid Build Coastguard Worker        self.args.launch_args = None
372*800a58d9SAndroid Build Coastguard Worker
373*800a58d9SAndroid Build Coastguard Worker        # Verify auto-assigned avd_type if build_targe contains "_gce_".
374*800a58d9SAndroid Build Coastguard Worker        self.args.build_target = "aosp_gce_x86_phone-userdebug"
375*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
376*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(self.AvdSpec.avd_type == "gce")
377*800a58d9SAndroid Build Coastguard Worker
378*800a58d9SAndroid Build Coastguard Worker        # Verify auto-assigned avd_type if build_targe contains "gce_".
379*800a58d9SAndroid Build Coastguard Worker        self.args.build_target = "gce_x86_phone-userdebug"
380*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
381*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(self.AvdSpec.avd_type == "gce")
382*800a58d9SAndroid Build Coastguard Worker
383*800a58d9SAndroid Build Coastguard Worker        # Verify auto-assigned avd_type if build_targe contains "_cf_".
384*800a58d9SAndroid Build Coastguard Worker        self.args.build_target = "aosp_cf_x86_64_phone-userdebug"
385*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
386*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(self.AvdSpec.avd_type == "cuttlefish")
387*800a58d9SAndroid Build Coastguard Worker
388*800a58d9SAndroid Build Coastguard Worker        # Verify auto-assigned avd_type if build_targe contains "cf_".
389*800a58d9SAndroid Build Coastguard Worker        self.args.build_target = "cf_x86_phone-userdebug"
390*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
391*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(self.AvdSpec.avd_type == "cuttlefish")
392*800a58d9SAndroid Build Coastguard Worker
393*800a58d9SAndroid Build Coastguard Worker        # Verify auto-assigned avd_type if build_targe contains "sdk_".
394*800a58d9SAndroid Build Coastguard Worker        self.args.build_target = "sdk_phone_armv7-sdk"
395*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
396*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(self.AvdSpec.avd_type == "goldfish")
397*800a58d9SAndroid Build Coastguard Worker
398*800a58d9SAndroid Build Coastguard Worker        # Verify auto-assigned avd_type if build_targe contains "_sdk_".
399*800a58d9SAndroid Build Coastguard Worker        self.args.build_target = "aosp_sdk_phone_armv7-sdk"
400*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
401*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(self.AvdSpec.avd_type == "goldfish")
402*800a58d9SAndroid Build Coastguard Worker
403*800a58d9SAndroid Build Coastguard Worker        # Verify auto-assigned avd_type if build_target contains "_trusty_".
404*800a58d9SAndroid Build Coastguard Worker        self.args.build_target = "qemu_trusty_arm64-trunk_staging-userdebug"
405*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
406*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(self.AvdSpec.avd_type == "trusty")
407*800a58d9SAndroid Build Coastguard Worker
408*800a58d9SAndroid Build Coastguard Worker        # Verify extra build info.
409*800a58d9SAndroid Build Coastguard Worker        self.args.system_branch = "system_branch"
410*800a58d9SAndroid Build Coastguard Worker        self.args.system_build_target = "system_build_target"
411*800a58d9SAndroid Build Coastguard Worker        self.args.system_build_id = "system_build_id"
412*800a58d9SAndroid Build Coastguard Worker        self.args.ota_branch = "ota_branch"
413*800a58d9SAndroid Build Coastguard Worker        self.args.ota_build_target = "ota_build_target"
414*800a58d9SAndroid Build Coastguard Worker        self.args.ota_build_id = "ota_build_id"
415*800a58d9SAndroid Build Coastguard Worker        self.args.kernel_branch = "kernel_branch"
416*800a58d9SAndroid Build Coastguard Worker        self.args.kernel_build_target = "kernel_build_target"
417*800a58d9SAndroid Build Coastguard Worker        self.args.kernel_build_id = "kernel_build_id"
418*800a58d9SAndroid Build Coastguard Worker        self.args.boot_branch = "boot_branch"
419*800a58d9SAndroid Build Coastguard Worker        self.args.boot_build_target = "boot_build_target"
420*800a58d9SAndroid Build Coastguard Worker        self.args.boot_build_id = "boot_build_id"
421*800a58d9SAndroid Build Coastguard Worker        self.args.boot_artifact = "boot_artifact"
422*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
423*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
424*800a58d9SAndroid Build Coastguard Worker            {constants.BUILD_BRANCH: "system_branch",
425*800a58d9SAndroid Build Coastguard Worker             constants.BUILD_TARGET: "system_build_target",
426*800a58d9SAndroid Build Coastguard Worker             constants.BUILD_ID: "system_build_id"},
427*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec.system_build_info)
428*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
429*800a58d9SAndroid Build Coastguard Worker            {constants.BUILD_BRANCH: "kernel_branch",
430*800a58d9SAndroid Build Coastguard Worker             constants.BUILD_TARGET: "kernel_build_target",
431*800a58d9SAndroid Build Coastguard Worker             constants.BUILD_ID: "kernel_build_id"},
432*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec.kernel_build_info)
433*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
434*800a58d9SAndroid Build Coastguard Worker            {constants.BUILD_BRANCH: "boot_branch",
435*800a58d9SAndroid Build Coastguard Worker             constants.BUILD_TARGET: "boot_build_target",
436*800a58d9SAndroid Build Coastguard Worker             constants.BUILD_ID: "boot_build_id",
437*800a58d9SAndroid Build Coastguard Worker             constants.BUILD_ARTIFACT: "boot_artifact"},
438*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec.boot_build_info)
439*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
440*800a58d9SAndroid Build Coastguard Worker            {constants.BUILD_BRANCH: "ota_branch",
441*800a58d9SAndroid Build Coastguard Worker             constants.BUILD_TARGET: "ota_build_target",
442*800a58d9SAndroid Build Coastguard Worker             constants.BUILD_ID: "ota_build_id"},
443*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec.ota_build_info)
444*800a58d9SAndroid Build Coastguard Worker
445*800a58d9SAndroid Build Coastguard Worker        # Verify auto-assigned avd_type if no match, default as cuttlefish.
446*800a58d9SAndroid Build Coastguard Worker        self.args.build_target = "mini_emulator_arm64-userdebug"
447*800a58d9SAndroid Build Coastguard Worker        self.args.avd_type = "cuttlefish"
448*800a58d9SAndroid Build Coastguard Worker        # reset args.avd_type default value as cuttlefish.
449*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec = avd_spec.AVDSpec(self.args)
450*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessRemoteBuildArgs(self.args)
451*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(self.AvdSpec.avd_type == "cuttlefish")
452*800a58d9SAndroid Build Coastguard Worker
453*800a58d9SAndroid Build Coastguard Worker    def testEscapeAnsi(self):
454*800a58d9SAndroid Build Coastguard Worker        """Test EscapeAnsi."""
455*800a58d9SAndroid Build Coastguard Worker        test_string = "\033[1;32;40m Manifest branch:"
456*800a58d9SAndroid Build Coastguard Worker        expected_result = " Manifest branch:"
457*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(avd_spec.EscapeAnsi(test_string), expected_result)
458*800a58d9SAndroid Build Coastguard Worker
459*800a58d9SAndroid Build Coastguard Worker    def testGetGceLocalImagePath(self):
460*800a58d9SAndroid Build Coastguard Worker        """Test get gce local image path."""
461*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "isfile", return_value=True)
462*800a58d9SAndroid Build Coastguard Worker        # Verify when specify --local-image ~/XXX.tar.gz.
463*800a58d9SAndroid Build Coastguard Worker        fake_image_path = "~/gce_local_image_dir/gce_image.tar.gz"
464*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "exists", return_value=True)
465*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetGceLocalImagePath(fake_image_path),
466*800a58d9SAndroid Build Coastguard Worker                         "~/gce_local_image_dir/gce_image.tar.gz")
467*800a58d9SAndroid Build Coastguard Worker
468*800a58d9SAndroid Build Coastguard Worker        # Verify when specify --local-image ~/XXX.img.
469*800a58d9SAndroid Build Coastguard Worker        fake_image_path = "~/gce_local_image_dir/gce_image.img"
470*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetGceLocalImagePath(fake_image_path),
471*800a58d9SAndroid Build Coastguard Worker                         "~/gce_local_image_dir/gce_image.img")
472*800a58d9SAndroid Build Coastguard Worker
473*800a58d9SAndroid Build Coastguard Worker        # Verify if exist argument --local-image as a directory.
474*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "isfile", return_value=False)
475*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "exists", return_value=True)
476*800a58d9SAndroid Build Coastguard Worker        fake_image_path = "~/gce_local_image_dir/"
477*800a58d9SAndroid Build Coastguard Worker        # Default to find */avd-system.tar.gz if exist then return the path.
478*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetGceLocalImagePath(fake_image_path),
479*800a58d9SAndroid Build Coastguard Worker                         "~/gce_local_image_dir/avd-system.tar.gz")
480*800a58d9SAndroid Build Coastguard Worker
481*800a58d9SAndroid Build Coastguard Worker        # Otherwise choose raw file */android_system_disk_syslinux.img if
482*800a58d9SAndroid Build Coastguard Worker        # exist then return the path.
483*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "exists", side_effect=[False, True])
484*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._GetGceLocalImagePath(fake_image_path),
485*800a58d9SAndroid Build Coastguard Worker                         "~/gce_local_image_dir/android_system_disk_syslinux.img")
486*800a58d9SAndroid Build Coastguard Worker
487*800a58d9SAndroid Build Coastguard Worker        # Both _GCE_LOCAL_IMAGE_CANDIDATE could not be found then raise error.
488*800a58d9SAndroid Build Coastguard Worker        self.Patch(os.path, "exists", side_effect=[False, False])
489*800a58d9SAndroid Build Coastguard Worker        self.assertRaises(errors.ImgDoesNotExist,
490*800a58d9SAndroid Build Coastguard Worker                          self.AvdSpec._GetGceLocalImagePath, fake_image_path)
491*800a58d9SAndroid Build Coastguard Worker
492*800a58d9SAndroid Build Coastguard Worker    def testProcessMiscArgs(self):
493*800a58d9SAndroid Build Coastguard Worker        """Test process misc args."""
494*800a58d9SAndroid Build Coastguard Worker        self.args.remote_host = None
495*800a58d9SAndroid Build Coastguard Worker        self.args.local_instance = None
496*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
497*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._instance_type, constants.INSTANCE_TYPE_REMOTE)
498*800a58d9SAndroid Build Coastguard Worker
499*800a58d9SAndroid Build Coastguard Worker        self.args.remote_host = None
500*800a58d9SAndroid Build Coastguard Worker        self.args.local_instance = 0
501*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
502*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._instance_type, constants.INSTANCE_TYPE_LOCAL)
503*800a58d9SAndroid Build Coastguard Worker
504*800a58d9SAndroid Build Coastguard Worker        self.args.remote_host = "1.1.1.1"
505*800a58d9SAndroid Build Coastguard Worker        self.args.local_instance = None
506*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
507*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._instance_type, constants.INSTANCE_TYPE_HOST)
508*800a58d9SAndroid Build Coastguard Worker
509*800a58d9SAndroid Build Coastguard Worker        self.args.remote_host = "1.1.1.1"
510*800a58d9SAndroid Build Coastguard Worker        self.args.local_instance = 1
511*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
512*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec._instance_type, constants.INSTANCE_TYPE_HOST)
513*800a58d9SAndroid Build Coastguard Worker
514*800a58d9SAndroid Build Coastguard Worker        self.args.oxygen = True
515*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
516*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(self.AvdSpec._oxygen)
517*800a58d9SAndroid Build Coastguard Worker
518*800a58d9SAndroid Build Coastguard Worker        # Test avd_spec.autoconnect
519*800a58d9SAndroid Build Coastguard Worker        self.args.autoconnect = False
520*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
521*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.autoconnect, False)
522*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_adb, False)
523*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_vnc, False)
524*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_webrtc, False)
525*800a58d9SAndroid Build Coastguard Worker
526*800a58d9SAndroid Build Coastguard Worker        self.args.autoconnect = constants.INS_KEY_VNC
527*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
528*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.autoconnect, True)
529*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_adb, True)
530*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_vnc, True)
531*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_webrtc, False)
532*800a58d9SAndroid Build Coastguard Worker
533*800a58d9SAndroid Build Coastguard Worker        self.args.autoconnect = constants.INS_KEY_ADB
534*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
535*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.autoconnect, True)
536*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_adb, True)
537*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_vnc, False)
538*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_webrtc, False)
539*800a58d9SAndroid Build Coastguard Worker
540*800a58d9SAndroid Build Coastguard Worker        self.args.autoconnect = constants.INS_KEY_WEBRTC
541*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
542*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.autoconnect, True)
543*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_adb, True)
544*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_vnc, False)
545*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.connect_webrtc, True)
546*800a58d9SAndroid Build Coastguard Worker
547*800a58d9SAndroid Build Coastguard Worker        # Test stable host image name.
548*800a58d9SAndroid Build Coastguard Worker        self.args.stable_host_image_name = "fake_host_image"
549*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
550*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.stable_host_image_name, "fake_host_image")
551*800a58d9SAndroid Build Coastguard Worker
552*800a58d9SAndroid Build Coastguard Worker        # Setup acloud config with betty_image spec
553*800a58d9SAndroid Build Coastguard Worker        self.mock_config.betty_image = 'from-config'
554*800a58d9SAndroid Build Coastguard Worker        # --betty-image from cmdline should override config
555*800a58d9SAndroid Build Coastguard Worker        self.args.cheeps_betty_image = 'from-cmdline'
556*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
557*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.cheeps_betty_image, 'from-cmdline')
558*800a58d9SAndroid Build Coastguard Worker        # acloud config value is used otherwise
559*800a58d9SAndroid Build Coastguard Worker        self.args.cheeps_betty_image = None
560*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
561*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.cheeps_betty_image, 'from-config')
562*800a58d9SAndroid Build Coastguard Worker
563*800a58d9SAndroid Build Coastguard Worker        # Verify cheeps_features is assigned from args.
564*800a58d9SAndroid Build Coastguard Worker        self.args.cheeps_features = ['a', 'b', 'c']
565*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
566*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.args.cheeps_features, ['a', 'b', 'c'])
567*800a58d9SAndroid Build Coastguard Worker
568*800a58d9SAndroid Build Coastguard Worker        # Verify connect_hostname
569*800a58d9SAndroid Build Coastguard Worker        self.mock_config.connect_hostname = True
570*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
571*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(self.AvdSpec.connect_hostname)
572*800a58d9SAndroid Build Coastguard Worker        self.args.connect_hostname = True
573*800a58d9SAndroid Build Coastguard Worker        self.mock_config.connect_hostname = False
574*800a58d9SAndroid Build Coastguard Worker        self.assertTrue(self.AvdSpec.connect_hostname)
575*800a58d9SAndroid Build Coastguard Worker
576*800a58d9SAndroid Build Coastguard Worker        # Verify fetch_cvd_version
577*800a58d9SAndroid Build Coastguard Worker        self.args.fetch_cvd_build_id = None
578*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
579*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.fetch_cvd_version, "LKGB")
580*800a58d9SAndroid Build Coastguard Worker
581*800a58d9SAndroid Build Coastguard Worker        self.args.fetch_cvd_build_id = "23456"
582*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
583*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(self.AvdSpec.fetch_cvd_version, "23456")
584*800a58d9SAndroid Build Coastguard Worker
585*800a58d9SAndroid Build Coastguard Worker        self.args.trusty_branch = "trusty_branch"
586*800a58d9SAndroid Build Coastguard Worker        self.args.trusty_build_id = "trusty_build_id"
587*800a58d9SAndroid Build Coastguard Worker        self.args.trusty_build_target = "trusty_build_target"
588*800a58d9SAndroid Build Coastguard Worker        self.AvdSpec._ProcessMiscArgs(self.args)
589*800a58d9SAndroid Build Coastguard Worker        self.assertEqual(
590*800a58d9SAndroid Build Coastguard Worker            {constants.BUILD_BRANCH: "trusty_branch",
591*800a58d9SAndroid Build Coastguard Worker             constants.BUILD_TARGET: "trusty_build_target",
592*800a58d9SAndroid Build Coastguard Worker             constants.BUILD_ID: "trusty_build_id"},
593*800a58d9SAndroid Build Coastguard Worker            self.AvdSpec.trusty_build_info)
594*800a58d9SAndroid Build Coastguard Worker
595*800a58d9SAndroid Build Coastguard Worker
596*800a58d9SAndroid Build Coastguard Workerif __name__ == "__main__":
597*800a58d9SAndroid Build Coastguard Worker    unittest.main()
598