deltatar: removing not bz2 concat stream test, adding crc checking and unit test...
authorEduardo Robles Elvira <edulix@wadobo.com>
Sat, 27 Jul 2013 08:47:05 +0000 (10:47 +0200)
committerEduardo Robles Elvira <edulix@wadobo.com>
Sat, 27 Jul 2013 08:47:10 +0000 (10:47 +0200)
deltatar/deltatar.py
testing/test_deltatar.py

index 297fe30..bd8ccab 100644 (file)
@@ -20,6 +20,7 @@
 
 import logging
 import datetime
+import binascii
 import os
 import stat
 import json
@@ -323,8 +324,11 @@ class DeltaTar(object):
         new_volume_handler = partial(new_volume_handler, self)
 
         index_fd.write('{"type": "python-delta-tar-index", version: "1" }\n')
-        index_fd.write('{"type": "BEGIN-FILE-LIST"}\n')
-        checksum = 'TODO' # TODO: checksum
+
+        s = '{"type": "BEGIN-FILE-LIST"}\n'
+        # calculate checksum and write into the stream
+        crc = binascii.crc32(s)
+        index_fd.write(s)
 
         # start creating the tarfile
         tarobj = tarfile.TarFile.open(tarfile_path,
@@ -342,13 +346,18 @@ class DeltaTar(object):
             stat = self._stat_dict(path)
             stat['volume'] = vol_no
             stat['offset'] = tarobj.fileobj.tell() # TODO: check/fix this
-            index_fd.write(json.dumps(stat) + '\n')
+
+            s = json.dumps(stat) + '\n'
+            crc = binascii.crc32(s, crc) & 0xffffffff
+            index_fd.write(s)
 
             tarobj.add(path)
 
-        index_fd.write('{"type": "END-FILE-LIST"}\n')
-        index_fd.write('{"type": "file-list-checksum", "checksum": "%s"}\n' %\
-                        checksum)
+        s = '{"type": "END-FILE-LIST"}\n'
+        crc = binascii.crc32(s, crc) & 0xffffffff
+        index_fd.write(s)
+        index_fd.write('{"type": "file-list-checksum", "checksum": %d}\n' %\
+                        crc)
         index_fd.close()
         os.chdir(cwd)
         tarobj.close()
index 577b0c1..d2d04e3 100644 (file)
@@ -81,6 +81,46 @@ class DeltaTarTest(BaseTest):
             if value:
                 assert value == self.md5sum(key)
 
+    def test_check_index_checksum(self):
+        '''
+        Creates a full backup and checks the index' checksum of files
+        '''
+        import binascii
+        import json
+        deltatar = DeltaTar(mode=self.MODE, password=self.PASSWORD,
+                            logger=self.consoleLogger)
+
+        # create first backup
+        deltatar.create_full_backup(
+            source_path="source_dir",
+            backup_path="backup_dir")
+
+
+        index_filename = deltatar.index_name_func(True)
+        index_path = os.path.join("backup_dir", index_filename)
+
+        f = open(index_path, 'r')
+        crc = None
+        checked = False
+        began_list = False
+        for l in f.readline():
+            if 'BEGIN-FILE-LIST' in l:
+                crc = binascii.crc32(l)
+                began_list = True
+            elif 'END-FILE-LIST' in l:
+                crc = binascii.crc32(l, crc) & 0xffffffff
+
+                # next line contains the crc
+                data = json.loads(f.readline())
+                assert data['type'] == 'file-list-checksum'
+                assert data['checksum'] == crc
+                checked = True
+                break
+            elif began_list:
+                crc = binascii.crc32(l, crc) & 0xffffffff
+
+
+
 
 class DeltaTar2Test(DeltaTarTest):
     '''
@@ -131,13 +171,6 @@ class DeltaTarGzipConcatTest(DeltaTarTest):
     MODE = '#gz'
 
 
-class DeltaTarBz2ConcatTest(DeltaTarTest):
-    '''
-    Same as DeltaTar but with specific bz2 concat stream mode
-    '''
-    MODE = '#bz2'
-
-
 class DeltaTarGzipAes128ConcatTest(DeltaTarTest):
     '''
     Same as DeltaTar but with specific gzip aes128 concat stream mode