forked from third-party-mirrors/zfs_autobackup
157 lines
6.0 KiB
Python
157 lines
6.0 KiB
Python
from basetest import *
|
|
from zfs_autobackup.BlockHasher import BlockHasher
|
|
|
|
|
|
# make VERY sure this works correctly under all circumstances.
|
|
|
|
# sha1 sums of files, (bs=4096)
|
|
# da39a3ee5e6b4b0d3255bfef95601890afd80709 empty
|
|
# 642027d63bb0afd7e0ba197f2c66ad03e3d70de1 partial
|
|
# 3c0bf91170d873b8e327d3bafb6bc074580d11b7 whole
|
|
# 2e863f1fcccd6642e4e28453eba10d2d3f74d798 whole2
|
|
# 959e6b58078f0cfd2fb3d37e978fda51820473ff whole_whole2
|
|
# 309ffffba2e1977d12f3b7469971f30d28b94bd8 whole_whole2_partial
|
|
|
|
class TestBlockHasher(unittest2.TestCase):
|
|
|
|
def setUp(self):
|
|
pass
|
|
|
|
def test_empty(self):
|
|
block_hasher = BlockHasher(count=1)
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/empty")),
|
|
[]
|
|
)
|
|
|
|
def test_partial(self):
|
|
block_hasher = BlockHasher(count=1)
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/partial")),
|
|
[(0, "642027d63bb0afd7e0ba197f2c66ad03e3d70de1")]
|
|
)
|
|
|
|
def test_whole(self):
|
|
block_hasher = BlockHasher(count=1)
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/whole")),
|
|
[(0, "3c0bf91170d873b8e327d3bafb6bc074580d11b7")]
|
|
)
|
|
|
|
def test_whole2(self):
|
|
block_hasher = BlockHasher(count=1)
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/whole_whole2")),
|
|
[
|
|
(0, "3c0bf91170d873b8e327d3bafb6bc074580d11b7"),
|
|
(1, "2e863f1fcccd6642e4e28453eba10d2d3f74d798")
|
|
]
|
|
)
|
|
|
|
def test_wwp(self):
|
|
block_hasher = BlockHasher(count=1)
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/whole_whole2_partial")),
|
|
[
|
|
(0, "3c0bf91170d873b8e327d3bafb6bc074580d11b7"), # whole
|
|
(1, "2e863f1fcccd6642e4e28453eba10d2d3f74d798"), # whole2
|
|
(2, "642027d63bb0afd7e0ba197f2c66ad03e3d70de1") # partial
|
|
]
|
|
)
|
|
|
|
def test_wwp_count2(self):
|
|
block_hasher = BlockHasher(count=2)
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/whole_whole2_partial")),
|
|
[
|
|
(0, "959e6b58078f0cfd2fb3d37e978fda51820473ff"), # whole_whole2
|
|
(1, "642027d63bb0afd7e0ba197f2c66ad03e3d70de1") # partial
|
|
]
|
|
)
|
|
|
|
def test_big(self):
|
|
block_hasher = BlockHasher(count=10)
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/whole_whole2_partial")),
|
|
[
|
|
(0, "309ffffba2e1977d12f3b7469971f30d28b94bd8"), # whole_whole2_partial
|
|
])
|
|
|
|
def test_blockhash_compare(self):
|
|
#no errors
|
|
block_hasher = BlockHasher(count=1)
|
|
generator = block_hasher.generate("tests/data/whole_whole2_partial")
|
|
self.assertEqual([], list(block_hasher.compare("tests/data/whole_whole2_partial", generator)))
|
|
|
|
#compare file is smaller (EOF errors)
|
|
block_hasher = BlockHasher(count=1)
|
|
generator = block_hasher.generate("tests/data/whole_whole2_partial")
|
|
self.assertEqual(
|
|
[(1, '2e863f1fcccd6642e4e28453eba10d2d3f74d798', 'EOF'),
|
|
(2, '642027d63bb0afd7e0ba197f2c66ad03e3d70de1', 'EOF')],
|
|
list(block_hasher.compare("tests/data/whole", generator)))
|
|
|
|
#no errors, huge chunks
|
|
block_hasher = BlockHasher(count=10)
|
|
generator = block_hasher.generate("tests/data/whole_whole2_partial")
|
|
self.assertEqual([], list(block_hasher.compare("tests/data/whole_whole2_partial", generator)))
|
|
|
|
# different order to make sure seek functions are ok
|
|
block_hasher = BlockHasher(count=1)
|
|
checksums = list(block_hasher.generate("tests/data/whole_whole2_partial"))
|
|
checksums.reverse()
|
|
self.assertEqual([], list(block_hasher.compare("tests/data/whole_whole2_partial", checksums)))
|
|
|
|
def test_skip1(self):
|
|
block_hasher = BlockHasher(count=1, skip=1)
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/whole_whole2_partial")),
|
|
[
|
|
(0, "3c0bf91170d873b8e327d3bafb6bc074580d11b7"), # whole
|
|
# (1, "2e863f1fcccd6642e4e28453eba10d2d3f74d798"), # whole2
|
|
(2, "642027d63bb0afd7e0ba197f2c66ad03e3d70de1") # partial
|
|
]
|
|
)
|
|
|
|
#should continue the pattern on the next file:
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/whole_whole2_partial")),
|
|
[
|
|
# (0, "3c0bf91170d873b8e327d3bafb6bc074580d11b7"), # whole
|
|
(1, "2e863f1fcccd6642e4e28453eba10d2d3f74d798"), # whole2
|
|
# (2, "642027d63bb0afd7e0ba197f2c66ad03e3d70de1") # partial
|
|
]
|
|
)
|
|
|
|
def test_skip6(self):
|
|
block_hasher = BlockHasher(count=1, skip=6)
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/whole_whole2_partial")),
|
|
[
|
|
(0, "3c0bf91170d873b8e327d3bafb6bc074580d11b7"), # whole
|
|
# (1, "2e863f1fcccd6642e4e28453eba10d2d3f74d798"), # whole2
|
|
# (2, "642027d63bb0afd7e0ba197f2c66ad03e3d70de1") # partial
|
|
]
|
|
)
|
|
|
|
#all blocks of next file are skipped
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/whole_whole2_partial")),
|
|
[
|
|
# (0, "3c0bf91170d873b8e327d3bafb6bc074580d11b7"), # whole
|
|
# (1, "2e863f1fcccd6642e4e28453eba10d2d3f74d798"), # whole2
|
|
# (2, "642027d63bb0afd7e0ba197f2c66ad03e3d70de1") # partial
|
|
]
|
|
)
|
|
|
|
#first block of this one is the 6th to be skipped:
|
|
self.assertEqual(
|
|
list(block_hasher.generate("tests/data/whole_whole2_partial")),
|
|
[
|
|
# (0, "3c0bf91170d873b8e327d3bafb6bc074580d11b7"), # whole
|
|
(1, "2e863f1fcccd6642e4e28453eba10d2d3f74d798"), # whole2
|
|
# (2, "642027d63bb0afd7e0ba197f2c66ad03e3d70de1") # partial
|
|
]
|
|
)
|
|
|
|
#NOTE: compare doesnt use skip. thats the job of its input generator |