dlinfo_macosx_mock_test.py 1.3 KB

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