give each recovery test a multivol companion
authorPhilipp Gesang <philipp.gesang@intra2net.com>
Fri, 11 Aug 2017 13:45:50 +0000 (15:45 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 2 Apr 2018 11:34:09 +0000 (13:34 +0200)
This derives single- and multivolume versions of the tests.
Multiple volumes are generated by stretching the input file count
and size.

runtests.py
testing/test_recover.py

index d8128b8..56046d2 100755 (executable)
@@ -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)
index e062980..edee250 100644 (file)
@@ -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