diff options
author | Kevin Greenan <kmg@box.com> | 2015-03-10 08:44:36 -0700 |
---|---|---|
committer | Tushar Gohad <tushar.gohad@intel.com> | 2015-03-10 22:46:38 -0700 |
commit | f48656c5d7a06a759499be9f6945ac8bc26d8d55 (patch) | |
tree | a1b48adb8e0574fd4fe4bd12527676147a239e56 | |
parent | eb572055f86c0e93f12bab58435885d67265c2a0 (diff) | |
download | pyeclib-f48656c5d7a06a759499be9f6945ac8bc26d8d55.tar.gz |
Wrap calls to pyeclib_c in core.py with try/catch and wrote example
test to validate exceptions.
-rw-r--r-- | pyeclib/core.py | 38 | ||||
-rw-r--r-- | src/c/pyeclib_c/pyeclib_c.c | 2 | ||||
-rw-r--r-- | test/test_pyeclib_api.py | 32 |
3 files changed, 54 insertions, 18 deletions
diff --git a/pyeclib/core.py b/pyeclib/core.py index f6758a5..6a777cc 100644 --- a/pyeclib/core.py +++ b/pyeclib/core.py @@ -24,6 +24,7 @@ from ec_iface import PyECLib_FRAGHDRCHKSUM_Types import math import pyeclib_c +from pyeclib_c import error as PyECLibError import sys pyver = float('%s.%s' % sys.version_info[:2]) @@ -92,7 +93,10 @@ class ECPyECLibDriver(object): if len(fragment_payloads) < self.k: raise ECPyECLibException("Not enough fragments given in ECPyECLibDriver.decode") - ret = pyeclib_c.decode(self.handle, fragment_payloads, fragment_len, ranges, force_metadata_checks) + try: + ret = pyeclib_c.decode(self.handle, fragment_payloads, fragment_len, ranges, force_metadata_checks) + except PyECLibError as e: + raise ECPyECLibException(e) # Was there an error decoding if ret is None: @@ -116,30 +120,48 @@ class ECPyECLibDriver(object): while len(_indexes_to_reconstruct) > 0: index = _indexes_to_reconstruct.pop(0) - reconstructed = pyeclib_c.reconstruct( - self.handle, _fragment_payloads, fragment_len, index) + try: + reconstructed = pyeclib_c.reconstruct( + self.handle, _fragment_payloads, fragment_len, index) + except PyECLibError as e: + raise ECPyECLibException(e) reconstructed_data.append(reconstructed) _fragment_payloads.append(reconstructed) return reconstructed_data def fragments_needed(self, reconstruct_indexes, exclude_indexes): - return pyeclib_c.get_required_fragments( + try: + required_fragments = pyeclib_c.get_required_fragments( self.handle, reconstruct_indexes, exclude_indexes) + return required_fragments + except PyECLibError as e: + raise ECPyECLibException(e) def min_parity_fragments_needed(self): """ FIXME - fix this to return a function of HD """ return 1 def get_metadata(self, fragment, formatted = 0): - return pyeclib_c.get_metadata(self.handle, fragment, formatted) + try: + fragment_metadata = pyeclib_c.get_metadata(self.handle, fragment, formatted) + return fragment_metadata + except PyECLibError as e: + raise ECPyECLibException(e) def verify_stripe_metadata(self, fragment_metadata_list): - return pyeclib_c.check_metadata(self.handle, fragment_metadata_list) + try: + success = pyeclib_c.check_metadata(self.handle, fragment_metadata_list) + return success + except PyECLibError as e: + raise ECPyECLibException(e) def get_segment_info(self, data_len, segment_size): - return pyeclib_c.get_segment_info(self.handle, data_len, segment_size) - + try: + segment_info = pyeclib_c.get_segment_info(self.handle, data_len, segment_size) + return segment_info + except PyECLibError as e: + raise ECPyECLibException(e) class ECNullDriver(object): diff --git a/src/c/pyeclib_c/pyeclib_c.c b/src/c/pyeclib_c/pyeclib_c.c index 50ea819..43fd340 100644 --- a/src/c/pyeclib_c/pyeclib_c.c +++ b/src/c/pyeclib_c/pyeclib_c.c @@ -698,7 +698,7 @@ pyeclib_c_decode(PyObject *self, PyObject *args) Py_ssize_t len = 0; PyBytes_AsStringAndSize(tmp_data, &(c_fragments[i]), &len); } - + ret = liberasurecode_decode(pyeclib_handle->ec_desc, c_fragments, num_fragments, diff --git a/test/test_pyeclib_api.py b/test/test_pyeclib_api.py index 969fee1..f0c27ff 100644 --- a/test/test_pyeclib_api.py +++ b/test/test_pyeclib_api.py @@ -26,6 +26,7 @@ from string import ascii_letters, ascii_uppercase, digits import sys import tempfile import unittest +from pyeclib.core import ECPyECLibException from pyeclib.ec_iface import ECDriver, VALID_EC_TYPES, ECDriverError, \ PyECLib_EC_Types @@ -496,14 +497,6 @@ class TestPyECLibDriver(unittest.TestCase): idxs_to_remove[0]]) # - # Test reconstructor with insufficient fragments - # - try: - pyeclib_driver.reconstruct([fragments[0]], []) - except pyeclib_c.error as e: - self.assertTrue(e.message.find("Insufficient number of fragments") > -1) - - # # Test decode with integrity checks # first_fragment_to_corrupt = random.randint(0, len(fragments)) @@ -524,7 +517,28 @@ class TestPyECLibDriver(unittest.TestCase): except: got_exception = True self.assertTrue(got_exception) - + def test_liberasurecode_error(self): + pyeclib_driver = self.get_available_backend(k=10, m=5, ec_type="flat_xor_hd_3") + file_size = self.file_sizes[0] + tmp_file = self.files[file_size] + tmp_file.seek(0) + whole_file_str = tmp_file.read() + whole_file_bytes = whole_file_str.encode('utf-8') + hit_exception = False + + fragments = pyeclib_driver.encode(whole_file_bytes) + + # + # Test reconstructor with insufficient fragments + # + try: + pyeclib_driver.reconstruct([fragments[0]], [1,2,3,4,5,6]) + except ECPyECLibException as e: + hit_exception = True + self.assertTrue(e.error_str.__str__().find("Insufficient number of fragments") > -1) + + self.assertTrue(hit_exception) + def test_min_parity_fragments_needed(self): pyeclib_drivers = [] pyeclib_drivers.append(ECDriver(k=12, m=2, ec_type="jerasure_rs_vand")) |