lay out skeleton for disaster recovery tests
authorPhilipp Gesang <philipp.gesang@intra2net.com>
Thu, 10 Aug 2017 07:37:08 +0000 (09:37 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 2 Apr 2018 11:34:09 +0000 (13:34 +0200)
New series of tests for corrupting backup sets and restoring them
incompletely (“tolerant” or “disaster recovery” mode).

runtests.py
testing/test_recover.py [new file with mode: 0644]

index 2ebfe11..3ea1e6e 100755 (executable)
@@ -22,6 +22,7 @@ import unittest
 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 RecoverTest
 from testing.test_rescue_tar import RescueTarTest
 from testing.test_encryption import EncryptionTest
 from testing.test_deltatar import (DeltaTarTest, DeltaTar2Test,
@@ -55,6 +56,7 @@ if __name__ == "__main__":
                          , DeltaTarGzipAes128ConcatTest
                          , DeltaTarAes128ConcatTest
                          , HeaderTest, AESGCMTest
+                         , RecoverTest
                          ]:
                 try:
                     t = group (n)
diff --git a/testing/test_recover.py b/testing/test_recover.py
new file mode 100644 (file)
index 0000000..206f02b
--- /dev/null
@@ -0,0 +1,62 @@
+import logging
+import os
+import shutil
+
+import deltatar.deltatar as deltatar
+
+from . import BaseTest
+
+class RecoverTest (BaseTest):
+    """
+    Disaster recovery: restore corrupt backups.
+    """
+
+    GIT_DIR = '.git'
+
+    def setUp(self):
+        '''
+        Create base test data
+        '''
+        self.pwd = os.getcwd()
+        os.system('rm -rf target_dir source_dir* backup_dir* huge')
+        os.makedirs('source_dir/test/test2')
+        self.hash = dict()
+        self.hash["source_dir/test/test2"] = ''
+        self.hash["source_dir/big"]  = self.create_file("source_dir/big", 50000)
+        self.hash["source_dir/small"]  = self.create_file("source_dir/small", 100)
+        self.hash["source_dir/test/huge"]  = self.create_file("source_dir/test/huge", 700000)
+        self.hash["source_dir/test/huge2"]  = self.create_file("source_dir/test/huge2", 800000)
+
+        self.consoleLogger = logging.StreamHandler()
+        self.consoleLogger.setLevel(logging.DEBUG)
+
+        if not os.path.isdir(self.GIT_DIR):
+            # Not running inside git tree, take our
+            # own testing directory as source.
+            self.GIT_DIR = 'testing'
+            if not os.path.isdir(self.GIT_DIR):
+                raise Exception('No input directory found: ' + self.GIT_DIR)
+
+
+    def test_recover_corrupt_byte (self):
+        """
+        Flip a bit in a non-header byte of a backup set, then recover.
+
+        Expects the extraction to fail in normal mode. With disaster recovery,
+        extraction must succeed, and exactly one file must be missing.
+        """
+        src_path = "source_dir2"
+
+        dtar = deltatar.DeltaTar (mode="#gz",
+                                  logger=self.consoleLogger)
+
+        self.hash = dict ()
+        os.makedirs (src_path)
+        for i in range (5):
+            f = "source_dir2/dummy_%rd" % i
+            self.hash [f] = self.create_file (f, i)
+
+        dtar.create_full_backup \
+            (source_path="source_dir2", backup_path="backup_dir")
+        shutil.rmtree (src_path)
+