track successful recover of corrupted payload in tests
authorPhilipp Gesang <philipp.gesang@intra2net.com>
Fri, 11 Aug 2017 09:16:33 +0000 (11:16 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 2 Apr 2018 11:34:09 +0000 (13:34 +0200)
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

index 9f584e0..8d7d5b9 100644 (file)
@@ -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