dlinfo_macosx_mock_test.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import builtins
  2. import ctypes
  3. import ctypes.util
  4. import importlib
  5. import os
  6. import types
  7. import unittest.mock
  8. import pytest
  9. import dlinfo
  10. BUILTIN_IMPORT = builtins.__import__
  11. def dyld_find_mock(name):
  12. # https://github.com/python/cpython/blob/master/Lib/ctypes/macholib/dyld.py#L116
  13. return os.path.join(os.sep, 'lib', name)
  14. def import_mock(name, *args):
  15. if name == 'ctypes.macholib.dyld':
  16. dyld_module = unittest.mock.MagicMock()
  17. dyld_module.dyld_find = dyld_find_mock
  18. return dyld_module
  19. return BUILTIN_IMPORT(name, *args)
  20. # pylint: disable=redefined-outer-name
  21. @pytest.fixture
  22. def dlinfo_module_mac() -> types.ModuleType:
  23. with unittest.mock.patch('sys.platform', 'darwin'):
  24. with unittest.mock.patch('builtins.__import__', import_mock):
  25. dlinfo_module = importlib.reload(dlinfo)
  26. assert dlinfo_module.DLInfo.__module__ == 'dlinfo._macosx'
  27. return dlinfo_module
  28. @pytest.mark.parametrize('lib_name', [
  29. 'SegFault',
  30. 'c',
  31. 'dl',
  32. 'python_grasp',
  33. ])
  34. def test_dlinfo_path(dlinfo_module_mac, lib_name):
  35. lib_filename = ctypes.util.find_library(lib_name)
  36. if not lib_filename:
  37. pytest.xfail('lib{} not found'.format(lib_name))
  38. lib = ctypes.cdll.LoadLibrary(lib_filename)
  39. lib_info = dlinfo_module_mac.DLInfo(lib)
  40. assert lib_filename == os.path.basename(lib_info.path)
  41. assert os.path.join(os.sep, 'lib') == os.path.dirname(lib_info.path)