| #!/usr/bin/python |
| |
| import mock |
| import os |
| import unittest |
| |
| import common |
| from autotest_lib.client.common_lib import autotemp |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.bin import local_host |
| |
| |
| class test_local_host_class(unittest.TestCase): |
| def setUp(self): |
| self.tmpdir = autotemp.tempdir(unique_id='localhost_unittest') |
| self.addCleanup(self.tmpdir.clean) |
| |
| |
| @mock.patch('autotest_lib.client.bin.local_host.platform.node') |
| def test_init_default_hostname(self, mock_node): |
| mock_node.return_value = 'foo' |
| host = local_host.LocalHost() |
| self.assertEqual(host.hostname, 'foo') |
| |
| |
| @mock.patch('autotest_lib.client.bin.local_host.platform.node') |
| def test_init_with_hostname(self, mock_node): |
| mock_node.return_value = 'foo' |
| host = local_host.LocalHost(hostname='bar') |
| self.assertEqual(host.hostname, 'bar') |
| |
| |
| def test_wait_up(self): |
| # just test that wait_up always works |
| host = local_host.LocalHost() |
| host.wait_up(1) |
| |
| |
| @mock.patch('autotest_lib.client.bin.local_host.utils.run') |
| def test_run_success(self, mock_run): |
| result = local_host.utils.CmdResult( |
| command='yes', |
| stdout='y', |
| stderr='', |
| exit_status=0, |
| duration=1, |
| ) |
| mock_run.return_value = result |
| |
| host = local_host.LocalHost() |
| got = host.run( |
| 'yes', |
| timeout=123, |
| ignore_status=True, |
| stdout_tee=local_host.utils.TEE_TO_LOGS, |
| stderr_tee=local_host.utils.TEE_TO_LOGS, |
| stdin=None, |
| ) |
| |
| self.assertEqual(got, result) |
| mock_run.assert_called_once_with( |
| result.command, |
| timeout=123, |
| ignore_status=True, |
| stdout_tee=local_host.utils.TEE_TO_LOGS, |
| stderr_tee=local_host.utils.TEE_TO_LOGS, |
| stdin=None, |
| ignore_timeout=False, |
| args=(), |
| ) |
| |
| |
| @mock.patch('autotest_lib.client.bin.local_host.utils.run') |
| def test_run_cmd_failure_raised(self, mock_run): |
| mock_result = mock.MagicMock() |
| mock_run.side_effect = error.CmdError('yes', mock_result) |
| |
| host = local_host.LocalHost() |
| with self.assertRaises(error.AutotestHostRunCmdError) as exc_cm: |
| host.run('yes', timeout=123) |
| |
| self.assertEqual(exc_cm.exception.result_obj, mock_result) |
| mock_run.assert_called_once_with( |
| 'yes', |
| timeout=123, |
| ignore_status=False, |
| stdout_tee=local_host.utils.TEE_TO_LOGS, |
| stderr_tee=local_host.utils.TEE_TO_LOGS, |
| stdin=None, |
| ignore_timeout=False, |
| args=(), |
| ) |
| |
| |
| @mock.patch('autotest_lib.client.bin.local_host.utils.run') |
| def test_run_cmd_timeout_raised(self, mock_run): |
| mock_result = mock.MagicMock() |
| mock_run.side_effect = error.CmdTimeoutError('yes', mock_result) |
| |
| host = local_host.LocalHost() |
| with self.assertRaises(error.AutotestHostRunTimeoutError) as exc_cm: |
| host.run('yes', timeout=123) |
| |
| self.assertEqual(exc_cm.exception.result_obj, mock_result) |
| mock_run.assert_called_once_with( |
| 'yes', |
| timeout=123, |
| ignore_status=False, |
| stdout_tee=local_host.utils.TEE_TO_LOGS, |
| stderr_tee=local_host.utils.TEE_TO_LOGS, |
| stdin=None, |
| ignore_timeout=False, |
| args=(), |
| ) |
| |
| |
| @mock.patch('autotest_lib.client.bin.local_host.utils.run') |
| def test_run_failure_ignored(self, mock_run): |
| result = local_host.utils.CmdResult( |
| command='yes', |
| stdout='', |
| stderr='err', |
| exit_status=1, |
| duration=1, |
| ) |
| mock_run.return_value = result |
| |
| host = local_host.LocalHost() |
| got = host.run('yes', timeout=123, ignore_status=True) |
| |
| self.assertEqual(got, result) |
| mock_run.assert_called_once_with( |
| result.command, |
| timeout=123, |
| ignore_status=True, |
| stdout_tee=local_host.utils.TEE_TO_LOGS, |
| stderr_tee=local_host.utils.TEE_TO_LOGS, |
| stdin=None, |
| ignore_timeout=False, |
| args=(), |
| ) |
| |
| |
| def test_list_files_glob(self): |
| host = local_host.LocalHost() |
| |
| files = (os.path.join(self.tmpdir.name, 'file1'), |
| os.path.join(self.tmpdir.name, 'file2')) |
| |
| # create some files in tmpdir |
| open(files[0], 'w').close() |
| open(files[1], 'w').close() |
| |
| self.assertItemsEqual( |
| files, |
| host.list_files_glob(os.path.join(self.tmpdir.name, '*'))) |
| |
| |
| def test_symlink_closure_does_not_add_existent_file(self): |
| host = local_host.LocalHost() |
| |
| # create a file and a symlink to it |
| fname = os.path.join(self.tmpdir.name, 'file') |
| sname = os.path.join(self.tmpdir.name, 'sym') |
| open(fname, 'w').close() |
| os.symlink(fname, sname) |
| |
| # test that when the symlinks point to already know files |
| # nothing is added |
| self.assertItemsEqual( |
| [fname, sname], |
| host.symlink_closure([fname, sname])) |
| |
| |
| def test_symlink_closure_adds_missing_files(self): |
| host = local_host.LocalHost() |
| |
| # create a file and a symlink to it |
| fname = os.path.join(self.tmpdir.name, 'file') |
| sname = os.path.join(self.tmpdir.name, 'sym') |
| open(fname, 'w').close() |
| os.symlink(fname, sname) |
| |
| # test that when the symlinks point to unknown files they are added |
| self.assertItemsEqual( |
| [fname, sname], |
| host.symlink_closure([sname])) |
| |
| |
| def test_get_file(self): |
| """Tests get_file() copying a regular file.""" |
| host = local_host.LocalHost() |
| |
| source_file = os.path.join(self.tmpdir.name, 'file') |
| open(os.path.join(source_file), 'w').close() |
| |
| dest_file = os.path.join(self.tmpdir.name, 'dest') |
| |
| host.get_file(source_file, dest_file) |
| self.assertTrue(os.path.isfile(dest_file)) |
| |
| |
| def test_get_directory_into_new_directory(self): |
| """Tests get_file() copying a directory into a new dir.""" |
| host = local_host.LocalHost() |
| |
| source_dir = os.path.join(self.tmpdir.name, 'dir') |
| os.mkdir(source_dir) |
| open(os.path.join(source_dir, 'file'), 'w').close() |
| |
| dest_dir = os.path.join(self.tmpdir.name, 'dest') |
| |
| host.get_file(source_dir, dest_dir) |
| |
| self.assertTrue(os.path.isfile(os.path.join(dest_dir, 'dir', 'file'))) |
| |
| |
| def test_get_directory_into_existing_directory(self): |
| """Tests get_file() copying a directory into an existing dir.""" |
| host = local_host.LocalHost() |
| |
| source_dir = os.path.join(self.tmpdir.name, 'dir') |
| os.mkdir(source_dir) |
| open(os.path.join(source_dir, 'file'), 'w').close() |
| |
| dest_dir = os.path.join(self.tmpdir.name, 'dest') |
| os.mkdir(dest_dir) |
| |
| host.get_file(source_dir, dest_dir) |
| |
| self.assertTrue(os.path.isfile(os.path.join(dest_dir, 'dir', 'file'))) |
| |
| |
| def test_get_directory_delete_dest(self): |
| """Tests get_file() replacing a dir.""" |
| host = local_host.LocalHost() |
| |
| source_dir = os.path.join(self.tmpdir.name, 'dir') |
| os.mkdir(source_dir) |
| open(os.path.join(source_dir, 'file'), 'w').close() |
| |
| dest_dir = os.path.join(self.tmpdir.name, 'dest') |
| os.mkdir(dest_dir) |
| os.mkdir(os.path.join(dest_dir, 'dir')) |
| open(os.path.join(dest_dir, 'dir', 'file2'), 'w').close() |
| |
| host.get_file(source_dir, dest_dir, delete_dest=True) |
| |
| self.assertTrue(os.path.isfile(os.path.join(dest_dir, 'dir', 'file'))) |
| self.assertFalse(os.path.isfile(os.path.join(dest_dir, 'dir', 'file2'))) |
| |
| |
| def test_get_directory_contents_into_new_directory(self): |
| """Tests get_file() copying dir contents to a new dir.""" |
| host = local_host.LocalHost() |
| |
| source_dir = os.path.join(self.tmpdir.name, 'dir') |
| os.mkdir(source_dir) |
| open(os.path.join(source_dir, 'file'), 'w').close() |
| |
| dest_dir = os.path.join(self.tmpdir.name, 'dest') |
| |
| # End the source with '/' to copy the contents only. |
| host.get_file(os.path.join(source_dir, ''), dest_dir) |
| |
| self.assertTrue(os.path.isfile(os.path.join(dest_dir, 'file'))) |
| |
| |
| def test_get_directory_contents_into_existing_directory(self): |
| """Tests get_file() copying dir contents into an existing dir.""" |
| host = local_host.LocalHost() |
| |
| source_dir = os.path.join(self.tmpdir.name, 'dir') |
| os.mkdir(source_dir) |
| open(os.path.join(source_dir, 'file'), 'w').close() |
| |
| dest_dir = os.path.join(self.tmpdir.name, 'dest') |
| os.mkdir(dest_dir) |
| |
| # End the source with '/' to copy the contents only. |
| host.get_file(os.path.join(source_dir, ''), dest_dir) |
| |
| self.assertTrue(os.path.isfile(os.path.join(dest_dir, 'file'))) |
| |
| |
| def test_get_directory_contents_delete_dest(self): |
| """Tests get_file() replacing contents of a dir.""" |
| host = local_host.LocalHost() |
| |
| source_dir = os.path.join(self.tmpdir.name, 'dir') |
| os.mkdir(source_dir) |
| open(os.path.join(source_dir, 'file'), 'w').close() |
| |
| dest_dir = os.path.join(self.tmpdir.name, 'dest') |
| os.mkdir(dest_dir) |
| open(os.path.join(dest_dir, 'file2'), 'w').close() |
| |
| # End the source with '/' to copy the contents only. |
| host.get_file(os.path.join(source_dir, ''), dest_dir, delete_dest=True) |
| |
| self.assertTrue(os.path.isfile(os.path.join(dest_dir, 'file'))) |
| self.assertFalse(os.path.isfile(os.path.join(dest_dir, 'file2'))) |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |