From 9d89c237b56c138c78e21878dfaaf3e6891f0de5 Mon Sep 17 00:00:00 2001 From: Philipp Gesang Date: Fri, 11 Aug 2017 11:16:33 +0200 Subject: [PATCH] track successful recover of corrupted payload in tests Gzip does CRC32, GCM has a MAC, but ordinary Tar only checksums the header part, not the content. Thus recovery of a damaged object will appear to succeed provided the object header is intact. In order to detect the corruption, an external integrity check is necessary. --- testing/test_recover.py | 23 ++++++++++++++++++----- 1 files changed, 18 insertions(+), 5 deletions(-) diff --git a/testing/test_recover.py b/testing/test_recover.py index 9f584e0..8d7d5b9 100644 --- a/testing/test_recover.py +++ b/testing/test_recover.py @@ -130,7 +130,8 @@ class RecoverTest (BaseTest): COMPRESSION = None PASSWORD = None - FAILURES = 0 + FAILURES = 0 # files that could not be restored + MISMATCHES = 0 # files that were restored but corrupted CORRUPT = corrupt_payload_start @@ -242,14 +243,17 @@ class RecoverTest (BaseTest): assert len (failed) == self.FAILURES # with one file missing - missing = [] + missing = [] + mismatch = [] for key, value in self.hash.items (): kkey = "%s/%s" % (self.dst_path, key) if os.path.exists (kkey): - assert value == self.md5sum (kkey) + if value != self.md5sum (kkey): + mismatch.append (key) else: missing.append (key) - assert len (missing) == self.FAILURES + assert len (missing) == self.FAILURES + assert len (mismatch) == self.MISMATCHES shutil.rmtree (self.dst_path) @@ -257,19 +261,22 @@ class RecoverTest (BaseTest): class RecoverCorruptPayloadTest (RecoverTest): COMPRESSION = None PASSWORD = None - FAILURES = 0 + FAILURES = 0 # tarfile will restore but corrupted, as + MISMATCHES = 1 # revealed by the hash class RecoverCorruptPayloadGZTest (RecoverTest): COMPRESSION = "#gz" PASSWORD = None FAILURES = 1 + MISMATCHES = 0 class RecoverCorruptPayloadGZAESTest (RecoverTest): COMPRESSION = "#gz" PASSWORD = TEST_PASSWORD FAILURES = 1 + MISMATCHES = 0 class RecoverCorruptHeaderTest (RecoverTest): @@ -277,6 +284,7 @@ class RecoverCorruptHeaderTest (RecoverTest): PASSWORD = None FAILURES = 1 CORRUPT = corrupt_header + MISMATCHES = 0 class RecoverCorruptHeaderGZTest (RecoverTest): @@ -284,6 +292,7 @@ class RecoverCorruptHeaderGZTest (RecoverTest): PASSWORD = None FAILURES = 1 CORRUPT = corrupt_header + MISMATCHES = 0 class RecoverCorruptHeaderGZAESTest (RecoverTest): @@ -291,6 +300,7 @@ class RecoverCorruptHeaderGZAESTest (RecoverTest): PASSWORD = TEST_PASSWORD FAILURES = 1 CORRUPT = corrupt_header + MISMATCHES = 0 class RecoverCorruptEntireHeaderTest (RecoverTest): @@ -298,6 +308,7 @@ class RecoverCorruptEntireHeaderTest (RecoverTest): PASSWORD = None FAILURES = 1 CORRUPT = corrupt_entire_header + MISMATCHES = 0 class RecoverCorruptEntireHeaderGZTest (RecoverTest): @@ -305,6 +316,7 @@ class RecoverCorruptEntireHeaderGZTest (RecoverTest): PASSWORD = None FAILURES = 1 CORRUPT = corrupt_entire_header + MISMATCHES = 0 class RecoverCorruptEntireHeaderGZAESTest (RecoverTest): @@ -312,4 +324,5 @@ class RecoverCorruptEntireHeaderGZAESTest (RecoverTest): PASSWORD = TEST_PASSWORD FAILURES = 1 CORRUPT = corrupt_entire_header + MISMATCHES = 0 -- 1.7.1