created unittest for get_file_size
authorChristian Herdtweck <christian.herdtweck@intra2net.com>
Wed, 8 Jun 2016 15:48:23 +0000 (17:48 +0200)
committerChristian Herdtweck <christian.herdtweck@intra2net.com>
Wed, 15 Jun 2016 11:18:02 +0000 (13:18 +0200)
testing/test_multivol.py

index fac6d61..0026881 100644 (file)
@@ -168,6 +168,54 @@ class MultivolGnuFormatTest(BaseTest):
             assert os.path.exists(key)
             assert value == self.md5sum(key)
 
+    def test_get_file_size(self):
+        ''' test _Stream.get_file_size which is basis for multivol with compres
+        '''
+
+        # create test files of different sizes
+        size_factor = 4
+        n_sizes = 14    # 1,4,16,64...,1 MiB=2**20=4**10, 4MiB, 16MiB, 64MiB
+        next_size = 1
+        sizes = []
+        file_names = []
+        for exponents in range(n_sizes):
+            sizes.append(next_size)
+            new_name = 'size_test_{:08d}'.format(next_size)
+            file_names.append(new_name)
+            self.create_file(new_name, next_size)
+            next_size *= size_factor
+
+        max_err = 0
+        max_err_post = 0
+
+        for mode in 'w|gz', 'w|bz2', 'w|xz', 'w#gz', 'w#gz.aes128', \
+                'w#gz.aes256', 'w#aes128':
+            tar_file_name = "size_test.tar." + mode[2:]
+            for size_number in range(1,n_sizes):
+                for order in 1,-1:
+                    tarobj = TarFile.open(tar_file_name,
+                                          mode=mode,
+                                          format=self.tarfile_format,
+                                          password='test')
+                    for file_name in file_names[:size_number][::order]:
+                        tarobj.add(file_name)
+                    estimate = tarobj.fileobj.get_file_size()
+                    tarobj.close()
+                    estimate_post = tarobj.fileobj.get_file_size()
+                    actual_size = os.stat(tar_file_name).st_size
+                    err = abs(actual_size - estimate)
+                    print('mode {}, {} files: estim={}, true={}, post={}, err={}'
+                          .format(mode, size_number, estimate, actual_size,
+                                  estimate_post, err))
+                    os.unlink(tar_file_name)
+                    if err > max_err:
+                        max_err = err
+                    err = abs(actual_size - estimate_post)
+                    if err > max_err_post:
+                        max_err_post = err
+
+        print('max err is {}, post={}'.format(max_err, max_err_post))
+
     def test_volume_extract1(self):
         '''
         Create a tar file with multiple volumes and one file and extract it