add test corrupting an entire volume
authorPhilipp Gesang <philipp.gesang@intra2net.com>
Tue, 15 Aug 2017 13:38:17 +0000 (15:38 +0200)
committerThomas Jarosch <thomas.jarosch@intra2net.com>
Mon, 2 Apr 2018 11:34:09 +0000 (13:34 +0200)
Zero out the first volume: None of the content can be restored.
This includes the file extending from the first into the second
volume.

runtests.py
testing/test_recover.py

index 56046d2..eb81a83 100755 (executable)
@@ -46,7 +46,10 @@ from testing.test_recover import \
     , RecoverCorruptTrailingDataGZSingleTest \
     , RecoverCorruptTrailingDataGZMultiTest \
     , RecoverCorruptTrailingDataGZAESSingleTest \
-    , RecoverCorruptTrailingDataGZAESMultiTest
+    , RecoverCorruptTrailingDataGZAESMultiTest \
+    , RecoverCorruptVolumeTest \
+    , RecoverCorruptVolumeGZTest \
+    , RecoverCorruptVolumeGZAESTest
 from testing.test_rescue_tar import RescueTarTest
 from testing.test_encryption import EncryptionTest
 from testing.test_deltatar import (DeltaTarTest, DeltaTar2Test,
@@ -80,8 +83,8 @@ if __name__ == "__main__":
                          , DeltaTarGzipAes128ConcatTest
                          , DeltaTarAes128ConcatTest
                          , HeaderTest, AESGCMTest
-                         # testing.test_recover
 
+                         # testing.test_recover
                          , RecoverCorruptPayloadSingleTest
                          , RecoverCorruptPayloadMultiTest
                          , RecoverCorruptPayloadGZSingleTest
@@ -105,7 +108,9 @@ if __name__ == "__main__":
                          , RecoverCorruptTrailingDataGZSingleTest
                          , RecoverCorruptTrailingDataGZMultiTest
                          , RecoverCorruptTrailingDataGZAESSingleTest
-                         , RecoverCorruptTrailingDataGZAESMultiTest
+                         , RecoverCorruptVolumeTest
+                         , RecoverCorruptVolumeGZTest
+                         , RecoverCorruptVolumeGZAESTest
                          ]:
                 try:
                     t = group (n)
index e2a6292..e936e89 100644 (file)
@@ -13,6 +13,7 @@ TEST_VOLSIZ       = 2 # MB
 TEST_FILESPERVOL  = 3
 VOLUME_OVERHEAD   = 1.4 # account for tar overhead when fitting files into
                         # volumes; this is black magic
+TEST_BLOCKSIZE    = 4096
 
 ###############################################################################
 ## helpers                                                                   ##
@@ -132,6 +133,21 @@ def corrupt_trailing_data (_, fname, compress, encrypt):
     os.close (fd)
 
 
+def corrupt_volume (_, fname, compress, encrypt):
+    """
+    Zero out an entire volume.
+    """
+    fd = os.open (fname, os.O_WRONLY)
+    size = os.lseek (fd, 0, os.SEEK_END)
+    assert os.lseek (fd, 0, os.SEEK_SET) == 0
+    zeros = bytes (b'\x00' * TEST_BLOCKSIZE)
+    while size > 0:
+        todo = min (size, TEST_BLOCKSIZE)
+        os.write (fd, zeros [:todo])
+        size -= todo
+    os.close (fd)
+
+
 ###############################################################################
 ## tests                                                                     ##
 ###############################################################################
@@ -476,3 +492,28 @@ class RecoverCorruptTrailingDataGZAESSingleTest (RecoverCorruptTrailingDataGZAES
 class RecoverCorruptTrailingDataGZAESMultiTest (RecoverCorruptTrailingDataGZAESTestBase):
     VOLUMES     = 3
 
+
+class RecoverCorruptVolumeBaseTest (RecoverTest):
+    COMPRESSION = None
+    PASSWORD    = None
+    FAILURES    = 8
+    CORRUPT     = corrupt_volume
+    VOLUMES     = 3
+
+class RecoverCorruptVolumeTest (RecoverCorruptVolumeBaseTest):
+    pass
+
+class RecoverCorruptVolumeGZTest (RecoverTest):
+    COMPRESSION = "#gz"
+    PASSWORD    = None
+    FAILURES    = 8
+    CORRUPT     = corrupt_volume
+    VOLUMES     = 3
+
+class RecoverCorruptVolumeGZAESTest (RecoverTest):
+    COMPRESSION = "#gz"
+    PASSWORD    = TEST_PASSWORD
+    FAILURES    = 8
+    CORRUPT     = corrupt_volume
+    VOLUMES     = 3
+