"""frame_apk against a small APK built here: binary manifest plus resource table.""" import io import os import struct import sys import tempfile import unittest import zipfile sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'ui')) import frame_apk # noqa: E402 def pool(strings, utf8=False): """A ResStringPool chunk.""" data, offsets = b'', [] for s in strings: offsets.append(len(data)) if utf8: b = s.encode() data += bytes([len(s), len(b)]) + b + b'\0' else: data += struct.pack('.""" strings = ['label', 'icon', 'versionName', 'minSdkVersion', 'package', 'manifest', 'uses-sdk', 'application', package] resmap = struct.pack('<4I', 0x01010001, 0x01010002, 0x0101021c, 0x0101020c) resmap = struct.pack('', 'lib/arm64-v8a/libx.so': b'', 'lib/x86_64/libx.so': b'', })) self.assertEqual(info['package'], 'com.example.demo') self.assertEqual(info['label'], 'App label') # the default, not French self.assertEqual(info['version'], '2.1') self.assertEqual(info['min_sdk'], 26) self.assertEqual(info['abis'], ['arm64-v8a', 'x86_64']) self.assertEqual(info['icon_png'], b'hi') # largest-density PNG, skipping the XML icon def test_missing_label_falls_back_to_package(self): info = self.read(apk({'AndroidManifest.xml': manifest('com.example.bare', 0x7f010000, 0x7f010001, 21)})) self.assertEqual(info['label'], 'com.example.bare') self.assertEqual(info['version'], '') self.assertEqual(info['abis'], []) def test_rejects_non_apks(self): for data in (b'not a zip', apk({'classes.dex': b''}), apk({'AndroidManifest.xml': b''})): with self.assertRaises(frame_apk.ApkError): self.read(data) if __name__ == '__main__': unittest.main()