| #!/usr/bin/python |
| # |
| # Copyright 2014 Google Inc. All Rights Reserved |
| |
| import download_images |
| from utils import command_executer |
| from utils import logger |
| |
| import os |
| import mock |
| import unittest |
| |
| MOCK_LOGGER = logger.GetLogger(log_dir="", mock=True) |
| |
| class ImageDownloaderTestcast(unittest.TestCase): |
| |
| |
| @mock.patch.object(os, 'makedirs') |
| @mock.patch.object(os.path, 'exists') |
| def test_download_image(self, mock_path_exists, mock_mkdirs): |
| |
| # Set mock and test values. |
| mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter) |
| test_chroot = "/usr/local/home/chromeos" |
| test_build_id = "lumpy-release/R36-5814.0.0" |
| |
| downloader = download_images.ImageDownloader(logger_to_use=MOCK_LOGGER, |
| cmd_exec=mock_cmd_exec) |
| |
| # Set os.path.exists to always return False and run downloader |
| mock_path_exists.return_value = False |
| downloader._DownloadImage(test_chroot, test_build_id) |
| |
| # Verify os.path.exists was called twice, with proper arguments. |
| self.assertEqual(mock_path_exists.call_count, 2) |
| mock_path_exists.assert_called_with('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0/chromiumos_test_image.bin') |
| mock_path_exists.assert_any_call('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0') |
| |
| # Verify we called os.mkdirs |
| self.assertEqual(mock_mkdirs.call_count, 1) |
| mock_mkdirs.assert_called_with('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0') |
| |
| # Verify we called ChrootRunCommand once, with proper arguments. |
| self.assertEqual (mock_cmd_exec.ChrootRunCommand.call_count, 1) |
| mock_cmd_exec.ChrootRunCommand.assert_called_with('/usr/local/home/chromeos', 'gsutil cp gs://chromeos-image-archive/lumpy-release/R36-5814.0.0/chromiumos_test_image.tar.xz /tmp/lumpy-release/R36-5814.0.0') |
| |
| # Reset the velues in the mocks; set os.path.exists to always return True. |
| mock_path_exists.reset_mock() |
| mock_cmd_exec.reset_mock() |
| mock_path_exists.return_value = True |
| |
| # Run downloader |
| downloader._DownloadImage(test_chroot, test_build_id) |
| |
| # Verify os.path.exists was called twice, with proper arguments. |
| self.assertEqual(mock_path_exists.call_count, 2) |
| mock_path_exists.assert_called_with('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0/chromiumos_test_image.bin') |
| mock_path_exists.assert_any_call('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0') |
| |
| # Verify we made no RunCommand or ChrootRunCommand calls (since |
| # os.path.exists returned True, there was no work do be done). |
| self.assertEqual (mock_cmd_exec.RunCommand.call_count, 0) |
| self.assertEqual (mock_cmd_exec.ChrootRunCommand.call_count, 0) |
| |
| |
| |
| @mock.patch.object(os.path, 'exists') |
| def test_uncompress_image(self, mock_path_exists): |
| |
| # set mock and test values. |
| mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter) |
| test_chroot = '/usr/local/home/chromeos' |
| test_build_id = 'lumpy-release/R36-5814.0.0' |
| |
| downloader = download_images.ImageDownloader(logger_to_use=MOCK_LOGGER, |
| cmd_exec=mock_cmd_exec) |
| |
| # Set os.path.exists to always return False and run uncompress. |
| mock_path_exists.return_value = False |
| downloader._UncompressImage(test_chroot, test_build_id) |
| |
| # Verify os.path.exists was called once, with correct arguments. |
| self.assertEqual (mock_path_exists.call_count, 1) |
| mock_path_exists.assert_called_with('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0/chromiumos_test_image.bin') |
| |
| # Verify ChrootRunCommand was called, with correct arguments. |
| self.assertEqual (mock_cmd_exec.ChrootRunCommand.call_count, 1) |
| mock_cmd_exec.ChrootRunCommand.assert_called_with('/usr/local/home/chromeos', 'cd /tmp/lumpy-release/R36-5814.0.0 ;unxz chromiumos_test_image.tar.xz; tar -xvf chromiumos_test_image.tar') |
| |
| # Set os.path.exists to always return False and run uncompress. |
| mock_path_exists.reset_mock() |
| mock_cmd_exec.reset_mock() |
| mock_path_exists.return_value = True |
| downloader._UncompressImage(test_chroot, test_build_id) |
| |
| # Verify os.path.exists was called once, with correct arguments. |
| self.assertEqual (mock_path_exists.call_count, 1) |
| mock_path_exists.assert_called_with('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0/chromiumos_test_image.bin') |
| |
| # Verify ChrootRunCommand was not called. |
| self.assertEqual (mock_cmd_exec.ChrootRunCommand.call_count, 0) |
| |
| |
| |
| def test_run(self): |
| |
| # Set test arguments |
| test_chroot = "/usr/local/home/chromeos" |
| test_build_id = "remote/lumpy/latest-dev" |
| |
| # Set values to test/check. |
| self.called_download_image = False |
| self.called_uncompress_image = False |
| self.called_get_build_id = False |
| |
| # Define fake stub functions for Run to call |
| def FakeGetBuildID(unused_root, unused_xbuddy_label): |
| self.called_get_build_id = True |
| return 'lumpy-release/R36-5814.0.0' |
| |
| def GoodDownloadImage(root, build_id): |
| self.called_download_image = True |
| return "chromiumos_test_image.bin" |
| |
| def BadDownloadImage(root, build_id): |
| self.called_download_image = True |
| return None |
| |
| def FakeUncompressImage(root, build_id): |
| self.called_uncompress_image = True |
| return 0 |
| |
| # Initialize downloader |
| downloader = download_images.ImageDownloader(logger_to_use=MOCK_LOGGER) |
| |
| # Set downloader to call fake stubs. |
| downloader._GetBuildID = FakeGetBuildID |
| downloader._UncompressImage = FakeUncompressImage |
| downloader._DownloadImage = GoodDownloadImage |
| |
| # Call Run. |
| downloader.Run(test_chroot, test_build_id) |
| |
| # Make sure it called both _DownloadImage and _UncompressImage |
| self.assertTrue (self.called_download_image) |
| self.assertTrue (self.called_uncompress_image) |
| |
| # Reset values; Now use fake stub that simulates DownloadImage failing. |
| self.called_download_image = False |
| self.called_uncompress_image = False |
| downloader._DownloadImage = BadDownloadImage |
| |
| # Call Run again. |
| downloader.Run (test_chroot, test_build_id) |
| |
| # Verify that UncompressImage was not called, since _DownloadImage "failed" |
| self.assertTrue (self.called_download_image) |
| self.assertFalse (self.called_uncompress_image) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |