created Unittest for test_volume_split
authorChristian Herdtweck <christian.herdtweck@intra2net.com>
Mon, 25 Jul 2016 11:08:31 +0000 (13:08 +0200)
committerChristian Herdtweck <christian.herdtweck@intra2net.com>
Thu, 12 Nov 2020 14:04:34 +0000 (15:04 +0100)
runtests.py
testing/test_volume_split.py

index fdbab7f..99e19b0 100755 (executable)
@@ -94,6 +94,7 @@ from testing.test_deltatar import (DeltaTarTest, DeltaTar2Test,
     )
 from testing.test_compression_level import suite
 from testing.test_volume_size_accuracy import VolumeSizeAccuracyTest
+from testing.test_volume_split import VolumeSplitTest
 
 if __name__ == "__main__":
     if len(sys.argv) == 1:
index aef1cb0..50e1c14 100755 (executable)
@@ -15,6 +15,9 @@ More precisely:
 - compare files
 - repeat whole procedure with differntly-sized big and small source files
 
+As with test_volume_size_accuracty, this file can be run as stand-alone test
+(repeats endlessly) or as unittest (runs only a fixed number of times)
+
 .. codeauthor:: Intra2net AG <info@intra2net>
 """
 
@@ -27,6 +30,7 @@ from hashlib import md5 as hash_type
 from tempfile import TemporaryDirectory, NamedTemporaryFile
 from time import time
 from traceback import format_exc
+from unittest import TestCase
 
 # try to import the tarfile from source, not the globally installed one
 source_base = dirname(dirname(abspath(__file__)))
@@ -59,6 +63,18 @@ SEED_BITS = int(log2(sys.maxsize+1))
 #: buffer size for reading file for hashing
 HASH_BUF_SIZE = 4096
 
+#: modes for tar file creation
+CREATE_MODES = 'w:tar', 'w|tar', 'w|gz', 'w|bz2', 'w#gz'
+               #'w#gz.aes128', 'w#gz.aes256', 'w#aes128', 'w#aes256'
+               # not currently working: 'w:gz', 'w:bz2',
+
+#: modes for tar file extraction: only the start, in get_extract_mode the
+#: corresponding suffix ({tar|gz|bz2}[.aesXXX] is added
+EXTRACT_MODE_STARTS = 'r:', 'r#', 'r:*'
+
+#: number of runs of each mode in unittest
+UNITTEST_REPETITIONS = 10
+
 
 def create_file(file_size, temp_dir):
     """ create random file of given size in given dir
@@ -298,6 +314,22 @@ def create_seed():
     return random.getrandbits(SEED_BITS)
 
 
+def get_extract_mode(create_mode, extract_start):
+    """ for a given mode for tar file creation complete extract mode from start
+
+    returns None if create mode is incompatible with start of extract mode
+    """
+
+    if ('#' in extract_start) and ('#' not in create_mode):
+        return None    # not possible
+    if ':' in extract_start and not create_mode.endswith('tar'):
+        return None    # not possible
+    full_extract_mode = extract_start
+    if extract_start[-1] != '*':
+        full_extract_mode += create_mode[2:]
+    return full_extract_mode
+
+
 def test_forever():
     """ Main function, called when running file as script
 
@@ -307,10 +339,6 @@ def test_forever():
     # more params
     fast_fail = True
     print_everything = False
-    create_modes = 'w:tar', 'w|tar', 'w|gz', 'w|bz2', 'w#gz'
-                   #'w#gz.aes128', 'w#gz.aes256', 'w#aes128', 'w#aes256'
-                   # not currently working: 'w:gz', 'w:bz2',
-    extract_mode_starts = 'r:', 'r#', 'r:*'
 
     # seed properly
     random.seed()
@@ -326,22 +354,19 @@ def test_forever():
         try:
             start_time = time()
             while not do_stop:
-                for create_mode in create_modes:
+                for create_mode in CREATE_MODES:
                     if do_stop:
                         break
-                    for extract_start in extract_mode_starts:
+                    for extract_start in EXTRACT_MODE_STARTS:
                         if do_stop:
                             break
 
                         # figure out extract mode for tar file
-                        if ('#' in extract_start) and ('#' not in create_mode):
-                            continue    # not possible
-                        if ':' in extract_start and \
-                                not create_mode.endswith('tar'):
-                            continue    # not possible
-                        full_extract_mode = extract_start
-                        if extract_start[-1] != '*':
-                            full_extract_mode += create_mode[2:]
+                        full_extract_mode = get_extract_mode(create_mode,
+                                                             extract_start)
+                        if full_extract_mode is None:
+                            continue   # incompatible modes
+
 
                         # create seed to re-create results
                         seed = create_seed()
@@ -389,5 +414,36 @@ def test_forever():
                 print(params)
 
 
+class VolumeSplitTest(TestCase):
+    """ runs all combinations of params from run_forever a few times """
+
+    def test_each(self):
+        # create temp dir
+        with TemporaryDirectory(prefix='deltatar_test_') as temp_dir:
+
+            # repeat given number of times
+            for _ in range(UNITTEST_REPETITIONS):
+
+                # loop over params
+                for create_mode in CREATE_MODES:
+                    for extract_start in EXTRACT_MODE_STARTS:
+
+                        # figure out extract mode for tar file
+                        full_extract_mode = get_extract_mode(create_mode,
+                                                             extract_start)
+                        if full_extract_mode is None:
+                            continue   # incompatible modes
+
+                        # create seed to re-create results
+                        seed = create_seed()
+
+                        # run test
+                        everything_ok = \
+                            do_test(seed, create_mode, full_extract_mode,
+                                    temp_dir)
+
+                        self.assertTrue(everything_ok)
+
+
 if __name__ == '__main__':
     test_forever()