diff options
Diffstat (limited to 'crosperf/download_images_unittest.py')
-rwxr-xr-x | crosperf/download_images_unittest.py | 555 |
1 files changed, 297 insertions, 258 deletions
diff --git a/crosperf/download_images_unittest.py b/crosperf/download_images_unittest.py index 62b8d891..6a640f80 100755 --- a/crosperf/download_images_unittest.py +++ b/crosperf/download_images_unittest.py @@ -1,277 +1,316 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -# Copyright 2019 The Chromium OS Authors. All rights reserved. +# Copyright 2019 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Download image unittest.""" -from __future__ import print_function import os import unittest import unittest.mock as mock -import download_images from cros_utils import command_executer from cros_utils import logger - +import download_images import test_flag -MOCK_LOGGER = logger.GetLogger(log_dir='', mock=True) + +MOCK_LOGGER = logger.GetLogger(log_dir="", mock=True) class ImageDownloaderTestcast(unittest.TestCase): - """The image downloader test class.""" - - def __init__(self, *args, **kwargs): - super(ImageDownloaderTestcast, self).__init__(*args, **kwargs) - self.called_download_image = False - self.called_uncompress_image = False - self.called_get_build_id = False - self.called_download_autotest_files = False - self.called_download_debug_file = False - - @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' - image_path = ('gs://chromeos-image-archive/%s/chromiumos_test_image.tar.xz' - % test_build_id) - - 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 - test_flag.SetTestMode(True) - self.assertRaises(download_images.MissingImage, downloader.DownloadImage, - test_chroot, test_build_id, image_path) - - # 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 RunCommand once, with proper arguments. - self.assertEqual(mock_cmd_exec.RunCommand.call_count, 1) - expected_args = ( - '/usr/local/home/chromeos/src/chromium/depot_tools/gsutil.py ' - 'cp gs://chromeos-image-archive/lumpy-release/R36-5814.0.0/' - 'chromiumos_test_image.tar.xz ' - '/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0') - - mock_cmd_exec.RunCommand.assert_called_with(expected_args) - - # 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, image_path) - - # 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 - self.assertRaises(download_images.MissingImage, 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 RunCommand was called twice with correct arguments. - self.assertEqual(mock_cmd_exec.RunCommand.call_count, 2) - # Call 1, should have 2 arguments - self.assertEqual(len(mock_cmd_exec.RunCommand.call_args_list[0]), 2) - actual_arg = mock_cmd_exec.RunCommand.call_args_list[0][0] - expected_arg = ( - 'cd /usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0 ; ' - 'tar -Jxf chromiumos_test_image.tar.xz ',) - self.assertEqual(expected_arg, actual_arg) - # 2nd arg must be exception handler - except_handler_string = 'RunCommandExceptionHandler.HandleException' - self.assertTrue( - except_handler_string in repr(mock_cmd_exec.RunCommand.call_args_list[0] - [1])) - - # Call 2, should have 2 arguments - self.assertEqual(len(mock_cmd_exec.RunCommand.call_args_list[1]), 2) - actual_arg = mock_cmd_exec.RunCommand.call_args_list[1][0] - expected_arg = ( - 'cd /usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0 ; ' - 'rm -f chromiumos_test_image.bin ',) - self.assertEqual(expected_arg, actual_arg) - # 2nd arg must be empty - self.assertTrue('{}' in repr(mock_cmd_exec.RunCommand.call_args_list[1][1])) - - # Set os.path.exists to always return True 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 RunCommand was not called. - self.assertEqual(mock_cmd_exec.RunCommand.call_count, 0) - - def test_run(self): - - # Set test arguments - test_chroot = '/usr/local/home/chromeos' - test_build_id = 'remote/lumpy/latest-dev' - test_empty_autotest_path = '' - test_empty_debug_path = '' - test_autotest_path = '/tmp/autotest' - test_debug_path = '/tmp/debug' - download_debug = True - - # Set values to test/check. - self.called_download_image = False - self.called_uncompress_image = False - self.called_get_build_id = False - self.called_download_autotest_files = False - self.called_download_debug_file = 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, image_path): - if root or build_id or image_path: - pass - self.called_download_image = True - return 'chromiumos_test_image.bin' - - def BadDownloadImage(root, build_id, image_path): - if root or build_id or image_path: - pass - self.called_download_image = True - raise download_images.MissingImage('Could not download image') - - def FakeUncompressImage(root, build_id): - if root or build_id: - pass - self.called_uncompress_image = True - return 0 - - def FakeDownloadAutotestFiles(root, build_id): - if root or build_id: - pass - self.called_download_autotest_files = True - return 'autotest' - - def FakeDownloadDebugFile(root, build_id): - if root or build_id: - pass - self.called_download_debug_file = True - return 'debug' - - # 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 - downloader.DownloadAutotestFiles = FakeDownloadAutotestFiles - downloader.DownloadDebugFile = FakeDownloadDebugFile - - # Call Run. - image_path, autotest_path, debug_path = downloader.Run( - test_chroot, test_build_id, test_empty_autotest_path, - test_empty_debug_path, download_debug) - - # Make sure it called both _DownloadImage and _UncompressImage - self.assertTrue(self.called_download_image) - self.assertTrue(self.called_uncompress_image) - # Make sure it called DownloadAutotestFiles - self.assertTrue(self.called_download_autotest_files) - # Make sure it called DownloadDebugFile - self.assertTrue(self.called_download_debug_file) - # Make sure it returned an image and autotest path returned from this call - self.assertTrue(image_path == 'chromiumos_test_image.bin') - self.assertTrue(autotest_path == 'autotest') - self.assertTrue(debug_path == 'debug') - - # Call Run with a non-empty autotest and debug path - self.called_download_autotest_files = False - self.called_download_debug_file = False - - image_path, autotest_path, debug_path = downloader.Run( - test_chroot, test_build_id, test_autotest_path, test_debug_path, - download_debug) - - # Verify that downloadAutotestFiles was not called - self.assertFalse(self.called_download_autotest_files) - # Make sure it returned the specified autotest path returned from this call - self.assertTrue(autotest_path == test_autotest_path) - # Make sure it returned the specified debug path returned from this call - self.assertTrue(debug_path == test_debug_path) - - # Reset values; Now use fake stub that simulates DownloadImage failing. - self.called_download_image = False - self.called_uncompress_image = False - self.called_download_autotest_files = False - self.called_download_debug_file = False - downloader.DownloadImage = BadDownloadImage - - # Call Run again. - self.assertRaises(download_images.MissingImage, downloader.Run, test_chroot, - test_autotest_path, test_debug_path, test_build_id, - download_debug) - - # Verify that UncompressImage and downloadAutotestFiles were not called, - # since _DownloadImage "failed" - self.assertTrue(self.called_download_image) - self.assertFalse(self.called_uncompress_image) - self.assertFalse(self.called_download_autotest_files) - self.assertFalse(self.called_download_debug_file) - - -if __name__ == '__main__': - unittest.main() + """The image downloader test class.""" + + def __init__(self, *args, **kwargs): + super(ImageDownloaderTestcast, self).__init__(*args, **kwargs) + self.called_download_image = False + self.called_uncompress_image = False + self.called_get_build_id = False + self.called_download_autotest_files = False + self.called_download_debug_file = False + + @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" + image_path = ( + "gs://chromeos-image-archive/%s/chromiumos_test_image.tar.xz" + % test_build_id + ) + + 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 + test_flag.SetTestMode(True) + self.assertRaises( + download_images.MissingImage, + downloader.DownloadImage, + test_chroot, + test_build_id, + image_path, + ) + + # 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 RunCommand once, with proper arguments. + self.assertEqual(mock_cmd_exec.RunCommand.call_count, 1) + expected_args = ( + "/usr/local/home/chromeos/src/chromium/depot_tools/gsutil.py " + "cp gs://chromeos-image-archive/lumpy-release/R36-5814.0.0/" + "chromiumos_test_image.tar.xz " + "/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0" + ) + + mock_cmd_exec.RunCommand.assert_called_with(expected_args) + + # 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, image_path) + + # 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 + self.assertRaises( + download_images.MissingImage, + 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 RunCommand was called twice with correct arguments. + self.assertEqual(mock_cmd_exec.RunCommand.call_count, 2) + # Call 1, should have 2 arguments + self.assertEqual(len(mock_cmd_exec.RunCommand.call_args_list[0]), 2) + actual_arg = mock_cmd_exec.RunCommand.call_args_list[0][0] + expected_arg = ( + "cd /usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0 ; " + "tar -Jxf chromiumos_test_image.tar.xz ", + ) + self.assertEqual(expected_arg, actual_arg) + # 2nd arg must be exception handler + except_handler_string = "RunCommandExceptionHandler.HandleException" + self.assertTrue( + except_handler_string + in repr(mock_cmd_exec.RunCommand.call_args_list[0][1]) + ) + + # Call 2, should have 2 arguments + self.assertEqual(len(mock_cmd_exec.RunCommand.call_args_list[1]), 2) + actual_arg = mock_cmd_exec.RunCommand.call_args_list[1][0] + expected_arg = ( + "cd /usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0 ; " + "rm -f chromiumos_test_image.bin ", + ) + self.assertEqual(expected_arg, actual_arg) + # 2nd arg must be empty + self.assertTrue( + "{}" in repr(mock_cmd_exec.RunCommand.call_args_list[1][1]) + ) + + # Set os.path.exists to always return True 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 RunCommand was not called. + self.assertEqual(mock_cmd_exec.RunCommand.call_count, 0) + + def test_run(self): + + # Set test arguments + test_chroot = "/usr/local/home/chromeos" + test_build_id = "remote/lumpy/latest-dev" + test_empty_autotest_path = "" + test_empty_debug_path = "" + test_autotest_path = "/tmp/autotest" + test_debug_path = "/tmp/debug" + download_debug = True + + # Set values to test/check. + self.called_download_image = False + self.called_uncompress_image = False + self.called_get_build_id = False + self.called_download_autotest_files = False + self.called_download_debug_file = 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, image_path): + if root or build_id or image_path: + pass + self.called_download_image = True + return "chromiumos_test_image.bin" + + def BadDownloadImage(root, build_id, image_path): + if root or build_id or image_path: + pass + self.called_download_image = True + raise download_images.MissingImage("Could not download image") + + def FakeUncompressImage(root, build_id): + if root or build_id: + pass + self.called_uncompress_image = True + return 0 + + def FakeDownloadAutotestFiles(root, build_id): + if root or build_id: + pass + self.called_download_autotest_files = True + return "autotest" + + def FakeDownloadDebugFile(root, build_id): + if root or build_id: + pass + self.called_download_debug_file = True + return "debug" + + # 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 + downloader.DownloadAutotestFiles = FakeDownloadAutotestFiles + downloader.DownloadDebugFile = FakeDownloadDebugFile + + # Call Run. + image_path, autotest_path, debug_path = downloader.Run( + test_chroot, + test_build_id, + test_empty_autotest_path, + test_empty_debug_path, + download_debug, + ) + + # Make sure it called both _DownloadImage and _UncompressImage + self.assertTrue(self.called_download_image) + self.assertTrue(self.called_uncompress_image) + # Make sure it called DownloadAutotestFiles + self.assertTrue(self.called_download_autotest_files) + # Make sure it called DownloadDebugFile + self.assertTrue(self.called_download_debug_file) + # Make sure it returned an image and autotest path returned from this call + self.assertTrue(image_path == "chromiumos_test_image.bin") + self.assertTrue(autotest_path == "autotest") + self.assertTrue(debug_path == "debug") + + # Call Run with a non-empty autotest and debug path + self.called_download_autotest_files = False + self.called_download_debug_file = False + + image_path, autotest_path, debug_path = downloader.Run( + test_chroot, + test_build_id, + test_autotest_path, + test_debug_path, + download_debug, + ) + + # Verify that downloadAutotestFiles was not called + self.assertFalse(self.called_download_autotest_files) + # Make sure it returned the specified autotest path returned from this call + self.assertTrue(autotest_path == test_autotest_path) + # Make sure it returned the specified debug path returned from this call + self.assertTrue(debug_path == test_debug_path) + + # Reset values; Now use fake stub that simulates DownloadImage failing. + self.called_download_image = False + self.called_uncompress_image = False + self.called_download_autotest_files = False + self.called_download_debug_file = False + downloader.DownloadImage = BadDownloadImage + + # Call Run again. + self.assertRaises( + download_images.MissingImage, + downloader.Run, + test_chroot, + test_autotest_path, + test_debug_path, + test_build_id, + download_debug, + ) + + # Verify that UncompressImage and downloadAutotestFiles were not called, + # since _DownloadImage "failed" + self.assertTrue(self.called_download_image) + self.assertFalse(self.called_uncompress_image) + self.assertFalse(self.called_download_autotest_files) + self.assertFalse(self.called_download_debug_file) + + +if __name__ == "__main__": + unittest.main() |