Skip to content

Commit ad877a2

Browse files
committed
[tests] Add unittest for module pythonforandroid.distribution
1 parent fc17a5c commit ad877a2

File tree

1 file changed

+216
-0
lines changed

1 file changed

+216
-0
lines changed

tests/test_distribution.py

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
import os
2+
import json
3+
import unittest
4+
5+
try:
6+
from unittest import mock
7+
except ImportError:
8+
# `Python 2` or lower than `Python 3.3` does not
9+
# have the `unittest.mock` module built-in
10+
import mock
11+
from pythonforandroid.bootstrap import Bootstrap
12+
from pythonforandroid.distribution import Distribution
13+
from pythonforandroid.recipe import Recipe
14+
from pythonforandroid.util import BuildInterruptingException
15+
from pythonforandroid.build import Context
16+
17+
dist_info_data = {
18+
"dist_name": None,
19+
"bootstrap": "sdl2",
20+
"archs": ["armeabi", "armeabi-v7a", "x86", "x86_64", "arm64-v8a"],
21+
"ndk_api": 21,
22+
"use_setup_py": False,
23+
"recipes": ["hostpython3", "python3", "sdl2", "kivy", "requests"],
24+
"hostpython": "/some/fake/hostpython3",
25+
"python_version": "3.7",
26+
}
27+
28+
29+
class TestDistribution(unittest.TestCase):
30+
def setUp(self):
31+
self.ctx = Context()
32+
self.ctx.ndk_api = 21
33+
self.ctx.android_api = 27
34+
self.ctx._sdk_dir = "/opt/android/android-sdk"
35+
self.ctx._ndk_dir = "/opt/android/android-ndk"
36+
self.ctx.setup_dirs(os.getcwd())
37+
self.ctx.recipe_build_order = [
38+
"hostpython3",
39+
"python3",
40+
"sdl2",
41+
"kivy",
42+
]
43+
44+
def setUp_distribution_with_bootstrap(self, bs, **kwargs):
45+
# extend the setUp by configuring a distribution, because some test
46+
# needs a distribution to be set to be properly tested
47+
self.ctx.bootstrap = bs
48+
self.ctx.bootstrap.distribution = Distribution.get_distribution(
49+
self.ctx,
50+
name=kwargs.pop("name", "test_prj"),
51+
recipes=kwargs.pop("recipes", ["python3", "kivy"]),
52+
**kwargs
53+
)
54+
55+
def tearDown(self):
56+
self.ctx.bootstrap = None
57+
58+
def test_properties(self):
59+
self.setUp_distribution_with_bootstrap(
60+
Bootstrap().get_bootstrap("sdl2", self.ctx)
61+
)
62+
distribution = self.ctx.bootstrap.distribution
63+
self.assertEqual(self.ctx, distribution.ctx)
64+
expected_repr = (
65+
"<Distribution: name test_prj with recipes (python3, kivy)>"
66+
)
67+
self.assertEqual(distribution.__str__(), expected_repr)
68+
self.assertEqual(distribution.__repr__(), expected_repr)
69+
70+
@mock.patch("pythonforandroid.distribution.exists")
71+
def test_folder_exist(self, mock_exists):
72+
73+
self.setUp_distribution_with_bootstrap(
74+
Bootstrap().get_bootstrap("sdl2", self.ctx)
75+
)
76+
self.ctx.bootstrap.distribution.folder_exists()
77+
mock_exists.assert_called_with(
78+
self.ctx.bootstrap.distribution.dist_dir
79+
)
80+
81+
@mock.patch("pythonforandroid.distribution.rmtree")
82+
def test_delete(self, mock_rmtree):
83+
84+
self.setUp_distribution_with_bootstrap(
85+
Bootstrap().get_bootstrap("sdl2", self.ctx)
86+
)
87+
self.ctx.bootstrap.distribution.delete()
88+
mock_rmtree.assert_called_with(
89+
self.ctx.bootstrap.distribution.dist_dir
90+
)
91+
92+
@mock.patch("pythonforandroid.distribution.exists")
93+
def test_get_distribution_no_name(self, mock_exists):
94+
95+
mock_exists.return_value = False
96+
self.ctx.bootstrap = Bootstrap().get_bootstrap("sdl2", self.ctx)
97+
dist = Distribution.get_distribution(self.ctx)
98+
self.assertEqual(dist.name, "unnamed_dist_1")
99+
100+
@mock.patch("pythonforandroid.util.chdir")
101+
@mock.patch("pythonforandroid.distribution.open", create=True)
102+
def test_save_info(self, mock_open_dist_info, mock_chdir):
103+
self.setUp_distribution_with_bootstrap(
104+
Bootstrap().get_bootstrap("sdl2", self.ctx)
105+
)
106+
self.ctx.hostpython = "/some/fake/hostpython3"
107+
self.ctx.python_recipe = Recipe.get_recipe("python3", self.ctx)
108+
self.ctx.python_modules = ["requests"]
109+
mock_open_dist_info.side_effect = [
110+
mock.mock_open(read_data=json.dumps(dist_info_data)).return_value
111+
]
112+
self.ctx.bootstrap.distribution.save_info("/fake_dir")
113+
mock_open_dist_info.assert_called_once_with("dist_info.json", "w")
114+
mock_open_dist_info.reset_mock()
115+
116+
@mock.patch("pythonforandroid.distribution.open", create=True)
117+
@mock.patch("pythonforandroid.distribution.exists")
118+
@mock.patch("pythonforandroid.distribution.glob.glob")
119+
def test_get_distributions(
120+
self, mock_glob, mock_exists, mock_open_dist_info
121+
):
122+
self.setUp_distribution_with_bootstrap(
123+
Bootstrap().get_bootstrap("sdl2", self.ctx)
124+
)
125+
mock_glob.return_value = ["sdl2-python3"]
126+
mock_open_dist_info.side_effect = [
127+
mock.mock_open(read_data=json.dumps(dist_info_data)).return_value
128+
]
129+
130+
dists = self.ctx.bootstrap.distribution.get_distributions(self.ctx)
131+
self.assertIsInstance(dists, list)
132+
self.assertEqual(len(dists), 1)
133+
self.assertIsInstance(dists[0], Distribution)
134+
self.assertEqual(dists[0].name, "sdl2-python3")
135+
self.assertEqual(dists[0].ndk_api, 21)
136+
self.assertEqual(
137+
dists[0].recipes,
138+
["hostpython3", "python3", "sdl2", "kivy", "requests"],
139+
)
140+
mock_open_dist_info.assert_called_with("sdl2-python3/dist_info.json")
141+
mock_open_dist_info.reset_mock()
142+
143+
@mock.patch("pythonforandroid.distribution.open", create=True)
144+
@mock.patch("pythonforandroid.distribution.exists")
145+
@mock.patch("pythonforandroid.distribution.glob.glob")
146+
def test_get_distributions_error_ndk_api(
147+
self, mock_glob, mock_exists, mock_open_dist_info
148+
):
149+
dist_info_data_no_ndk_api = dist_info_data.copy()
150+
dist_info_data_no_ndk_api.pop("ndk_api")
151+
self.setUp_distribution_with_bootstrap(
152+
Bootstrap().get_bootstrap("sdl2", self.ctx)
153+
)
154+
mock_glob.return_value = ["sdl2-python3"]
155+
mock_open_dist_info.side_effect = [
156+
mock.mock_open(
157+
read_data=json.dumps(dist_info_data_no_ndk_api)
158+
).return_value
159+
]
160+
161+
dists = self.ctx.bootstrap.distribution.get_distributions(self.ctx)
162+
self.assertEqual(dists[0].ndk_api, None)
163+
mock_open_dist_info.assert_called_with("sdl2-python3/dist_info.json")
164+
mock_open_dist_info.reset_mock()
165+
166+
@mock.patch("pythonforandroid.distribution.Distribution.get_distributions")
167+
@mock.patch("pythonforandroid.distribution.exists")
168+
@mock.patch("pythonforandroid.distribution.glob.glob")
169+
def test_get_distributions_error_ndk_api_mismatch(
170+
self, mock_glob, mock_exists, mock_get_dists
171+
):
172+
expected_dist = Distribution.get_distribution(
173+
self.ctx, name="test_prj", recipes=["python3", "kivy"]
174+
)
175+
mock_get_dists.return_value = [expected_dist]
176+
mock_glob.return_value = ["sdl2-python3"]
177+
178+
with self.assertRaises(BuildInterruptingException) as e:
179+
self.setUp_distribution_with_bootstrap(
180+
Bootstrap().get_bootstrap("sdl2", self.ctx),
181+
allow_replace_dist=False,
182+
ndk_api=22,
183+
)
184+
self.assertEqual(
185+
e.exception.args[0],
186+
"Asked for dist with name test_prj with recipes (python3, kivy)"
187+
" and NDK API 22, but a dist with this name already exists and has"
188+
" either incompatible recipes (python3, kivy) or NDK API 21",
189+
)
190+
191+
def test_get_distributions_error_extra_dist_dirs(self):
192+
self.setUp_distribution_with_bootstrap(
193+
Bootstrap().get_bootstrap("sdl2", self.ctx)
194+
)
195+
196+
with self.assertRaises(BuildInterruptingException) as e:
197+
self.ctx.bootstrap.distribution.get_distributions(
198+
self.ctx, extra_dist_dirs=["/fake/extra/dist_dirs"]
199+
)
200+
self.assertEqual(
201+
e.exception.args[0],
202+
"extra_dist_dirs argument to get"
203+
"_distributions is not yet implemented",
204+
)
205+
206+
@mock.patch("pythonforandroid.distribution.Distribution.get_distributions")
207+
def test_get_distributions_possible_dists(self, mock_get_dists):
208+
expected_dist = Distribution.get_distribution(
209+
self.ctx, name="test_prj", recipes=["python3", "kivy"]
210+
)
211+
mock_get_dists.return_value = [expected_dist]
212+
self.setUp_distribution_with_bootstrap(
213+
Bootstrap().get_bootstrap("sdl2", self.ctx), name="test_prj"
214+
)
215+
dists = self.ctx.bootstrap.distribution.get_distributions(self.ctx)
216+
self.assertEqual(dists[0], expected_dist)

0 commit comments

Comments
 (0)