139 lines
4.2 KiB
Python
139 lines
4.2 KiB
Python
import unittest
|
|
|
|
from pathlib import Path
|
|
|
|
try:
|
|
from unittest.mock import call, patch
|
|
except ImportError:
|
|
# Python 2
|
|
from mock import call, patch
|
|
|
|
from pyzbar import zbar_library
|
|
|
|
|
|
class TestLoad(unittest.TestCase):
|
|
def setUp(self):
|
|
self.addCleanup(patch.stopall)
|
|
self.cdll = patch(
|
|
'pyzbar.zbar_library.cdll', autospec=True
|
|
).start()
|
|
self.find_library = patch(
|
|
'pyzbar.zbar_library.find_library', autospec=True
|
|
).start()
|
|
self.platform = patch(
|
|
'pyzbar.zbar_library.platform', autospec=True
|
|
).start()
|
|
self.windows_fnames = patch(
|
|
'pyzbar.zbar_library._windows_fnames', autospec=True,
|
|
return_value=('dll fname', ['dependency fname'])
|
|
).start()
|
|
|
|
def test_found_non_windows(self):
|
|
"zbar loaded ok on non-Windows platform"
|
|
self.platform.system.return_value = 'Not windows'
|
|
|
|
res = zbar_library.load()
|
|
|
|
self.platform.system.assert_called_once_with()
|
|
self.find_library.assert_called_once_with('zbar')
|
|
self.cdll.LoadLibrary.assert_called_once_with(
|
|
self.find_library.return_value
|
|
)
|
|
|
|
self.assertEqual((self.cdll.LoadLibrary.return_value, []), res)
|
|
self.assertEqual(0, self.windows_fnames.call_count)
|
|
|
|
def test_not_found_non_windows(self):
|
|
"zbar not found on non-Windows platform"
|
|
self.platform.system.return_value = 'Not windows'
|
|
self.find_library.return_value = None
|
|
|
|
self.assertRaises(ImportError, zbar_library.load)
|
|
|
|
self.platform.system.assert_called_once_with()
|
|
self.find_library.assert_called_once_with('zbar')
|
|
|
|
def test_found_windows(self):
|
|
"zbar found on Windows"
|
|
self.platform.system.return_value = 'Windows'
|
|
|
|
res = zbar_library.load()
|
|
|
|
self.platform.system.assert_called_once_with()
|
|
self.cdll.LoadLibrary.assert_has_calls([
|
|
call('dependency fname'),
|
|
call('dll fname'),
|
|
])
|
|
self.assertEqual(
|
|
(
|
|
self.cdll.LoadLibrary.return_value,
|
|
[self.cdll.LoadLibrary.return_value]
|
|
),
|
|
res
|
|
)
|
|
|
|
def test_found_second_attempt_windows(self):
|
|
"zbar found on the second attempt on Windows"
|
|
self.platform.system.return_value = 'Windows'
|
|
self.cdll.LoadLibrary.side_effect = [
|
|
OSError, # First call does not load dependent DLL
|
|
'loaded dependency', # Second call loads dependent DLL
|
|
'loaded zbar', # Third call loads dependent DLL
|
|
]
|
|
|
|
res = zbar_library.load()
|
|
|
|
self.platform.system.assert_called_once_with()
|
|
self.cdll.LoadLibrary.assert_has_calls([
|
|
call('dependency fname'),
|
|
call(str(Path(zbar_library.__file__).parent.joinpath(
|
|
'dependency fname'
|
|
))),
|
|
call(str(Path(zbar_library.__file__).parent.joinpath(
|
|
'dll fname'
|
|
))),
|
|
])
|
|
|
|
self.assertEqual(('loaded zbar', ['loaded dependency']), res)
|
|
|
|
def test_not_found_windows(self):
|
|
"zbar not found on Windows"
|
|
self.platform.system.return_value = 'Windows'
|
|
self.cdll.LoadLibrary.side_effect = OSError
|
|
|
|
self.assertRaises(OSError, zbar_library.load)
|
|
|
|
self.platform.system.assert_called_once_with()
|
|
# Two attempts at loading
|
|
self.cdll.LoadLibrary.assert_has_calls([
|
|
call('dependency fname'),
|
|
call(str(Path(zbar_library.__file__).parent.joinpath(
|
|
'dependency fname'
|
|
))),
|
|
])
|
|
|
|
|
|
class TestWindowsFnames(unittest.TestCase):
|
|
def setUp(self):
|
|
self.addCleanup(patch.stopall)
|
|
self.sys = patch('pyzbar.zbar_library.sys', autospec=True).start()
|
|
|
|
def test_32bit(self):
|
|
self.sys.maxsize = 2**32
|
|
self.assertEqual(
|
|
('libzbar-32.dll', ['libiconv-2.dll']),
|
|
zbar_library._windows_fnames()
|
|
)
|
|
|
|
def test_64bit(self):
|
|
# This is a 'long' on a 32-bit interpreter
|
|
self.sys.maxsize = 2**32 + 1
|
|
self.assertEqual(
|
|
('libzbar-64.dll', ['libiconv.dll']),
|
|
zbar_library._windows_fnames()
|
|
)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|