summaryrefslogtreecommitdiff
path: root/pyeclib
diff options
context:
space:
mode:
authorTim Burke <tim.burke@gmail.com>2016-11-16 15:52:22 -0800
committerTim Burke <tim.burke@gmail.com>2016-11-17 09:57:35 -0800
commit9cc72f7ce8cc1db9e4116be99bee513f3169ed91 (patch)
tree66b0b33980165809d8286e8a0f256eebed4ca2de /pyeclib
parentea46179001c0375a523b6b2e388a14012f6cb45c (diff)
downloadpyeclib-9cc72f7ce8cc1db9e4116be99bee513f3169ed91.tar.gz
Assorted combinatoric-test fixes
* Test flat_xor_hd decoding/reconstruction * Use random input * Make py3-friendly Additionally: * Accept iterables as fragment payloads, rather than just lists * Add a __repr__ for ECDrivers Change-Id: Ic5b5e5ef2420afdc318b403fcbea1ff106e16a33
Diffstat (limited to 'pyeclib')
-rw-r--r--pyeclib/core.py15
-rw-r--r--pyeclib/ec_iface.py8
2 files changed, 16 insertions, 7 deletions
diff --git a/pyeclib/core.py b/pyeclib/core.py
index a0174e1..c7e38df 100644
--- a/pyeclib/core.py
+++ b/pyeclib/core.py
@@ -64,7 +64,7 @@ class ECPyECLibDriver(object):
return pyeclib_c.encode(self.handle, data_bytes)
def _validate_and_return_fragment_size(self, fragments):
- if len(fragments) > 0 and len(fragments[0]) == 0:
+ if len(fragments) == 0 or len(fragments[0]) == 0:
return -1
fragment_len = len(fragments[0])
for fragment in fragments[1:]:
@@ -74,28 +74,29 @@ class ECPyECLibDriver(object):
def decode(self, fragment_payloads, ranges=None,
force_metadata_checks=False):
+ _fragment_payloads = list(fragment_payloads)
fragment_len = self._validate_and_return_fragment_size(
- fragment_payloads)
+ _fragment_payloads)
if fragment_len < 0:
raise ECDriverError(
"Invalid fragment payload in ECPyECLibDriver.decode")
- if len(fragment_payloads) < self.k:
+ if len(_fragment_payloads) < self.k:
raise ECInsufficientFragments(
"Not enough fragments given in ECPyECLibDriver.decode")
- return pyeclib_c.decode(self.handle, fragment_payloads, fragment_len,
- ranges, force_metadata_checks)
+ return pyeclib_c.decode(self.handle, _fragment_payloads,
+ fragment_len, ranges, force_metadata_checks)
def reconstruct(self, fragment_payloads, indexes_to_reconstruct):
+ _fragment_payloads = list(fragment_payloads)
fragment_len = self._validate_and_return_fragment_size(
- fragment_payloads)
+ _fragment_payloads)
if fragment_len < 0:
raise ECDriverError(
"Invalid fragment payload in ECPyECLibDriver.reconstruct")
reconstructed_data = []
- _fragment_payloads = fragment_payloads[:]
# Reconstruct the data, then the parity
# The parity cannot be reconstructed until
diff --git a/pyeclib/ec_iface.py b/pyeclib/ec_iface.py
index 1b429cf..2fee3ee 100644
--- a/pyeclib/ec_iface.py
+++ b/pyeclib/ec_iface.py
@@ -230,6 +230,14 @@ class ECDriver(object):
"The following required methods are not implemented "
"in %s: %s" % (self.library_import_str, not_implemented_str))
+ def __repr__(self):
+ return '%s(ec_type=%r, k=%r, m=%r)' % (
+ type(self).__name__,
+ 'flat_xor_hd_%s' % self.hd if self.ec_type.name == 'flat_xor_hd'
+ else self.ec_type.name,
+ self.k,
+ self.m)
+
def encode(self, data_bytes):
"""
Encode an arbitrary-sized string