diff options
author | Tim Burke <tim.burke@gmail.com> | 2016-11-16 15:52:22 -0800 |
---|---|---|
committer | Tim Burke <tim.burke@gmail.com> | 2016-11-17 09:57:35 -0800 |
commit | 9cc72f7ce8cc1db9e4116be99bee513f3169ed91 (patch) | |
tree | 66b0b33980165809d8286e8a0f256eebed4ca2de /pyeclib | |
parent | ea46179001c0375a523b6b2e388a14012f6cb45c (diff) | |
download | pyeclib-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.py | 15 | ||||
-rw-r--r-- | pyeclib/ec_iface.py | 8 |
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 |