summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Greenan <kmg@box.com>2015-03-10 08:44:36 -0700
committerKevin Greenan <kmg@box.com>2015-03-10 08:44:36 -0700
commit92ad540101ef2f2086807916c0db29c3a9237e91 (patch)
treeabb5da06d459cabb3200b0417e2a1990ec2a9f49
parentd66598e61dbc8a5a440cd1e5ff5a0f424d2b99a8 (diff)
downloadpyeclib-92ad540101ef2f2086807916c0db29c3a9237e91.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.py38
-rw-r--r--src/c/pyeclib_c/pyeclib_c.c2
-rw-r--r--test/test_pyeclib_api.py32
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 bfa546a..4f94118 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
@@ -510,14 +511,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))
@@ -538,7 +531,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(self.get_available_backend(k=10, m=5, ec_type="flat_xor_hd_3"))