From fbdc9f4a07128efdc3ac4c3bf9d7a552ae7264e4 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Thu, 10 Aug 2017 09:37:08 +0200 Subject: [PATCH] lay out skeleton for disaster recovery tests MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit New series of tests for corrupting backup sets and restoring them incompletely (“tolerant” or “disaster recovery” mode). --- runtests.py | 2 + testing/test_recover.py | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 0 deletions(-) create mode 100644 testing/test_recover.py diff --git a/runtests.py b/runtests.py index 2ebfe11..3ea1e6e 100755 --- a/runtests.py +++ b/runtests.py @@ -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 index 0000000..206f02b --- /dev/null +++ b/testing/test_recover.py @@ -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) + -- 1.7.1