-
Notifications
You must be signed in to change notification settings - Fork 70
Expand file tree
/
Copy pathtest_app_manager.py
More file actions
122 lines (98 loc) · 3.76 KB
/
test_app_manager.py
File metadata and controls
122 lines (98 loc) · 3.76 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
import os
import shutil
import unittest
from mpos import AppManager
class TestAppManagerInstallMpk(unittest.TestCase):
APP_FULLNAME = "com.micropythonos.ziptest"
APP_ROOT = f"apps/{APP_FULLNAME}"
TEMP_MPK = "data/tmp_ziptest_Xr0.mpk"
def setUp(self):
self.dest_folder = self.APP_ROOT
self.temp_mpk = self.TEMP_MPK
self._remove_path(self.dest_folder)
self._remove_path(self.temp_mpk)
try:
os.stat("data")
except OSError:
os.mkdir("data")
def tearDown(self):
self._remove_path(self.dest_folder)
self._remove_path(self.temp_mpk)
def _remove_path(self, path):
try:
st = os.stat(path)
except OSError:
return
if st[0] & 0x4000:
shutil.rmtree(path)
else:
os.remove(path)
def _copy_file(self, source, dest):
with open(source, "rb") as source_file:
with open(dest, "wb") as dest_file:
while True:
chunk = source_file.read(1024)
if not chunk:
break
dest_file.write(chunk)
def _exists(self, path):
try:
os.stat(path)
return True
except OSError:
return False
def _assert_dir(self, path):
st = os.stat(path)
self.assertTrue(st[0] & 0x4000)
def _assert_file_size(self, path, expected_size):
st = os.stat(path)
self.assertTrue(st[0] & 0x8000)
self.assertEqual(st[6], expected_size)
def _assert_app_tree(self, root):
self._assert_dir(root)
self._assert_dir(f"{root}/assets")
self._assert_dir(f"{root}/META-INF")
self._assert_dir(f"{root}/res")
self._assert_dir(f"{root}/res/mipmap-mdpi")
self._assert_file_size(
f"{root}/assets/hello.py",
232,
)
self._assert_file_size(
f"{root}/META-INF/MANIFEST.JSON",
406,
)
self._assert_file_size(
f"{root}/res/mipmap-mdpi/icon_64x64.png",
5499,
)
def test_install_mpk_extracts_files(self):
# Uncompressed and without extended attributes:
source_mpk = "../tests/com.micropythonos.ziptest_Xr0.mpk"
self._copy_file(source_mpk, self.temp_mpk)
AppManager.install_mpk(self.temp_mpk, self.dest_folder)
self.assertFalse(self._exists(self.temp_mpk))
self._assert_app_tree(self.APP_ROOT)
def test_install_mpk_extracts_files_xr(self):
# Default zip (deflate.RAW)
source_mpk = "../tests/com.micropythonos.ziptest_r.mpk"
self._copy_file(source_mpk, self.temp_mpk)
AppManager.install_mpk(self.temp_mpk, self.dest_folder)
self.assertFalse(self._exists(self.temp_mpk))
self._assert_app_tree(self.APP_ROOT)
def test_install_mpk_extracts_files_topdir(self):
# Zip contains top dir
source_mpk = "../tests/com.micropythonos.ziptest_topdir.mpk"
self._copy_file(source_mpk, self.temp_mpk)
self.dest_folder = "apps/com.micropythonos.ziptest"
AppManager.install_mpk(self.temp_mpk, self.dest_folder)
self.assertFalse(self._exists(self.temp_mpk))
self._assert_app_tree(self.dest_folder)
def test_install_mpk_rejects_invalid_topdir(self):
# Zip contains top dir that does not match destination name
source_mpk = "../tests/com.micropythonos.ziptest_invalid_topdir.mpk"
self._copy_file(source_mpk, self.temp_mpk)
self.dest_folder = "apps/com.micropythonos.ziptest_invalid"
AppManager.install_mpk(self.temp_mpk, self.dest_folder)
self.assertFalse(self._exists(self.temp_mpk))
self.assertFalse(self._exists(self.dest_folder))