Add tests for decode metadata checks.

This commit is contained in:
Kevin Greenan
2015-02-07 14:25:10 -08:00
parent bcf856f4da
commit 30a74e4483
4 changed files with 42 additions and 10 deletions

View File

@@ -90,9 +90,13 @@ class ECPyECLibDriver(object):
if len(fragment_payloads) < self.k:
raise ECPyECLibException("Not enough fragments given in ECPyECLibDriver.decode")
return pyeclib_c.decode(self.handle, fragment_payloads, fragment_len, ranges, force_metadata_checks)
ret = pyeclib_c.decode(self.handle, fragment_payloads, fragment_len, ranges, force_metadata_checks)
# Was there an error decoding
if ret is None:
raise ECPyECLibException("Error decoding from fragments in ECPyECLibDriver.decode")
return ret
def reconstruct(self, fragment_payloads, indexes_to_reconstruct):
fragment_len = self._validate_and_return_fragment_size(fragment_payloads)

View File

@@ -214,8 +214,8 @@ class ECDriver(object):
:returns: a buffer
:raises: ECDriverError if there is an error during decoding
"""
return self.ec_lib_reference.decode(fragment_payloads, ranges=None,
force_metadata_checks=False)
return self.ec_lib_reference.decode(fragment_payloads, ranges,
force_metadata_checks)
def reconstruct(self, available_fragment_payloads,
missing_fragment_indexes):

View File

@@ -595,7 +595,7 @@ pyeclib_c_decode(PyObject *self, PyObject *args)
int ret = 0;
/* Obtain and validate the method parameters */
if (!PyArg_ParseTuple(args, "OOi|Oi",&pyeclib_obj_handle, &fragments,
if (!PyArg_ParseTuple(args, "OOi|OO",&pyeclib_obj_handle, &fragments,
&fragment_len, &ranges, &metadata_checks_obj)) {
PyErr_SetString(PyECLibError, "Invalid arguments passed to pyeclib.decode");
return NULL;

View File

@@ -251,21 +251,26 @@ class TestPyECLibDriver(unittest.TestCase):
filesize = 1024 * 1024 * 3
file_str = ''.join(random.choice(ascii_letters) for i in range(filesize))
file_bytes = file_str.encode('utf-8')
fragments_to_corrupt = [random.randint(0, 12) for i in range(2)]
fragments_to_corrupt.sort()
for pyeclib_driver in pyeclib_drivers:
fragments = pyeclib_driver.encode(file_bytes)
fragment_metadata_list = []
first_fragment_to_corrupt = random.randint(0, len(fragments))
num_to_corrupt = 2
fragments_to_corrupt = [
(first_fragment_to_corrupt + i) % len(fragments) for i in range(num_to_corrupt + 1)
]
fragments_to_corrupt.sort()
i = 0
for fragment in fragments:
if i in fragments_to_corrupt:
corrupted_fragment = fragment[:100] +\
(str(chr((b2i(fragment[100]) + 0x1)
% 0xff))).encode('utf-8') + fragment[101:]
% 128))).encode('utf-8') + fragment[101:]
fragment_metadata_list.append(
pyeclib_driver.get_metadata(corrupted_fragment))
else:
@@ -435,6 +440,7 @@ class TestPyECLibDriver(unittest.TestCase):
tmp_file.seek(0)
whole_file_str = tmp_file.read()
whole_file_bytes = whole_file_str.encode('utf-8')
got_exception = False
encode_input = whole_file_bytes
orig_fragments = pyeclib_driver.encode(encode_input)
@@ -472,6 +478,28 @@ class TestPyECLibDriver(unittest.TestCase):
reconstructed_fragments[0] == orig_fragments[
idxs_to_remove[0]])
#
# Test decode with integrity checks
#
first_fragment_to_corrupt = random.randint(0, len(fragments))
num_to_corrupt = min(len(fragments), pyeclib_driver.m + 1)
fragments_to_corrupt = [
(first_fragment_to_corrupt + i) % len(fragments) for i in range(num_to_corrupt)
]
i = 0
for fragment in fragments:
if i in fragments_to_corrupt:
corrupted_fragment = ("0" * len(fragment)).encode('utf-8')
fragments[i] = corrupted_fragment
i += 1
try:
decoded_string = pyeclib_driver.decode(fragments[:], force_metadata_checks=True)
except:
got_exception = True
self.assertTrue(got_exception)
def test_min_parity_fragments_needed(self):
pyeclib_drivers = []
pyeclib_drivers.append(ECDriver(k=12, m=2, ec_type="jerasure_rs_vand"))