Add liberasurecode_rs_vand test cases
This commit is contained in:
		@@ -26,6 +26,7 @@ from string import ascii_letters, ascii_uppercase, digits
 | 
				
			|||||||
import sys
 | 
					import sys
 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
 | 
					from pyeclib.ec_iface import ECBackendNotSupported
 | 
				
			||||||
from pyeclib.ec_iface import ECDriverError
 | 
					from pyeclib.ec_iface import ECDriverError
 | 
				
			||||||
from pyeclib.ec_iface import ECInsufficientFragments
 | 
					from pyeclib.ec_iface import ECInsufficientFragments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -117,13 +118,26 @@ class TestPyECLibDriver(unittest.TestCase):
 | 
				
			|||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    _instance = ECDriver(k=10, m=5, ec_type=_type)
 | 
					                    _instance = ECDriver(k=10, m=5, ec_type=_type)
 | 
				
			||||||
            except ECDriverError:
 | 
					            except ECDriverError:
 | 
				
			||||||
                self.fail("%s algorithm not supported" % _type)
 | 
					                self.fail("%p: %s algorithm not supported" % _instance, _type)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.assertRaises(ECBackendNotSupported, ECDriver, k=10, m=5,
 | 
				
			||||||
 | 
					                          ec_type="invalid_algo")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_small_encode(self):
 | 
					    def test_small_encode(self):
 | 
				
			||||||
        pyeclib_drivers = []
 | 
					        pyeclib_drivers = []
 | 
				
			||||||
        pyeclib_drivers.append(ECDriver(k=12, m=2, ec_type="jerasure_rs_vand"))
 | 
					        pyeclib_drivers.append(ECDriver(k=12, m=2, ec_type="jerasure_rs_vand"))
 | 
				
			||||||
        pyeclib_drivers.append(ECDriver(k=11, m=2, ec_type="jerasure_rs_vand"))
 | 
					        pyeclib_drivers.append(ECDriver(k=11, m=2, ec_type="jerasure_rs_vand"))
 | 
				
			||||||
        pyeclib_drivers.append(ECDriver(k=10, m=2, ec_type="jerasure_rs_vand"))
 | 
					        pyeclib_drivers.append(ECDriver(k=10, m=2, ec_type="jerasure_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(ECDriver(k=8, m=4, ec_type="jerasure_rs_vand"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(ECDriver(k=12, m=2,
 | 
				
			||||||
 | 
					                                        ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(ECDriver(k=11, m=2,
 | 
				
			||||||
 | 
					                                        ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(ECDriver(k=10, m=2,
 | 
				
			||||||
 | 
					                                        ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(ECDriver(k=8, m=4,
 | 
				
			||||||
 | 
					                                        ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        encode_strs = [b"a", b"hello", b"hellohyhi", b"yo"]
 | 
					        encode_strs = [b"a", b"hello", b"hellohyhi", b"yo"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -196,80 +210,97 @@ class TestPyECLibDriver(unittest.TestCase):
 | 
				
			|||||||
#                pyeclib_driver.verify_stripe_metadata(fragment_metadata_list) == -1)
 | 
					#                pyeclib_driver.verify_stripe_metadata(fragment_metadata_list) == -1)
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_available_backend(self, k, m, ec_type, chksum_type = "inline_crc32"):
 | 
					    def check_metadata_formatted(self, k, m, ec_type, chksum_type):
 | 
				
			||||||
      if ec_type[:11] == "flat_xor_hd":
 | 
					 | 
				
			||||||
        return ECDriver(k=k, m=m, ec_type="flat_xor_hd", chksum_type=chksum_type)
 | 
					 | 
				
			||||||
      elif ec_type in self.available_backends:
 | 
					 | 
				
			||||||
        return ECDriver(k=k, m=m, ec_type=ec_type, chksum_type=chksum_type)
 | 
					 | 
				
			||||||
      else:
 | 
					 | 
				
			||||||
        return None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def test_get_metadata_formatted(self):
 | 
					 | 
				
			||||||
        pyeclib_driver = ECDriver(k=12, m=2, ec_type="jerasure_rs_vand", chksum_type="inline_crc32")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        filesize = 1024 * 1024 * 3
 | 
					        filesize = 1024 * 1024 * 3
 | 
				
			||||||
        file_str = ''.join(random.choice(ascii_letters) for i in range(filesize))
 | 
					        file_str = ''.join(random.choice(ascii_letters)
 | 
				
			||||||
 | 
					                           for i in range(filesize))
 | 
				
			||||||
        file_bytes = file_str.encode('utf-8')
 | 
					        file_bytes = file_str.encode('utf-8')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pyeclib_driver = ECDriver(k=k, m=m, ec_type=ec_type,
 | 
				
			||||||
 | 
					                                  chksum_type=chksum_type)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        fragments = pyeclib_driver.encode(file_bytes)
 | 
					        fragments = pyeclib_driver.encode(file_bytes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        i = 0
 | 
					        f = 0
 | 
				
			||||||
        for fragment in fragments:
 | 
					        for fragment in fragments:
 | 
				
			||||||
            metadata = pyeclib_driver.get_metadata(fragment, 1)
 | 
					            metadata = pyeclib_driver.get_metadata(fragment, 1)
 | 
				
			||||||
          if metadata.has_key('index'):
 | 
					            if 'index' in metadata:
 | 
				
			||||||
            self.assertEqual(metadata['index'], i)
 | 
					                self.assertEqual(metadata['index'], f)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
            self.assertTrue(false)
 | 
					                self.assertTrue(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if metadata.has_key('chksum_mismatch'):
 | 
					            if 'chksum_mismatch' in metadata:
 | 
				
			||||||
                self.assertEqual(metadata['chksum_mismatch'], 0)
 | 
					                self.assertEqual(metadata['chksum_mismatch'], 0)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
            self.assertTrue(false)
 | 
					                self.assertTrue(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if metadata.has_key('backend_id'):
 | 
					            if 'backend_id' in metadata:
 | 
				
			||||||
            self.assertEqual(metadata['backend_id'], 'jerasure_rs_vand')
 | 
					                self.assertEqual(metadata['backend_id'], ec_type)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
            self.assertTrue(false)
 | 
					                self.assertTrue(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if metadata.has_key('orig_data_size'):
 | 
					            if 'orig_data_size' in metadata:
 | 
				
			||||||
                self.assertEqual(metadata['orig_data_size'], 3145728)
 | 
					                self.assertEqual(metadata['orig_data_size'], 3145728)
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
            self.assertTrue(false)
 | 
					                self.assertTrue(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if metadata.has_key('chksum_type'):
 | 
					            if 'chksum_type' in metadata:
 | 
				
			||||||
                self.assertEqual(metadata['chksum_type'], 'crc32')
 | 
					                self.assertEqual(metadata['chksum_type'], 'crc32')
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
            self.assertTrue(false)
 | 
					                self.assertTrue(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if not metadata.has_key('backend_version'):
 | 
					            if 'backend_version' not in metadata:
 | 
				
			||||||
            self.assertTrue(false)
 | 
					                self.assertTrue(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if not metadata.has_key('chksum'):
 | 
					            if 'chksum' not in metadata:
 | 
				
			||||||
            self.assertTrue(false)
 | 
					                self.assertTrue(False)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          if not metadata.has_key('size'):
 | 
					            if 'size' not in metadata:
 | 
				
			||||||
            self.assertTrue(false)
 | 
					                self.assertTrue(False)
 | 
				
			||||||
 | 
					 | 
				
			||||||
          i += 1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            f += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_get_metadata_formatted(self):
 | 
				
			||||||
 | 
					        self.check_metadata_formatted(12, 2, "jerasure_rs_vand",
 | 
				
			||||||
 | 
					                                      "inline_crc32")
 | 
				
			||||||
 | 
					        self.check_metadata_formatted(12, 2, "liberasurecode_rs_vand",
 | 
				
			||||||
 | 
					                                      "inline_crc32")
 | 
				
			||||||
 | 
					        self.check_metadata_formatted(8, 4, "liberasurecode_rs_vand",
 | 
				
			||||||
 | 
					                                      "inline_crc32")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_verify_fragment_inline_chksum_fail(self):
 | 
					    def test_verify_fragment_inline_chksum_fail(self):
 | 
				
			||||||
        pyeclib_drivers = []
 | 
					        pyeclib_drivers = []
 | 
				
			||||||
        pyeclib_drivers.append(
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
            ECDriver(k=12, m=2, ec_type="jerasure_rs_vand", chksum_type="inline_crc32"))
 | 
					            ECDriver(k=12, m=2, ec_type="jerasure_rs_vand",
 | 
				
			||||||
 | 
					                     chksum_type="inline_crc32"))
 | 
				
			||||||
        pyeclib_drivers.append(
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
            ECDriver(k=12, m=3, ec_type="jerasure_rs_vand", chksum_type="inline_crc32"))
 | 
					            ECDriver(k=12, m=3, ec_type="jerasure_rs_vand",
 | 
				
			||||||
 | 
					                     chksum_type="inline_crc32"))
 | 
				
			||||||
        pyeclib_drivers.append(
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
            ECDriver(k=12, m=4, ec_type="jerasure_rs_vand", chksum_type="inline_crc32"))
 | 
					            ECDriver(k=12, m=4, ec_type="jerasure_rs_vand",
 | 
				
			||||||
 | 
					                     chksum_type="inline_crc32"))
 | 
				
			||||||
        pyeclib_drivers.append(
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
            ECDriver(k=12, m=2, ec_type="jerasure_rs_cauchy", chksum_type="inline_crc32"))
 | 
					            ECDriver(k=12, m=2, ec_type="jerasure_rs_cauchy",
 | 
				
			||||||
 | 
					                     chksum_type="inline_crc32"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=12, m=2, ec_type="liberasurecode_rs_vand",
 | 
				
			||||||
 | 
					                     chksum_type="inline_crc32"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=12, m=3, ec_type="liberasurecode_rs_vand",
 | 
				
			||||||
 | 
					                     chksum_type="inline_crc32"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=12, m=4, ec_type="liberasurecode_rs_vand",
 | 
				
			||||||
 | 
					                     chksum_type="inline_crc32"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=12, m=2, ec_type="liberasurecode_rs_vand",
 | 
				
			||||||
 | 
					                     chksum_type="inline_crc32"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        filesize = 1024 * 1024 * 3
 | 
					        filesize = 1024 * 1024 * 3
 | 
				
			||||||
        file_str = ''.join(random.choice(ascii_letters) for i in range(filesize))
 | 
					        file_str = ''.join(random.choice(ascii_letters) for i in range(filesize))
 | 
				
			||||||
        file_bytes = file_str.encode('utf-8')
 | 
					        file_bytes = file_str.encode('utf-8')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
        for pyeclib_driver in pyeclib_drivers:
 | 
					        for pyeclib_driver in pyeclib_drivers:
 | 
				
			||||||
            fragments = pyeclib_driver.encode(file_bytes)
 | 
					            fragments = pyeclib_driver.encode(file_bytes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -339,6 +370,12 @@ class TestPyECLibDriver(unittest.TestCase):
 | 
				
			|||||||
            ECDriver(k=11, m=2, ec_type="jerasure_rs_vand"))
 | 
					            ECDriver(k=11, m=2, ec_type="jerasure_rs_vand"))
 | 
				
			||||||
        pyeclib_drivers.append(
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
            ECDriver(k=10, m=2, ec_type="jerasure_rs_vand"))
 | 
					            ECDriver(k=10, m=2, ec_type="jerasure_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=12, m=2, ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=11, m=2, ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=10, m=2, ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        file_size = 1024 * 1024
 | 
					        file_size = 1024 * 1024
 | 
				
			||||||
        segment_size = 3 * 1024
 | 
					        segment_size = 3 * 1024
 | 
				
			||||||
@@ -372,6 +409,12 @@ class TestPyECLibDriver(unittest.TestCase):
 | 
				
			|||||||
            ECDriver(k=11, m=2, ec_type="jerasure_rs_vand"))
 | 
					            ECDriver(k=11, m=2, ec_type="jerasure_rs_vand"))
 | 
				
			||||||
        pyeclib_drivers.append(
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
            ECDriver(k=10, m=2, ec_type="jerasure_rs_vand"))
 | 
					            ECDriver(k=10, m=2, ec_type="jerasure_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=12, m=2, ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=11, m=2, ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=10, m=2, ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        file_sizes = [
 | 
					        file_sizes = [
 | 
				
			||||||
            1024 * 1024,
 | 
					            1024 * 1024,
 | 
				
			||||||
@@ -450,6 +493,12 @@ class TestPyECLibDriver(unittest.TestCase):
 | 
				
			|||||||
            ECDriver(k=12, m=6, ec_type="flat_xor_hd"))
 | 
					            ECDriver(k=12, m=6, ec_type="flat_xor_hd"))
 | 
				
			||||||
        pyeclib_drivers.append(
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
            ECDriver(k=10, m=5, ec_type="flat_xor_hd"))
 | 
					            ECDriver(k=10, m=5, ec_type="flat_xor_hd"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=12, m=2, ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=8, m=6, ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					        pyeclib_drivers.append(
 | 
				
			||||||
 | 
					            ECDriver(k=10, m=4, ec_type="liberasurecode_rs_vand"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for pyeclib_driver in pyeclib_drivers:
 | 
					        for pyeclib_driver in pyeclib_drivers:
 | 
				
			||||||
            for file_size in self.file_sizes:
 | 
					            for file_size in self.file_sizes:
 | 
				
			||||||
@@ -457,7 +506,6 @@ class TestPyECLibDriver(unittest.TestCase):
 | 
				
			|||||||
                tmp_file.seek(0)
 | 
					                tmp_file.seek(0)
 | 
				
			||||||
                whole_file_str = tmp_file.read()
 | 
					                whole_file_str = tmp_file.read()
 | 
				
			||||||
                whole_file_bytes = whole_file_str.encode('utf-8')
 | 
					                whole_file_bytes = whole_file_str.encode('utf-8')
 | 
				
			||||||
                got_exception = False
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
                encode_input = whole_file_bytes
 | 
					                encode_input = whole_file_bytes
 | 
				
			||||||
                orig_fragments = pyeclib_driver.encode(encode_input)
 | 
					                orig_fragments = pyeclib_driver.encode(encode_input)
 | 
				
			||||||
@@ -511,33 +559,32 @@ class TestPyECLibDriver(unittest.TestCase):
 | 
				
			|||||||
                        fragments[i] = corrupted_fragment
 | 
					                        fragments[i] = corrupted_fragment
 | 
				
			||||||
                      i += 1
 | 
					                      i += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    try:
 | 
					                    self.assertRaises(ECInsufficientFragments,
 | 
				
			||||||
                      decoded_string = pyeclib_driver.decode(fragments[:], force_metadata_checks=True)
 | 
					                                      pyeclib_driver.decode,
 | 
				
			||||||
                    except:
 | 
					                                      fragments[:], force_metadata_checks=True)
 | 
				
			||||||
                      got_exception = True 
 | 
					 | 
				
			||||||
                    self.assertTrue(got_exception)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_liberasurecode_error(self):
 | 
					    def get_available_backend(self, k, m, ec_type, chksum_type="inline_crc32"):
 | 
				
			||||||
        pyeclib_driver = self.get_available_backend(k=10, m=5, ec_type="flat_xor_hd_3")
 | 
					        if ec_type[:11] == "flat_xor_hd":
 | 
				
			||||||
 | 
					            return ECDriver(k=k, m=m, ec_type="flat_xor_hd",
 | 
				
			||||||
 | 
					                            chksum_type=chksum_type)
 | 
				
			||||||
 | 
					        elif ec_type in _available_backends:
 | 
				
			||||||
 | 
					            return ECDriver(k=k, m=m, ec_type=ec_type, chksum_type=chksum_type)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_liberasurecode_insufficient_frags_error(self):
 | 
				
			||||||
        file_size = self.file_sizes[0]
 | 
					        file_size = self.file_sizes[0]
 | 
				
			||||||
        tmp_file = self.files[file_size]
 | 
					        tmp_file = self.files[file_size]
 | 
				
			||||||
        tmp_file.seek(0)
 | 
					        tmp_file.seek(0)
 | 
				
			||||||
        whole_file_str = tmp_file.read()
 | 
					        whole_file_str = tmp_file.read()
 | 
				
			||||||
        whole_file_bytes = whole_file_str.encode('utf-8')
 | 
					        whole_file_bytes = whole_file_str.encode('utf-8')
 | 
				
			||||||
        hit_exception = False
 | 
					        for ec_type in ['flat_xor_hd_3', 'liberasurecode_rs_vand']:
 | 
				
			||||||
 | 
					            pyeclib_driver = self.get_available_backend(
 | 
				
			||||||
 | 
					                k=10, m=5, ec_type=ec_type)
 | 
				
			||||||
            fragments = pyeclib_driver.encode(whole_file_bytes)
 | 
					            fragments = pyeclib_driver.encode(whole_file_bytes)
 | 
				
			||||||
 | 
					            self.assertRaises(ECInsufficientFragments,
 | 
				
			||||||
        #
 | 
					                              pyeclib_driver.reconstruct,
 | 
				
			||||||
        # Test reconstructor with insufficient fragments
 | 
					                              [fragments[0]], [1, 2, 3, 4, 5, 6])
 | 
				
			||||||
        #
 | 
					 | 
				
			||||||
        try:
 | 
					 | 
				
			||||||
            pyeclib_driver.reconstruct([fragments[0]], [1, 2, 3, 4, 5, 6])
 | 
					 | 
				
			||||||
        except ECInsufficientFragments 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):
 | 
					    def test_min_parity_fragments_needed(self):
 | 
				
			||||||
        pyeclib_drivers = []
 | 
					        pyeclib_drivers = []
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user