Merge "checksum.py: fail gracefully if pyeclib is broken"
This commit is contained in:
@@ -25,12 +25,6 @@ import socket
|
|||||||
import struct
|
import struct
|
||||||
import zlib
|
import zlib
|
||||||
|
|
||||||
try:
|
|
||||||
import pyeclib # noqa
|
|
||||||
from importlib.metadata import files as pkg_files # py38+
|
|
||||||
except ImportError:
|
|
||||||
pkg_files = None
|
|
||||||
|
|
||||||
|
|
||||||
# See if anycrc is available...
|
# See if anycrc is available...
|
||||||
if anycrc:
|
if anycrc:
|
||||||
@@ -41,17 +35,30 @@ else:
|
|||||||
crc64nvme_anycrc = None
|
crc64nvme_anycrc = None
|
||||||
|
|
||||||
|
|
||||||
# If isal is available system-wide, great!
|
def find_isal():
|
||||||
isal_lib = ctypes.util.find_library('isal')
|
# If isal is available system-wide, great!
|
||||||
if isal_lib is None and pkg_files is not None:
|
isal_lib = ctypes.util.find_library('isal')
|
||||||
|
if isal_lib is None:
|
||||||
# py38+: Hopefully pyeclib was installed from a manylinux wheel
|
# py38+: Hopefully pyeclib was installed from a manylinux wheel
|
||||||
# with isal baked in?
|
# with isal baked in?
|
||||||
isal_libs = [f for f in pkg_files('pyeclib')
|
try:
|
||||||
|
import pyeclib # noqa
|
||||||
|
from importlib.metadata import files as pkg_files # py38+
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
pyeclib_files = pkg_files('pyeclib')
|
||||||
|
if not pyeclib_files:
|
||||||
|
# see https://docs.python.org/3/library/importlib.metadata.html
|
||||||
|
raise RuntimeError('pyeclib installed but missing files')
|
||||||
|
isal_libs = [f for f in pyeclib_files
|
||||||
if f.name.startswith("libisal")]
|
if f.name.startswith("libisal")]
|
||||||
if len(isal_libs) == 1:
|
if len(isal_libs) == 1:
|
||||||
isal_lib = isal_libs[0].locate()
|
isal_lib = isal_libs[0].locate()
|
||||||
|
return ctypes.CDLL(isal_lib) if isal_lib else None
|
||||||
|
|
||||||
isal = ctypes.CDLL(isal_lib) if isal_lib else None
|
|
||||||
|
isal = find_isal()
|
||||||
|
|
||||||
if hasattr(isal, 'crc32_iscsi'): # isa-l >= 2.16
|
if hasattr(isal, 'crc32_iscsi'): # isa-l >= 2.16
|
||||||
isal.crc32_iscsi.argtypes = [ctypes.c_char_p, ctypes.c_int, ctypes.c_uint]
|
isal.crc32_iscsi.argtypes = [ctypes.c_char_p, ctypes.c_int, ctypes.c_uint]
|
||||||
|
|||||||
@@ -13,6 +13,7 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
import sys
|
||||||
import unittest
|
import unittest
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
@@ -23,6 +24,19 @@ from test.debug_logger import debug_logger
|
|||||||
from test.unit import requires_crc32c, requires_crc64nvme
|
from test.unit import requires_crc32c, requires_crc64nvme
|
||||||
|
|
||||||
|
|
||||||
|
class TestModuleFunctions(unittest.TestCase):
|
||||||
|
@unittest.skipIf(
|
||||||
|
sys.version_info.major == 3 and sys.version_info.minor < 8,
|
||||||
|
"importlib.metadata not available until py3.8")
|
||||||
|
def test_find_isal_pyeclib_dist_missing_files(self):
|
||||||
|
with mock.patch('ctypes.util.find_library', return_value=None):
|
||||||
|
with mock.patch('importlib.metadata.files', return_value=None):
|
||||||
|
with self.assertRaises(RuntimeError) as cm:
|
||||||
|
checksum.find_isal()
|
||||||
|
self.assertEqual('pyeclib installed but missing files',
|
||||||
|
str(cm.exception))
|
||||||
|
|
||||||
|
|
||||||
# If you're curious about the 0xe3069283, see "check" at
|
# If you're curious about the 0xe3069283, see "check" at
|
||||||
# https://reveng.sourceforge.io/crc-catalogue/17plus.htm#crc.cat.crc-32-iscsi
|
# https://reveng.sourceforge.io/crc-catalogue/17plus.htm#crc.cat.crc-32-iscsi
|
||||||
class TestCRC32C(unittest.TestCase):
|
class TestCRC32C(unittest.TestCase):
|
||||||
|
|||||||
Reference in New Issue
Block a user