blocks = [ x[1] for x in nums_and_blocks ]
nums = [ x[0] for x in nums_and_blocks ]
decer = zfec.easyfec.Decoder(k, m)
-
+
decodeds = decer.decode(blocks, nums, padlen=k*len(blocks[0]) - len(s))
assert len(decodeds) == len(s), (ab(decodeds), ab(s), k, m)
assert decodeds == s, (ab(decodeds), ab(s),)
k = random.randrange(1, m+1)
s = randstr(l)
_h_easy(k, m, s)
-
+
class ZFecTest(unittest.TestCase):
+ def test_instantiate_no_args(self):
+ try:
+ e = zfec.Encoder()
+ except TypeError:
+ # Okay, so that's because we're required to pass constructor args.
+ pass
+ else:
+ # Oops, it should have raised an exception.
+ self.fail("Should have raised exception from incorrect arguments to constructor.")
+
def test_from_agl_c(self):
self.failUnless(zfec._fec.test_from_agl())
def test_from_agl_py(self):
e = zfec.Encoder(3, 5)
- b1 = '\x01'*8 ; b2 = '\x02'*8 ; b3 = '\x03'*8
- b4, b5 = e.encode([b1, b2, b3], (3, 4))
+ b0 = '\x01'*8 ; b1 = '\x02'*8 ; b2 = '\x03'*8
+ # print "_from_py before encoding:"
+ # print "b0: %s, b1: %s, b2: %s" % tuple(base64.b16encode(x) for x in [b0, b1, b2])
+
+ b3, b4 = e.encode([b0, b1, b2], (3, 4))
+ # print "after encoding:"
+ # print "b3: %s, b4: %s" % tuple(base64.b16encode(x) for x in [b3, b4])
+
d = zfec.Decoder(3, 5)
- resblocks = d.decode((b3, b4, b5), (2, 3, 4))
-
- print "b1: %r, b2: %r, b3: %r, b4: %r, b5: %r, resblocks: %r" % (b1, b2, b3, b4, b5, resblocks)
+ r0, r1, r2 = d.decode((b2, b3, b4), (1, 2, 3))
+
+ # print "after decoding:"
+ # print "b0: %s, b1: %s" % tuple(base64.b16encode(x) for x in [b0, b1])
def test_small(self):
for i in range(16):
if VERBOSE:
print "%d randomized tests pass." % (i+1)
+ def test_bad_args_construct_decoder(self):
+ try:
+ zfec.Decoder(-1, -1)
+ except zfec.Error, e:
+ assert "argument is required to be greater than or equal to 1" in str(e), e
+ else:
+ self.fail("Should have gotten an exception from out-of-range arguments.")
+
+ try:
+ zfec.Decoder(1, 257)
+ except zfec.Error, e:
+ assert "argument is required to be less than or equal to 256" in str(e), e
+ else:
+ self.fail("Should have gotten an exception from out-of-range arguments.")
+
+ try:
+ zfec.Decoder(3, 2)
+ except zfec.Error, e:
+ assert "first argument is required to be less than or equal to the second argument" in str(e), e
+ else:
+ self.fail("Should have gotten an exception from out-of-range arguments.")
+
+ def test_bad_args_construct_encoder(self):
+ try:
+ zfec.Encoder(-1, -1)
+ except zfec.Error, e:
+ assert "argument is required to be greater than or equal to 1" in str(e), e
+ else:
+ self.fail("Should have gotten an exception from out-of-range arguments.")
+
+ try:
+ zfec.Encoder(1, 257)
+ except zfec.Error, e:
+ assert "argument is required to be less than or equal to 256" in str(e), e
+ else:
+ self.fail("Should have gotten an exception from out-of-range arguments.")
+
def test_bad_args_dec(self):
decer = zfec.Decoder(2, 4)
except TypeError, e:
assert "First argument was not a sequence" in str(e), e
else:
- raise "Should have gotten TypeError for wrong type of second argument."
+ self.fail("Should have gotten TypeError for wrong type of second argument.")
try:
decer.decode(["a", "b", ], ["c", "d",])
except zfec.Error, e:
assert "Precondition violation: second argument is required to contain int" in str(e), e
else:
- raise "Should have gotten zfec.Error for wrong type of second argument."
+ self.fail("Should have gotten zfec.Error for wrong type of second argument.")
try:
decer.decode(["a", "b", ], 98) # not a sequence at all
except TypeError, e:
assert "Second argument was not a sequence" in str(e), e
else:
- raise "Should have gotten TypeError for wrong type of second argument."
+ self.fail("Should have gotten TypeError for wrong type of second argument.")
class EasyFecTest(unittest.TestCase):
def test_small(self):
except TypeError, e:
assert "First argument was not a sequence" in str(e), e
else:
- raise "Should have gotten TypeError for wrong type of second argument."
+ self.fail("Should have gotten TypeError for wrong type of second argument.")
try:
decer.decode("ab", ["c", "d",], 0)
except zfec.Error, e:
assert "Precondition violation: second argument is required to contain int" in str(e), e
else:
- raise "Should have gotten zfec.Error for wrong type of second argument."
+ self.fail("Should have gotten zfec.Error for wrong type of second argument.")
try:
decer.decode("ab", 98, 0) # not a sequence at all
except TypeError, e:
assert "Second argument was not a sequence" in str(e), e
else:
- raise "Should have gotten TypeError for wrong type of second argument."
+ self.fail("Should have gotten TypeError for wrong type of second argument.")
class FileFec(unittest.TestCase):
def test_filefec_header(self):
def test_filefec_min_shares_with_crcrlflf(self, noisy=VERBOSE):
return self._help_test_filefec("Yellow Whirled!A\r\r\n\n", 3, 8, numshs=3)
-
+
class Cmdline(unittest.TestCase):
def test_basic(self, noisy=VERBOSE):
tempdir = fileutil.NamedTemporaryDirectory(cleanup=True)
DEFAULT_M=8
DEFAULT_K=3
sys.argv = ["zfec", os.path.join(tempdir.name, "test.data"),]
-
+
retcode = zfec.cmdline_zfec.main()
assert retcode == 0, retcode
sys.argv = ["zunfec",]
sys.argv.extend(sharefns)
sys.argv.extend(['-o', os.path.join(tempdir.name, 'test.data-recovered'),])
-
+
retcode = zfec.cmdline_zunfec.main()
assert retcode == 0, retcode
import filecmp
if __name__ == "__main__":
unittest.main()
-
-# zfec -- fast forward error correction library with Python interface
-#
-# Copyright (C) 2007 Allmydata, Inc.
-# Author: Zooko Wilcox-O'Hearn
-#
-# This file is part of zfec.
-#
-# See README.txt for licensing information.