diff --git a/ecc.py b/ecc.py index 92945bd..c29da0f 100644 --- a/ecc.py +++ b/ecc.py @@ -31,7 +31,9 @@ def decode(data, nsym=DEFAULT_NSYM): chunk = data[i:i+BLOCK_SIZE] try: dec.extend(rs_correct_msg(chunk, nsym)) - except ReedSolomonError: + log.info('Decoded %d blocks = %d bytes', (i+1) / BLOCK_SIZE, len(dec)) + except ReedSolomonError as e: + log.info('Decoding stopped: %s', e) break if i == 0: @@ -44,17 +46,9 @@ def decode(data, nsym=DEFAULT_NSYM): n = struct.calcsize(LEN_FMT) payload, length = dec[n:], dec[:n] length, = struct.unpack(LEN_FMT, length) - assert length <= len(payload) + if length > len(payload): + log.warning('%d bytes are missing!', length - len(payload)) + return None + log.info('Decoded {} bytes'.format(length)) return payload[:length] - - -def test_codec(): - import random - r = random.Random(0) - x = bytearray(r.randrange(0, 256) for i in range(16 * 1024)) - y = encode(x) - assert len(y) % BLOCK_SIZE == 0 - x_ = decode(y) - assert x_[:len(x)] == x - assert all(v == 0 for v in x_[len(x):]) diff --git a/test_ecc.py b/test_ecc.py new file mode 100644 index 0000000..8aad364 --- /dev/null +++ b/test_ecc.py @@ -0,0 +1,15 @@ +import ecc +import random + +def test_random(): + r = random.Random(0) + x = bytearray(r.randrange(0, 256) for i in range(16 * 1024)) + y = ecc.encode(x) + assert len(y) % ecc.BLOCK_SIZE == 0 + x_ = ecc.decode(y) + assert x_[:len(x)] == x + assert all(v == 0 for v in x_[len(x):]) + +def test_file(): + data = open('data.send').read() + assert ecc.decode(ecc.encode(data)) == data