You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
5.6 KiB
141 lines
5.6 KiB
#!/usr/bin/env python |
|
# |
|
# Copyright 2018 - The Android Open Source Project |
|
# |
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
|
# you may not use this file except in compliance with the License. |
|
# You may obtain a copy of the License at |
|
# |
|
# http://www.apache.org/licenses/LICENSE-2.0 |
|
# |
|
# Unless required by applicable law or agreed to in writing, software |
|
# distributed under the License is distributed on an "AS IS" BASIS, |
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
# See the License for the specific language governing permissions and |
|
# limitations under the License. |
|
r"""LocalImageRemoteInstance class. |
|
|
|
Create class that is responsible for creating a remote instance AVD with a |
|
local image. |
|
""" |
|
import uuid |
|
|
|
import glob |
|
import os |
|
import subprocess |
|
import time |
|
import unittest |
|
|
|
import mock |
|
|
|
from acloud import errors |
|
from acloud.create import avd_spec |
|
from acloud.create import create_common |
|
from acloud.create import local_image_remote_instance |
|
from acloud.internal import constants |
|
from acloud.internal.lib import auth |
|
from acloud.internal.lib import cvd_compute_client |
|
from acloud.internal.lib import driver_test_lib |
|
from acloud.internal.lib import utils |
|
|
|
|
|
class LocalImageRemoteInstanceTest(driver_test_lib.BaseDriverTest): |
|
"""Test LocalImageRemoteInstance method.""" |
|
|
|
def setUp(self): |
|
"""Initialize new LocalImageRemoteInstance.""" |
|
super(LocalImageRemoteInstanceTest, self).setUp() |
|
self.local_image_remote_instance = local_image_remote_instance.LocalImageRemoteInstance() |
|
|
|
def testVerifyHostPackageArtifactsExist(self): |
|
"""test verify host package artifacts exist.""" |
|
# Can't find the cvd host package |
|
with mock.patch("os.path.exists") as exists: |
|
exists.return_value = False |
|
self.assertRaises( |
|
errors.GetCvdLocalHostPackageError, |
|
self.local_image_remote_instance.VerifyHostPackageArtifactsExist) |
|
|
|
self.Patch(os.environ, "get", return_value="/fake_dir2") |
|
self.Patch(utils, "GetDistDir", return_value="/fake_dir1") |
|
# First path is host out dir, 2nd path is dist dir. |
|
self.Patch(os.path, "exists", |
|
side_effect=[False, True]) |
|
|
|
# Find cvd host in dist dir. |
|
self.assertEqual( |
|
self.local_image_remote_instance.VerifyHostPackageArtifactsExist(), |
|
"/fake_dir1/cvd-host_package.tar.gz") |
|
|
|
# Find cvd host in host out dir. |
|
self.Patch(os.environ, "get", return_value="/fake_dir2") |
|
self.Patch(utils, "GetDistDir", return_value=None) |
|
with mock.patch("os.path.exists") as exists: |
|
exists.return_value = True |
|
self.assertEqual( |
|
self.local_image_remote_instance.VerifyHostPackageArtifactsExist(), |
|
"/fake_dir2/cvd-host_package.tar.gz") |
|
|
|
|
|
class RemoteInstanceDeviceFactoryTest(driver_test_lib.BaseDriverTest): |
|
"""Test RemoteInstanceDeviceFactory method.""" |
|
|
|
def setUp(self): |
|
"""Set up the test.""" |
|
super(RemoteInstanceDeviceFactoryTest, self).setUp() |
|
self.Patch(auth, "CreateCredentials", return_value=mock.MagicMock()) |
|
self.Patch(cvd_compute_client.CvdComputeClient, "InitResourceHandle") |
|
|
|
# pylint: disable=protected-access |
|
def testSSHExecuteWithRetry(self): |
|
"""test SSHExecuteWithRetry method.""" |
|
self.Patch(time, "sleep") |
|
factory = local_image_remote_instance.RemoteInstanceDeviceFactory |
|
self.Patch(subprocess, "check_call", |
|
side_effect=subprocess.CalledProcessError( |
|
None, "ssh command fail.")) |
|
self.assertRaises(subprocess.CalledProcessError, |
|
factory._ShellCmdWithRetry, |
|
"fake cmd") |
|
self.assertEqual(subprocess.check_call.call_count, #pylint: disable=no-member |
|
local_image_remote_instance._SSH_CMD_MAX_RETRY + 1) |
|
self.Patch(subprocess, "check_call", return_value=True) |
|
self.assertEqual(factory._ShellCmdWithRetry("fake cmd"), True) |
|
|
|
# pylint: disable=protected-access |
|
def testCreateGceInstanceName(self): |
|
"""test create gce instance.""" |
|
self.Patch(utils, "GetBuildEnvironmentVariable", |
|
return_value="test_environ") |
|
self.Patch(glob, "glob", return_vale=["fake.img"]) |
|
self.Patch(create_common, "ZipCFImageFiles", |
|
return_value="/fake/aosp_cf_x86_phone-img-eng.username.zip") |
|
# Mock uuid |
|
args = mock.MagicMock() |
|
args.config_file = "" |
|
args.avd_type = constants.TYPE_CF |
|
args.flavor = "phone" |
|
args.local_image = None |
|
fake_avd_spec = avd_spec.AVDSpec(args) |
|
|
|
fake_uuid = mock.MagicMock(hex="1234") |
|
self.Patch(uuid, "uuid4", return_value=fake_uuid) |
|
self.Patch(cvd_compute_client.CvdComputeClient, "CreateInstance") |
|
fake_host_package_name = "/fake/host_package.tar.gz" |
|
fake_image_name = "/fake/aosp_cf_x86_phone-img-eng.username.zip" |
|
|
|
factory = local_image_remote_instance.RemoteInstanceDeviceFactory( |
|
fake_avd_spec, |
|
fake_image_name, |
|
fake_host_package_name) |
|
self.assertEqual(factory._CreateGceInstance(), "ins-1234-userbuild-aosp-cf-x86-phone") |
|
|
|
fake_image_name = "/fake/aosp_cf_x86_phone.username.zip" |
|
factory = local_image_remote_instance.RemoteInstanceDeviceFactory( |
|
fake_avd_spec, |
|
fake_image_name, |
|
fake_host_package_name) |
|
self.assertEqual(factory._CreateGceInstance(), "ins-1234-userbuild-phone") |
|
|
|
if __name__ == "__main__": |
|
unittest.main()
|
|
|