download_images_unittest.py revision 6ffbb92f0913f990b6a5c7ef706aee9bfb4faa9e
1#!/usr/bin/python 2# 3# Copyright 2014 Google Inc. All Rights Reserved 4 5import download_images 6from utils import command_executer 7from utils import logger 8 9import os 10import mock 11import unittest 12 13MOCK_LOGGER = logger.GetLogger(log_dir="", mock=True) 14 15class ImageDownloaderTestcast(unittest.TestCase): 16 17 18 @mock.patch.object(os, 'makedirs') 19 @mock.patch.object(os.path, 'exists') 20 def test_download_image(self, mock_path_exists, mock_mkdirs): 21 22 # Set mock and test values. 23 mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter) 24 test_chroot = "/usr/local/home/chromeos" 25 test_build_id = "lumpy-release/R36-5814.0.0" 26 27 downloader = download_images.ImageDownloader(logger_to_use=MOCK_LOGGER, 28 cmd_exec=mock_cmd_exec) 29 30 # Set os.path.exists to always return False and run downloader 31 mock_path_exists.return_value = False 32 downloader._DownloadImage(test_chroot, test_build_id) 33 34 # Verify os.path.exists was called twice, with proper arguments. 35 self.assertEqual(mock_path_exists.call_count, 2) 36 mock_path_exists.assert_called_with('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0/chromiumos_test_image.bin') 37 mock_path_exists.assert_any_call('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0') 38 39 # Verify we called os.mkdirs 40 self.assertEqual(mock_mkdirs.call_count, 1) 41 mock_mkdirs.assert_called_with('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0') 42 43 # Verify we called ChrootRunCommand once, with proper arguments. 44 self.assertEqual (mock_cmd_exec.ChrootRunCommand.call_count, 1) 45 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') 46 47 # Reset the velues in the mocks; set os.path.exists to always return True. 48 mock_path_exists.reset_mock() 49 mock_cmd_exec.reset_mock() 50 mock_path_exists.return_value = True 51 52 # Run downloader 53 downloader._DownloadImage(test_chroot, test_build_id) 54 55 # Verify os.path.exists was called twice, with proper arguments. 56 self.assertEqual(mock_path_exists.call_count, 2) 57 mock_path_exists.assert_called_with('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0/chromiumos_test_image.bin') 58 mock_path_exists.assert_any_call('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0') 59 60 # Verify we made no RunCommand or ChrootRunCommand calls (since 61 # os.path.exists returned True, there was no work do be done). 62 self.assertEqual (mock_cmd_exec.RunCommand.call_count, 0) 63 self.assertEqual (mock_cmd_exec.ChrootRunCommand.call_count, 0) 64 65 66 67 @mock.patch.object(os.path, 'exists') 68 def test_uncompress_image(self, mock_path_exists): 69 70 # set mock and test values. 71 mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter) 72 test_chroot = '/usr/local/home/chromeos' 73 test_build_id = 'lumpy-release/R36-5814.0.0' 74 75 downloader = download_images.ImageDownloader(logger_to_use=MOCK_LOGGER, 76 cmd_exec=mock_cmd_exec) 77 78 # Set os.path.exists to always return False and run uncompress. 79 mock_path_exists.return_value = False 80 downloader._UncompressImage(test_chroot, test_build_id) 81 82 # Verify os.path.exists was called once, with correct arguments. 83 self.assertEqual (mock_path_exists.call_count, 1) 84 mock_path_exists.assert_called_with('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0/chromiumos_test_image.bin') 85 86 # Verify ChrootRunCommand was called, with correct arguments. 87 self.assertEqual (mock_cmd_exec.ChrootRunCommand.call_count, 1) 88 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') 89 90 # Set os.path.exists to always return False and run uncompress. 91 mock_path_exists.reset_mock() 92 mock_cmd_exec.reset_mock() 93 mock_path_exists.return_value = True 94 downloader._UncompressImage(test_chroot, test_build_id) 95 96 # Verify os.path.exists was called once, with correct arguments. 97 self.assertEqual (mock_path_exists.call_count, 1) 98 mock_path_exists.assert_called_with('/usr/local/home/chromeos/chroot/tmp/lumpy-release/R36-5814.0.0/chromiumos_test_image.bin') 99 100 # Verify ChrootRunCommand was not called. 101 self.assertEqual (mock_cmd_exec.ChrootRunCommand.call_count, 0) 102 103 104 105 def test_run(self): 106 107 # Set test arguments 108 test_chroot = "/usr/local/home/chromeos" 109 test_build_id = "remote/lumpy/latest-dev" 110 111 # Set values to test/check. 112 self.called_download_image = False 113 self.called_uncompress_image = False 114 self.called_get_build_id = False 115 116 # Define fake stub functions for Run to call 117 def FakeGetBuildID(unused_root, unused_xbuddy_label): 118 self.called_get_build_id = True 119 return 'lumpy-release/R36-5814.0.0' 120 121 def GoodDownloadImage(root, build_id): 122 self.called_download_image = True 123 return "chromiumos_test_image.bin" 124 125 def BadDownloadImage(root, build_id): 126 self.called_download_image = True 127 return None 128 129 def FakeUncompressImage(root, build_id): 130 self.called_uncompress_image = True 131 return 0 132 133 # Initialize downloader 134 downloader = download_images.ImageDownloader(logger_to_use=MOCK_LOGGER) 135 136 # Set downloader to call fake stubs. 137 downloader._GetBuildID = FakeGetBuildID 138 downloader._UncompressImage = FakeUncompressImage 139 downloader._DownloadImage = GoodDownloadImage 140 141 # Call Run. 142 downloader.Run(test_chroot, test_build_id) 143 144 # Make sure it called both _DownloadImage and _UncompressImage 145 self.assertTrue (self.called_download_image) 146 self.assertTrue (self.called_uncompress_image) 147 148 # Reset values; Now use fake stub that simulates DownloadImage failing. 149 self.called_download_image = False 150 self.called_uncompress_image = False 151 downloader._DownloadImage = BadDownloadImage 152 153 # Call Run again. 154 downloader.Run (test_chroot, test_build_id) 155 156 # Verify that UncompressImage was not called, since _DownloadImage "failed" 157 self.assertTrue (self.called_download_image) 158 self.assertFalse (self.called_uncompress_image) 159 160 161if __name__ == '__main__': 162 unittest.main() 163