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.

171 lines
6.8 KiB

# Copyright 2019 - 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.
"""Tests for pull."""
import unittest
import os
import tempfile
from unittest import mock
from acloud import errors
from acloud.internal import constants
from acloud.internal.lib import driver_test_lib
from acloud.internal.lib import ssh
from acloud.internal.lib import utils
from acloud.list import list as list_instances
from acloud.public import config
from acloud.pull import pull
class PullTest(driver_test_lib.BaseDriverTest):
"""Test pull."""
# pylint: disable=no-member
def testPullFileFromInstance(self):
"""test PullFileFromInstance."""
cfg = mock.MagicMock()
cfg.ssh_private_key_path = "fake_ssh_path"
cfg.extra_args_ssh_tunnel = ""
instance = mock.MagicMock()
instance.ip = "1.1.1.1"
# Multiple selected files case.
selected_files = ["file1.log", "file2.log"]
self.Patch(pull, "SelectLogFileToPull", return_value=selected_files)
self.Patch(pull, "GetDownloadLogFolder", return_value="fake_folder")
self.Patch(pull, "PullLogs")
self.Patch(pull, "DisplayLog")
pull.PullFileFromInstance(cfg, instance)
self.assertEqual(pull.DisplayLog.call_count, 0)
# Only one file selected case.
selected_files = ["file1.log"]
self.Patch(pull, "SelectLogFileToPull", return_value=selected_files)
pull.PullFileFromInstance(cfg, instance)
self.assertEqual(pull.DisplayLog.call_count, 1)
# pylint: disable=no-member
def testPullLogs(self):
"""test PullLogs."""
_ssh = mock.MagicMock()
self.Patch(utils, "PrintColorString")
log_files = ["file1.log", "file2.log"]
download_folder = "/fake_folder"
pull.PullLogs(_ssh, log_files, download_folder)
self.assertEqual(_ssh.ScpPullFile.call_count, 2)
utils.PrintColorString.assert_called_once()
@mock.patch.object(ssh.Ssh, "Run")
def testDisplayLog(self, mock_ssh_run):
"""Test DisplayLog."""
fake_ip = ssh.IP(external="1.1.1.1", internal="10.1.1.1")
_ssh = ssh.Ssh(ip=fake_ip,
user=constants.GCE_USER,
ssh_private_key_path="/fake/acloud_rea")
self.Patch(utils, "GetUserAnswerYes", return_value="Y")
log_file = "file1.log"
pull.DisplayLog(_ssh, log_file)
expected_cmd = "tail -f -n +1 %s" % log_file
mock_ssh_run.assert_has_calls([
mock.call(expected_cmd, show_output=True)])
def testGetDownloadLogFolder(self):
"""test GetDownloadLogFolder."""
self.Patch(tempfile, "gettempdir", return_value="/tmp")
self.Patch(os.path, "exists", return_value=True)
instance = "instance"
expected_path = "/tmp/instance"
self.assertEqual(pull.GetDownloadLogFolder(instance), expected_path)
def testSelectLogFileToPull(self):
"""test choose log files from the remote instance."""
_ssh = mock.MagicMock()
# Test only one log file case
log_files = ["file1.log"]
self.Patch(pull, "GetAllLogFilePaths", return_value=log_files)
expected_result = ["file1.log"]
self.assertEqual(pull.SelectLogFileToPull(_ssh), expected_result)
# Test no log files case
self.Patch(pull, "GetAllLogFilePaths", return_value=[])
with self.assertRaises(errors.CheckPathError):
pull.SelectLogFileToPull(_ssh)
# Test two log files case.
log_files = ["file1.log", "file2.log"]
choose_log = ["file2.log"]
self.Patch(pull, "GetAllLogFilePaths", return_value=log_files)
self.Patch(utils, "GetAnswerFromList", return_value=choose_log)
expected_result = ["file2.log"]
self.assertEqual(pull.SelectLogFileToPull(_ssh), expected_result)
# Test user provided file name exist.
log_files = ["/home/vsoc-01/cuttlefish_runtime/file1.log",
"/home/vsoc-01/cuttlefish_runtime/file2.log"]
input_file = "file1.log"
self.Patch(pull, "GetAllLogFilePaths", return_value=log_files)
expected_result = ["/home/vsoc-01/cuttlefish_runtime/file1.log"]
self.assertEqual(pull.SelectLogFileToPull(_ssh, input_file), expected_result)
# Test user provided file name not exist.
log_files = ["/home/vsoc-01/cuttlefish_runtime/file1.log",
"/home/vsoc-01/cuttlefish_runtime/file2.log"]
input_file = "not_exist.log"
self.Patch(pull, "GetAllLogFilePaths", return_value=log_files)
with self.assertRaises(errors.CheckPathError):
pull.SelectLogFileToPull(_ssh, input_file)
def testFilterLogfiles(self):
"""test filer log file from black list."""
# Filter out file name is "kernel".
files = ["kernel.log", "logcat", "kernel"]
expected_result = ["kernel.log", "logcat"]
self.assertEqual(pull.FilterLogfiles(files), expected_result)
# Filter out file extension is ".img".
files = ["kernel.log", "system.img", "userdata.img", "launcher.log"]
expected_result = ["kernel.log", "launcher.log"]
self.assertEqual(pull.FilterLogfiles(files), expected_result)
@mock.patch.object(pull, "PullFileFromInstance")
def testRun(self, mock_pull_file):
"""test Run."""
cfg = mock.MagicMock()
args = mock.MagicMock()
instance_obj = mock.MagicMock()
# Test case with provided instance name.
args.instance_name = "instance_1"
args.file_name = "file1.log"
args.no_prompt = True
self.Patch(config, "GetAcloudConfig", return_value=cfg)
self.Patch(list_instances, "GetInstancesFromInstanceNames",
return_value=[instance_obj])
pull.Run(args)
mock_pull_file.assert_has_calls([
mock.call(cfg, instance_obj, args.file_name, args.no_prompt)])
# Test case for user select one instance to pull log.
selected_instance = mock.MagicMock()
self.Patch(list_instances, "ChooseOneRemoteInstance",
return_value=selected_instance)
args.instance_name = None
pull.Run(args)
mock_pull_file.assert_has_calls([
mock.call(cfg, selected_instance, args.file_name, args.no_prompt)])
if __name__ == '__main__':
unittest.main()