def test_download_succeeded_fails_checksum(self, download_failed): """ This test verifies that download_succeeded does the right thing if the checksum fails. Note that we are also implicitly testing that the default behavior is to validate downloads by not setting it in this test. There are two other tests that verify that setting the boolean explicitly is honored. """ destination = os.path.join(self.temp_dir, 'test.txt') with open(destination, 'w') as test_file: test_file.write('Boring test data.') unit = 'fake_unit' iso = {'name': 'test.txt', 'size': 114, 'destination': destination, 'checksum': 'wrong checksum', 'unit': unit, 'url': 'http://fake.com'} report = DownloadReport(iso['url'], destination) # Let's fake having downloaded the whole file iso['bytes_downloaded'] = iso['size'] report.bytes_downloaded = iso['size'] # We need to put this on the url_iso_map so that the iso can be retrieved for validation self.iso_sync_run._url_iso_map = {iso['url']: iso} self.iso_sync_run.progress_report.isos_state = STATE_RUNNING self.iso_sync_run.download_succeeded(report) # Because we fail validation, the save_unit step will not be called self.assertEqual(self.sync_conduit.save_unit.call_count, 0) # The download should be marked failed self.assertEqual(download_failed.call_count, 1) download_failed.assert_called_once_with(report)
def test_download_succeeded_honors_validate_downloads_set_false(self, download_failed): """ We have a setting that makes download validation optional. This test ensures that download_succeeded() honors that setting. """ # In this config, we will set validate_downloads to False, which should make our "wrong_checksum" OK config = importer_mocks.get_basic_config(feed_url='http://fake.com/iso_feed/', validate_downloads=False) iso_sync_run = ISOSyncRun(self.sync_conduit, config) destination = StringIO() destination.write('What happens when you combine a mosquito with a mountain climber? Nothing. You ' 'can\'t cross a vector with a scalar.') unit = 'fake_unit' iso = {'name': 'test.txt', 'size': 114, 'destination': destination, 'checksum': 'wrong checksum', 'unit': unit, 'url': 'http://fake.com'} report = DownloadReport(iso['url'], destination) # Let's fake having downloaded the whole file iso['bytes_downloaded'] = iso['size'] report.bytes_downloaded = iso['size'] # We need to put this on the url_iso_map so that the iso can be retrieved for validation iso_sync_run._url_iso_map = {iso['url']: iso} iso_sync_run.progress_report.isos_state = STATE_RUNNING iso_sync_run.download_succeeded(report) # The url_iso map should be empty now self.assertEqual(iso_sync_run._url_iso_map, {}) # The sync conduit should have been called to save the unit self.sync_conduit.save_unit.assert_any_call(unit) # The download should not fail self.assertEqual(download_failed.call_count, 0)
def test_download_succeeded_honors_validate_downloads_set_true(self, download_failed): """ We have a setting that makes download validation optional. This test ensures that download_succeeded() honors that setting. """ # In this config, we will set validate_downloads to False, which should make our "wrong_checksum" OK config = importer_mocks.get_basic_config(feed_url='http://fake.com/iso_feed/', validate_downloads=True) iso_sync_run = ISOSyncRun(self.sync_conduit, config) destination = os.path.join(self.temp_dir, 'test.txt') with open(destination, 'w') as test_file: test_file.write('Boring test data.') unit = 'fake_unit' iso = {'name': 'test.txt', 'size': 114, 'destination': destination, 'checksum': 'wrong checksum', 'unit': unit, 'url': 'http://fake.com'} report = DownloadReport(iso['url'], destination) # Let's fake having downloaded the whole file iso['bytes_downloaded'] = iso['size'] report.bytes_downloaded = iso['size'] # We need to put this on the url_iso_map so that the iso can be retrieved for validation iso_sync_run._url_iso_map = {iso['url']: iso} iso_sync_run.progress_report.isos_state = STATE_RUNNING iso_sync_run.download_succeeded(report) # Because we fail validation, the save_unit step will not be called self.assertEqual(self.sync_conduit.save_unit.call_count, 0) # The download should be marked failed self.assertEqual(download_failed.call_count, 1) download_failed.assert_called_once_with(report)
def test_download_succeeded(self, download_failed): destination = os.path.join(self.temp_dir, 'test.txt') with open(destination, 'w') as test_file: test_file.write( 'Descartes walks into a bar and sits down, the bartender walks up to him and says "You, my ' 'man, look like you need a stiff drink." Descartes considers this, and shakes his head "No, ' 'I don\'t think-" and ceases to exist.') unit = 'fake_unit' iso = {'name': 'test.txt', 'size': 217, 'destination': destination, 'checksum': 'a1552efee6f04012bc7e1f3e02c00c6177b08217cead958c47ec83cb8f97f835', 'unit': unit, 'url': 'http://fake.com'} report = DownloadReport(iso['url'], destination) # Simulate having downloaded the whole file iso['bytes_downloaded'] = iso['size'] report.bytes_downloaded = iso['size'] # We need to put this on the url_iso_map so that the iso can be retrieved for validation self.iso_sync_run._url_iso_map = {iso['url']: iso} self.iso_sync_run.progress_report.isos_state = STATE_RUNNING self.iso_sync_run.download_succeeded(report) # The url_iso map should be empty now self.assertEqual(self.iso_sync_run._url_iso_map, {}) # The sync conduit should have been called to save the unit self.sync_conduit.save_unit.assert_any_call(unit) # The download should not fail self.assertEqual(download_failed.call_count, 0)