323 lines
13 KiB
Python
Executable File
323 lines
13 KiB
Python
Executable File
#!/usr/bin/python2
|
|
#pylint: disable-msg=C0111
|
|
__author__ = "raphtee@google.com (Travis Miller)"
|
|
|
|
import unittest, os, tempfile, logging
|
|
|
|
import common
|
|
from autotest_lib.server import autotest, utils, hosts, server_job, profilers
|
|
from autotest_lib.client.bin import sysinfo
|
|
from autotest_lib.client.common_lib import packages
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.client.common_lib.test_utils import mock
|
|
|
|
|
|
class TestAutotest(unittest.TestCase):
|
|
def setUp(self):
|
|
# create god
|
|
self.god = mock.mock_god()
|
|
|
|
# create mock host object
|
|
self.host = self.god.create_mock_class(hosts.RemoteHost, "host")
|
|
self.host.hostname = "hostname"
|
|
self.host.job = self.god.create_mock_class(server_job.server_job,
|
|
"job")
|
|
self.host.job.run_test_cleanup = True
|
|
self.host.job.sysinfo = self.god.create_mock_class(
|
|
sysinfo.sysinfo, "sysinfo")
|
|
self.host.job.profilers = self.god.create_mock_class(
|
|
profilers.profilers, "profilers")
|
|
self.host.job.profilers.add_log = {}
|
|
self.host.job.tmpdir = "/job/tmp"
|
|
self.host.job.default_profile_only = False
|
|
self.host.job.args = []
|
|
self.host.job.record = lambda *args: None
|
|
self.host.verify_job_repo_url = lambda *args: None
|
|
|
|
# stubs
|
|
self.god.stub_function(utils, "get_server_dir")
|
|
self.god.stub_function(utils, "run")
|
|
self.god.stub_function(utils, "get")
|
|
self.god.stub_function(utils, "read_keyval")
|
|
self.god.stub_function(utils, "write_keyval")
|
|
self.god.stub_function(utils, "system")
|
|
self.god.stub_function(tempfile, "mkstemp")
|
|
self.god.stub_function(tempfile, "mktemp")
|
|
self.god.stub_function(os, "getcwd")
|
|
self.god.stub_function(os, "system")
|
|
self.god.stub_function(os, "chdir")
|
|
self.god.stub_function(os, "makedirs")
|
|
self.god.stub_function(os, "remove")
|
|
self.god.stub_function(os, "fdopen")
|
|
self.god.stub_function(os.path, "exists")
|
|
self.god.stub_function(autotest, "open")
|
|
self.god.stub_function(autotest.global_config.global_config,
|
|
"get_config_value")
|
|
self.god.stub_function(logging, "exception")
|
|
self.god.stub_class(autotest, "_Run")
|
|
self.god.stub_class(autotest, "log_collector")
|
|
|
|
|
|
def tearDown(self):
|
|
self.god.unstub_all()
|
|
|
|
|
|
def construct(self):
|
|
# setup
|
|
self.serverdir = "serverdir"
|
|
|
|
# record
|
|
utils.get_server_dir.expect_call().and_return(self.serverdir)
|
|
|
|
# create the autotest object
|
|
self.autotest = autotest.Autotest(self.host)
|
|
self.autotest.job = self.host.job
|
|
self.god.stub_function(self.autotest, "_install_using_send_file")
|
|
|
|
# stub out abspath
|
|
self.god.stub_function(os.path, "abspath")
|
|
|
|
# check
|
|
self.god.check_playback()
|
|
|
|
|
|
def record_install_prologue(self):
|
|
self.construct()
|
|
|
|
# setup
|
|
self.god.stub_class(packages, "PackageManager")
|
|
self.autotest.got = False
|
|
location = os.path.join(self.serverdir, '../client')
|
|
location = os.path.abspath.expect_call(location).and_return(location)
|
|
|
|
# record
|
|
utils.get.expect_call(os.path.join(self.serverdir,
|
|
'../client')).and_return('source_material')
|
|
|
|
self.host.wait_up.expect_call(timeout=30)
|
|
self.host.setup.expect_call()
|
|
self.host.get_autodir.expect_call().and_return("autodir")
|
|
self.host.set_autodir.expect_call("autodir")
|
|
self.host.run.expect_call('mkdir -p autodir')
|
|
self.host.run.expect_call('rm -rf autodir/results/*',
|
|
ignore_status=True)
|
|
|
|
|
|
def test_constructor(self):
|
|
self.construct()
|
|
|
|
# we should check the calls
|
|
self.god.check_playback()
|
|
|
|
|
|
def test_full_client_install(self):
|
|
self.record_install_prologue()
|
|
|
|
self.host.run.expect_call('rm -f "autodir/packages.checksum"')
|
|
c = autotest.global_config.global_config
|
|
c.get_config_value.expect_call('PACKAGES',
|
|
'serve_packages_from_autoserv',
|
|
type=bool).and_return(False)
|
|
self.host.send_file.expect_call('source_material', 'autodir',
|
|
delete_dest=True)
|
|
self.god.stub_function(autotest.Autotest, "_send_shadow_config")
|
|
autotest.Autotest._send_shadow_config.expect_call()
|
|
self.host.run.expect_call('autodir/bin/fs_sync.py', ignore_status=True)
|
|
|
|
# run and check
|
|
self.autotest.install_full_client()
|
|
self.god.check_playback()
|
|
|
|
|
|
def test_autoserv_install(self):
|
|
self.record_install_prologue()
|
|
|
|
c = autotest.global_config.global_config
|
|
c.get_config_value.expect_call('PACKAGES',
|
|
'fetch_location', type=list, default=[]).and_return([])
|
|
|
|
os.path.exists.expect_call('/etc/cros_chroot_version').and_return(True)
|
|
c.get_config_value.expect_call('PACKAGES',
|
|
'serve_packages_from_autoserv',
|
|
type=bool).and_return(True)
|
|
self.autotest._install_using_send_file.expect_call(self.host,
|
|
'autodir')
|
|
self.god.stub_function(autotest.Autotest, "_send_shadow_config")
|
|
autotest.Autotest._send_shadow_config.expect_call()
|
|
self.host.run.expect_call('autodir/bin/fs_sync.py', ignore_status=True)
|
|
|
|
# run and check
|
|
self.autotest.install()
|
|
self.god.check_playback()
|
|
|
|
|
|
def test_packaging_install(self):
|
|
self.record_install_prologue()
|
|
|
|
c = autotest.global_config.global_config
|
|
c.get_config_value.expect_call('PACKAGES',
|
|
'fetch_location', type=list, default=[]).and_return(['repo'])
|
|
os.path.exists.expect_call('/etc/cros_chroot_version').and_return(True)
|
|
pkgmgr = packages.PackageManager.expect_new('autodir',
|
|
repo_urls=['repo'], hostname='hostname', do_locking=False,
|
|
run_function=self.host.run, run_function_dargs=dict(timeout=600))
|
|
pkg_dir = os.path.join('autodir', 'packages')
|
|
cmd = ('cd autodir && ls | grep -v "^packages$" | '
|
|
'grep -v "^result_tools$" | '
|
|
'xargs rm -rf && rm -rf .[!.]*')
|
|
self.host.run.expect_call(cmd)
|
|
pkgmgr.install_pkg.expect_call('autotest', 'client', pkg_dir,
|
|
'autodir', preserve_install_dir=True)
|
|
|
|
# run and check
|
|
self.autotest.install()
|
|
self.god.check_playback()
|
|
|
|
|
|
def test_run(self):
|
|
self.construct()
|
|
|
|
# setup
|
|
control = "control"
|
|
|
|
# stub out install
|
|
self.god.stub_function(self.autotest, "install")
|
|
|
|
# record
|
|
self.autotest.install.expect_call(self.host, use_packaging=True)
|
|
self.host.wait_up.expect_call(timeout=30)
|
|
os.path.abspath.expect_call('.').and_return('.')
|
|
run_obj = autotest._Run.expect_new(self.host, '.', None, False, False)
|
|
tag = None
|
|
run_obj.manual_control_file = os.path.join('autodir',
|
|
'control.%s' % tag)
|
|
run_obj.remote_control_file = os.path.join('autodir',
|
|
'control.%s.autoserv' % tag)
|
|
run_obj.tag = tag
|
|
run_obj.autodir = 'autodir'
|
|
run_obj.verify_machine.expect_call()
|
|
run_obj.background = False
|
|
debug = os.path.join('.', 'debug')
|
|
os.makedirs.expect_call(debug)
|
|
delete_file_list = [run_obj.remote_control_file,
|
|
run_obj.remote_control_file + '.state',
|
|
run_obj.manual_control_file,
|
|
run_obj.manual_control_file + '.state']
|
|
cmd = ';'.join('rm -f ' + control for control in delete_file_list)
|
|
self.host.run.expect_call(cmd, ignore_status=True)
|
|
|
|
utils.get.expect_call(control, local_copy=True).and_return("temp")
|
|
|
|
c = autotest.global_config.global_config
|
|
c.get_config_value.expect_call("PACKAGES",
|
|
'fetch_location', type=list, default=[]).and_return(['repo'])
|
|
|
|
cfile = self.god.create_mock_class(file, "file")
|
|
cfile_orig = "original control file"
|
|
cfile_new = "args = []\njob.add_repository(['repo'])\n"
|
|
cfile_new += cfile_orig
|
|
|
|
os.path.exists.expect_call('/etc/cros_chroot_version').and_return(True)
|
|
autotest.open.expect_call("temp").and_return(cfile)
|
|
cfile.read.expect_call().and_return(cfile_orig)
|
|
autotest.open.expect_call("temp", 'w').and_return(cfile)
|
|
cfile.write.expect_call(cfile_new)
|
|
|
|
self.host.job.preprocess_client_state.expect_call().and_return(
|
|
'/job/tmp/file1')
|
|
self.host.send_file.expect_call(
|
|
"/job/tmp/file1", "autodir/control.None.autoserv.init.state")
|
|
os.remove.expect_call("/job/tmp/file1")
|
|
|
|
self.host.send_file.expect_call("temp", run_obj.remote_control_file)
|
|
os.path.abspath.expect_call('temp').and_return('control_file')
|
|
os.path.abspath.expect_call('control').and_return('control')
|
|
os.remove.expect_call("temp")
|
|
|
|
run_obj.execute_control.expect_call(timeout=30,
|
|
client_disconnect_timeout=240)
|
|
|
|
# run and check output
|
|
self.autotest.run(control, timeout=30)
|
|
self.god.check_playback()
|
|
|
|
|
|
def _stub_get_client_autodir_paths(self):
|
|
def mock_get_client_autodir_paths(cls, host):
|
|
return ['/some/path', '/another/path']
|
|
self.god.stub_with(autotest.Autotest, 'get_client_autodir_paths',
|
|
classmethod(mock_get_client_autodir_paths))
|
|
|
|
|
|
def _expect_failed_run(self, command):
|
|
(self.host.run.expect_call(command)
|
|
.and_raises(error.AutoservRunError('dummy', object())))
|
|
|
|
|
|
def test_get_installed_autodir(self):
|
|
self._stub_get_client_autodir_paths()
|
|
self.host.get_autodir.expect_call().and_return(None)
|
|
self._expect_failed_run('test -x /some/path/bin/autotest')
|
|
self.host.run.expect_call('test -x /another/path/bin/autotest')
|
|
self.host.run.expect_call('test -w /another/path')
|
|
|
|
autodir = autotest.Autotest.get_installed_autodir(self.host)
|
|
self.assertEquals(autodir, '/another/path')
|
|
|
|
|
|
def test_get_install_dir(self):
|
|
self._stub_get_client_autodir_paths()
|
|
self.host.get_autodir.expect_call().and_return(None)
|
|
self._expect_failed_run('test -x /some/path/bin/autotest')
|
|
self._expect_failed_run('test -x /another/path/bin/autotest')
|
|
self._expect_failed_run('mkdir -p /some/path')
|
|
self.host.run.expect_call('mkdir -p /another/path')
|
|
self.host.run.expect_call('test -w /another/path')
|
|
|
|
install_dir = autotest.Autotest.get_install_dir(self.host)
|
|
self.assertEquals(install_dir, '/another/path')
|
|
|
|
|
|
def test_client_logger_process_line_log_copy_collection_failure(self):
|
|
collector = autotest.log_collector.expect_new(self.host, '', '')
|
|
logger = autotest.client_logger(self.host, '', '')
|
|
collector.collect_client_job_results.expect_call().and_raises(
|
|
Exception('log copy failure'))
|
|
logging.exception.expect_call(mock.is_string_comparator())
|
|
logger._process_line('AUTOTEST_TEST_COMPLETE:/autotest/fifo1')
|
|
|
|
|
|
def test_client_logger_process_line_log_copy_fifo_failure(self):
|
|
collector = autotest.log_collector.expect_new(self.host, '', '')
|
|
logger = autotest.client_logger(self.host, '', '')
|
|
collector.collect_client_job_results.expect_call()
|
|
self.host.run.expect_call('echo A > /autotest/fifo2').and_raises(
|
|
Exception('fifo failure'))
|
|
logging.exception.expect_call(mock.is_string_comparator())
|
|
logger._process_line('AUTOTEST_TEST_COMPLETE:/autotest/fifo2')
|
|
|
|
|
|
def test_client_logger_process_line_package_install_fifo_failure(self):
|
|
collector = autotest.log_collector.expect_new(self.host, '', '')
|
|
logger = autotest.client_logger(self.host, '', '')
|
|
self.god.stub_function(logger, '_send_tarball')
|
|
|
|
c = autotest.global_config.global_config
|
|
c.get_config_value.expect_call('PACKAGES',
|
|
'serve_packages_from_autoserv',
|
|
type=bool).and_return(True)
|
|
c.get_config_value.expect_call('PACKAGES',
|
|
'serve_packages_from_autoserv',
|
|
type=bool).and_return(True)
|
|
logger._send_tarball.expect_call('pkgname.tar.bz2', '/autotest/dest/')
|
|
|
|
self.host.run.expect_call('echo B > /autotest/fifo3').and_raises(
|
|
Exception('fifo failure'))
|
|
logging.exception.expect_call(mock.is_string_comparator())
|
|
logger._process_line('AUTOTEST_FETCH_PACKAGE:pkgname.tar.bz2:'
|
|
'/autotest/dest/:/autotest/fifo3')
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|