forked from kivy/python-for-android
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_androidmodule_ctypes_finder.py
More file actions
130 lines (115 loc) · 4.67 KB
/
test_androidmodule_ctypes_finder.py
File metadata and controls
130 lines (115 loc) · 4.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# This test is still expected to support Python 2, as it tests
# on-Android functionality that we still maintain
try: # Python 3+
from unittest import mock
from unittest.mock import MagicMock
except ImportError: # Python 2
import mock
from mock import MagicMock
import os
import shutil
import sys
import tempfile
# Import the tested android._ctypes_library_finder module,
# making sure android._android won't crash us!
# (since android._android is android-only / not compilable on desktop)
android_module_folder = os.path.abspath(os.path.join(
os.path.dirname(__file__),
"..", "pythonforandroid", "recipes", "android", "src"
))
sys.path.insert(0, android_module_folder)
sys.modules['android._android'] = MagicMock()
import android._ctypes_library_finder
sys.path.remove(android_module_folder)
@mock.patch.dict('sys.modules', jnius=MagicMock())
def test_get_activity_lib_dir():
import jnius # should get us our fake module
# Short test that it works when activity doesn't exist:
jnius.autoclass = MagicMock()
jnius.autoclass.return_value = None
assert android._ctypes_library_finder.get_activity_lib_dir(
"JavaClass"
) is None
assert mock.call("JavaClass") in jnius.autoclass.call_args_list
# Comprehensive test that verifies getApplicationInfo() call:
activity = MagicMock()
app_context = activity.getApplicationContext()
app_context.getPackageName.return_value = "test.package"
app_info = app_context.getPackageManager().getApplicationInfo()
app_info.nativeLibraryDir = '/testpath'
def pick_class(name):
cls = MagicMock()
if name == "JavaClass":
cls.mActivity = activity
elif name == "android.content.pm.PackageManager":
# Manager class:
cls.GET_SHARED_LIBRARY_FILES = 1024
return cls
jnius.autoclass = MagicMock(side_effect=pick_class)
assert android._ctypes_library_finder.get_activity_lib_dir(
"JavaClass"
) == "/testpath"
assert mock.call("JavaClass") in jnius.autoclass.call_args_list
assert mock.call("test.package", 1024) in (
app_context.getPackageManager().getApplicationInfo.call_args_list
)
@mock.patch.dict('sys.modules', jnius=MagicMock())
def test_find_library():
test_d = tempfile.mkdtemp(prefix="p4a-android-ctypes-test-libdir-")
try:
with open(os.path.join(test_d, "mymadeuplib.so.5"), "w"):
pass
import jnius # should get us our fake module
# Test with mActivity returned:
jnius.autoclass = MagicMock()
jnius.autoclass().mService = None
app_context = jnius.autoclass().mActivity.getApplicationContext()
app_info = app_context.getPackageManager().getApplicationInfo()
app_info.nativeLibraryDir = '/doesnt-exist-testpath'
assert android._ctypes_library_finder.find_library(
"mymadeuplib"
) is None
assert mock.call("org.kivy.android.PythonActivity") in (
jnius.autoclass.call_args_list
)
app_info.nativeLibraryDir = test_d
assert os.path.normpath(android._ctypes_library_finder.find_library(
"mymadeuplib"
)) == os.path.normpath(os.path.join(test_d, "mymadeuplib.so.5"))
# Test with mService returned:
jnius.autoclass = MagicMock()
jnius.autoclass().mActivity = None
app_context = jnius.autoclass().mService.getApplicationContext()
app_info = app_context.getPackageManager().getApplicationInfo()
app_info.nativeLibraryDir = '/doesnt-exist-testpath'
assert android._ctypes_library_finder.find_library(
"mymadeuplib"
) is None
app_info.nativeLibraryDir = test_d
assert os.path.normpath(android._ctypes_library_finder.find_library(
"mymadeuplib"
)) == os.path.normpath(os.path.join(test_d, "mymadeuplib.so.5"))
finally:
shutil.rmtree(test_d)
def test_does_libname_match_filename():
assert android._ctypes_library_finder.does_libname_match_filename(
"mylib", "mylib.so"
)
assert not android._ctypes_library_finder.does_libname_match_filename(
"mylib", "amylib.so"
)
assert not android._ctypes_library_finder.does_libname_match_filename(
"mylib", "mylib.txt"
)
assert not android._ctypes_library_finder.does_libname_match_filename(
"mylib", "mylib"
)
assert android._ctypes_library_finder.does_libname_match_filename(
"mylib", "libmylib.test.so.1.2.3"
)
assert not android._ctypes_library_finder.does_libname_match_filename(
"mylib", "libtest.mylib.so"
)
assert android._ctypes_library_finder.does_libname_match_filename(
"mylib", "mylib.so.5"
)