From e25f31ace5a4446a42fb7fa2599eb520de90666b Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Fri, 11 Aug 2017 15:45:50 +0200 Subject: [PATCH] give each recovery test a multivol companion This derives single- and multivolume versions of the tests. Multiple volumes are generated by stretching the input file count and size. --- runtests.py | 73 ++++++++++++++++++--------- testing/test_recover.py | 130 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 157 insertions(+), 46 deletions(-) diff --git a/runtests.py b/runtests.py index d8128b8..56046d2 100755 --- a/runtests.py +++ b/runtests.py @@ -23,18 +23,30 @@ from testing.test_crypto import HeaderTest, AESGCMTest from testing.test_multivol import MultivolGnuFormatTest, MultivolPaxFormatTest from testing.test_concat_compress import ConcatCompressTest from testing.test_recover import \ - RecoverCorruptPayloadTest \ - , RecoverCorruptPayloadGZTest \ - , RecoverCorruptPayloadGZAESTest \ - , RecoverCorruptHeaderTest \ - , RecoverCorruptHeaderGZTest \ - , RecoverCorruptHeaderGZAESTest \ - , RecoverCorruptEntireHeaderTest \ - , RecoverCorruptEntireHeaderGZTest \ - , RecoverCorruptEntireHeaderGZAESTest \ - , RecoverCorruptTrailingDataTest \ - , RecoverCorruptTrailingDataGZTest \ - , RecoverCorruptTrailingDataGZAESTest + RecoverCorruptPayloadSingleTest \ + , RecoverCorruptPayloadMultiTest \ + , RecoverCorruptPayloadGZSingleTest \ + , RecoverCorruptPayloadGZMultiTest \ + , RecoverCorruptPayloadGZAESSingleTest \ + , RecoverCorruptPayloadGZAESMultiTest \ + , RecoverCorruptHeaderSingleTest \ + , RecoverCorruptHeaderMultiTest \ + , RecoverCorruptHeaderGZSingleTest \ + , RecoverCorruptHeaderGZMultiTest \ + , RecoverCorruptHeaderGZAESSingleTest \ + , RecoverCorruptHeaderGZAESMultiTest \ + , RecoverCorruptEntireHeaderSingleTest \ + , RecoverCorruptEntireHeaderMultiTest \ + , RecoverCorruptEntireHeaderGZSingleTest \ + , RecoverCorruptEntireHeaderGZMultiTest \ + , RecoverCorruptEntireHeaderGZAESSingleTest \ + , RecoverCorruptEntireHeaderGZAESMultiTest \ + , RecoverCorruptTrailingDataSingleTest \ + , RecoverCorruptTrailingDataMultiTest \ + , RecoverCorruptTrailingDataGZSingleTest \ + , RecoverCorruptTrailingDataGZMultiTest \ + , RecoverCorruptTrailingDataGZAESSingleTest \ + , RecoverCorruptTrailingDataGZAESMultiTest from testing.test_rescue_tar import RescueTarTest from testing.test_encryption import EncryptionTest from testing.test_deltatar import (DeltaTarTest, DeltaTar2Test, @@ -69,18 +81,31 @@ if __name__ == "__main__": , DeltaTarAes128ConcatTest , HeaderTest, AESGCMTest # testing.test_recover - , RecoverCorruptPayloadTest - , RecoverCorruptPayloadGZTest - , RecoverCorruptPayloadGZAESTest - , RecoverCorruptHeaderTest - , RecoverCorruptHeaderGZTest - , RecoverCorruptHeaderGZAESTest - , RecoverCorruptEntireHeaderTest - , RecoverCorruptEntireHeaderGZTest - , RecoverCorruptEntireHeaderGZAESTest - , RecoverCorruptTrailingDataTest - , RecoverCorruptTrailingDataGZTest - , RecoverCorruptTrailingDataGZAESTest + + , RecoverCorruptPayloadSingleTest + , RecoverCorruptPayloadMultiTest + , RecoverCorruptPayloadGZSingleTest + , RecoverCorruptPayloadGZMultiTest + , RecoverCorruptPayloadGZAESSingleTest + , RecoverCorruptPayloadGZAESMultiTest + , RecoverCorruptHeaderSingleTest + , RecoverCorruptHeaderMultiTest + , RecoverCorruptHeaderGZSingleTest + , RecoverCorruptHeaderGZMultiTest + , RecoverCorruptHeaderGZAESSingleTest + , RecoverCorruptHeaderGZAESMultiTest + , RecoverCorruptEntireHeaderSingleTest + , RecoverCorruptEntireHeaderMultiTest + , RecoverCorruptEntireHeaderGZSingleTest + , RecoverCorruptEntireHeaderGZMultiTest + , RecoverCorruptEntireHeaderGZAESSingleTest + , RecoverCorruptEntireHeaderGZAESMultiTest + , RecoverCorruptTrailingDataSingleTest + , RecoverCorruptTrailingDataMultiTest + , RecoverCorruptTrailingDataGZSingleTest + , RecoverCorruptTrailingDataGZMultiTest + , RecoverCorruptTrailingDataGZAESSingleTest + , RecoverCorruptTrailingDataGZAESMultiTest ]: try: t = group (n) diff --git a/testing/test_recover.py b/testing/test_recover.py index e062980..edee250 100644 --- a/testing/test_recover.py +++ b/testing/test_recover.py @@ -8,7 +8,9 @@ import deltatar.tarfile as tarfile from . import BaseTest -TEST_PASSWORD = "test1234" +TEST_PASSWORD = "test1234" +TEST_VOLSIZ = 3 # MB +TEST_FILESPERVOL = 3 ############################################################################### ## helpers ## @@ -142,6 +144,7 @@ class RecoverTest (BaseTest): FAILURES = 0 # files that could not be restored MISMATCHES = 0 # files that were restored but corrupted CORRUPT = corrupt_payload_start + VOLUMES = 1 def setUp(self): @@ -179,8 +182,8 @@ class RecoverTest (BaseTest): """ mode = self.COMPRESSION or "#" bak_path = "backup_dir" - backup_file = "the_full_backup.tar" - backup_full = "%s/%s" % (bak_path, backup_file) + backup_file = "the_full_backup_%0.2d.tar" + backup_full = ("%s/%s" % (bak_path, backup_file)) % 0 index_file = "the_full_index" if self.COMPRESSION is not None: @@ -189,12 +192,23 @@ class RecoverTest (BaseTest): index_file += ".gz" if self.PASSWORD is not None: - backup_file += deltatar.PDTCRYPT_EXTENSION - backup_full += deltatar.PDTCRYPT_EXTENSION - index_file += deltatar.PDTCRYPT_EXTENSION - - def vname (*a, **kwa): - return backup_file + backup_file = "%s.%s" % (backup_file, deltatar.PDTCRYPT_EXTENSION) + backup_full = "%s.%s" % (backup_full, deltatar.PDTCRYPT_EXTENSION) + index_file = "%s.%s" % (index_file , deltatar.PDTCRYPT_EXTENSION) + + if self.VOLUMES > 1: + # add n files for one nth the volume size each + fsiz = int (TEST_VOLSIZ / TEST_FILESPERVOL * 1024 * 1024) + fcnt = self.VOLUMES * TEST_FILESPERVOL + for i in range (fcnt): + nvol, invol = divmod(i, TEST_FILESPERVOL) + f = "dummy_vol_%d_n_%0.2d" % (nvol, invol) + self.hash [f] = self.create_file ("%s/%s" + % (self.src_path, f), + fsiz) + + def vname (_x, _y, n, *a, **kwa): + return backup_file % n dtar = deltatar.DeltaTar (mode=mode, logger=None, @@ -203,7 +217,8 @@ class RecoverTest (BaseTest): volume_name_func=vname) dtar.create_full_backup \ - (source_path=self.src_path, backup_path=bak_path) + (source_path=self.src_path, backup_path=bak_path, + max_volume_size=1) if self.PASSWORD is not None: # ensure all files are at least superficially in PDT format @@ -267,76 +282,130 @@ class RecoverTest (BaseTest): shutil.rmtree (self.dst_path) -class RecoverCorruptPayloadTest (RecoverTest): +class RecoverCorruptPayloadTestBase (RecoverTest): COMPRESSION = None PASSWORD = None FAILURES = 0 # tarfile will restore but corrupted, as MISMATCHES = 1 # revealed by the hash +class RecoverCorruptPayloadSingleTest (RecoverCorruptPayloadTestBase): + VOLUMES = 1 + +class RecoverCorruptPayloadMultiTest (RecoverCorruptPayloadTestBase): + VOLUMES = 3 + -class RecoverCorruptPayloadGZTest (RecoverTest): +class RecoverCorruptPayloadGZTestBase (RecoverTest): COMPRESSION = "#gz" PASSWORD = None FAILURES = 1 MISMATCHES = 0 +class RecoverCorruptPayloadGZSingleTest (RecoverCorruptPayloadGZTestBase): + VOLUMES = 1 -class RecoverCorruptPayloadGZAESTest (RecoverTest): +class RecoverCorruptPayloadGZMultiTest (RecoverCorruptPayloadGZTestBase): + VOLUMES = 3 + + +class RecoverCorruptPayloadGZAESTestBase (RecoverTest): COMPRESSION = "#gz" PASSWORD = TEST_PASSWORD FAILURES = 1 MISMATCHES = 0 +class RecoverCorruptPayloadGZAESSingleTest (RecoverCorruptPayloadGZAESTestBase): + VOLUMES = 1 + +class RecoverCorruptPayloadGZAESMultiTest (RecoverCorruptPayloadGZAESTestBase): + VOLUMES = 3 -class RecoverCorruptHeaderTest (RecoverTest): + +class RecoverCorruptHeaderTestBase (RecoverTest): COMPRESSION = None PASSWORD = None FAILURES = 1 CORRUPT = corrupt_header MISMATCHES = 0 +class RecoverCorruptHeaderSingleTest (RecoverCorruptHeaderTestBase): + VOLUMES = 1 + +class RecoverCorruptHeaderMultiTest (RecoverCorruptHeaderTestBase): + VOLUMES = 3 + -class RecoverCorruptHeaderGZTest (RecoverTest): +class RecoverCorruptHeaderGZTestBase (RecoverTest): COMPRESSION = "#gz" PASSWORD = None FAILURES = 1 CORRUPT = corrupt_header MISMATCHES = 0 +class RecoverCorruptHeaderGZSingleTest (RecoverCorruptHeaderGZTestBase): + VOLUMES = 1 -class RecoverCorruptHeaderGZAESTest (RecoverTest): +class RecoverCorruptHeaderGZMultiTest (RecoverCorruptHeaderGZTestBase): + VOLUMES = 3 + + +class RecoverCorruptHeaderGZAESTestBase (RecoverTest): COMPRESSION = "#gz" PASSWORD = TEST_PASSWORD FAILURES = 1 CORRUPT = corrupt_header MISMATCHES = 0 +class RecoverCorruptHeaderGZAESSingleTest (RecoverCorruptHeaderGZAESTestBase): + VOLUMES = 1 + +class RecoverCorruptHeaderGZAESMultiTest (RecoverCorruptHeaderGZAESTestBase): + VOLUMES = 3 -class RecoverCorruptEntireHeaderTest (RecoverTest): + +class RecoverCorruptEntireHeaderTestBase (RecoverTest): COMPRESSION = None PASSWORD = None FAILURES = 1 CORRUPT = corrupt_entire_header MISMATCHES = 0 +class RecoverCorruptEntireHeaderSingleTest (RecoverCorruptEntireHeaderTestBase): + VOLUMES = 1 + +class RecoverCorruptEntireHeaderMultiTest (RecoverCorruptEntireHeaderTestBase): + VOLUMES = 3 + -class RecoverCorruptEntireHeaderGZTest (RecoverTest): +class RecoverCorruptEntireHeaderGZTestBase (RecoverTest): COMPRESSION = "#gz" PASSWORD = None FAILURES = 1 CORRUPT = corrupt_entire_header MISMATCHES = 0 +class RecoverCorruptEntireHeaderGZSingleTest (RecoverCorruptEntireHeaderGZTestBase): + VOLUMES = 1 -class RecoverCorruptEntireHeaderGZAESTest (RecoverTest): +class RecoverCorruptEntireHeaderGZMultiTest (RecoverCorruptEntireHeaderGZTestBase): + VOLUMES = 3 + + +class RecoverCorruptEntireHeaderGZAESTestBase (RecoverTest): COMPRESSION = "#gz" PASSWORD = TEST_PASSWORD FAILURES = 1 CORRUPT = corrupt_entire_header MISMATCHES = 0 +class RecoverCorruptEntireHeaderGZAESSingleTest (RecoverCorruptEntireHeaderGZAESTestBase): + VOLUMES = 1 + +class RecoverCorruptEntireHeaderGZAESMultiTest (RecoverCorruptEntireHeaderGZAESTestBase): + VOLUMES = 3 -class RecoverCorruptTrailingDataTest (RecoverTest): + +class RecoverCorruptTrailingDataTestBase (RecoverTest): # plain Tar is indifferent against traling data and the results # are consistent COMPRESSION = None @@ -345,8 +414,14 @@ class RecoverCorruptTrailingDataTest (RecoverTest): CORRUPT = corrupt_trailing_data MISMATCHES = 0 +class RecoverCorruptTrailingDataSingleTest (RecoverCorruptTrailingDataTestBase): + VOLUMES = 1 + +class RecoverCorruptTrailingDataMultiTest (RecoverCorruptTrailingDataTestBase): + VOLUMES = 3 + -class RecoverCorruptTrailingDataGZTest (RecoverTest): +class RecoverCorruptTrailingDataGZTestBase (RecoverTest): # reading past the final object will cause decompression failure; # all objects except for the last survive unharmed though COMPRESSION = "#gz" @@ -355,12 +430,23 @@ class RecoverCorruptTrailingDataGZTest (RecoverTest): CORRUPT = corrupt_trailing_data MISMATCHES = 0 +class RecoverCorruptTrailingDataGZSingleTest (RecoverCorruptTrailingDataGZTestBase): + VOLUMES = 1 -class RecoverCorruptTrailingDataGZAESTest (RecoverTest): +class RecoverCorruptTrailingDataGZMultiTest (RecoverCorruptTrailingDataGZTestBase): + VOLUMES = 3 + + +class RecoverCorruptTrailingDataGZAESTestBase (RecoverTest): COMPRESSION = "#gz" PASSWORD = TEST_PASSWORD FAILURES = 0 CORRUPT = corrupt_trailing_data MISMATCHES = 0 +class RecoverCorruptTrailingDataGZAESSingleTest (RecoverCorruptTrailingDataGZAESTestBase): + VOLUMES = 1 + +class RecoverCorruptTrailingDataGZAESMultiTest (RecoverCorruptTrailingDataGZAESTestBase): + VOLUMES = 3 -- 1.7.1