mirror of
https://github.com/f-droid/fdroidserver.git
synced 2025-11-18 05:00:29 +03:00
use androguard if aapt isn't found
This commit is contained in:
parent
9607cdb621
commit
06598ae406
8 changed files with 490 additions and 111 deletions
92
tests/androguard_test.py
Normal file
92
tests/androguard_test.py
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import inspect
|
||||
import logging
|
||||
import optparse
|
||||
import os
|
||||
import shutil
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
import yaml
|
||||
from binascii import unhexlify
|
||||
|
||||
localmodule = os.path.realpath(
|
||||
os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..'))
|
||||
print('localmodule: ' + localmodule)
|
||||
if localmodule not in sys.path:
|
||||
sys.path.insert(0, localmodule)
|
||||
|
||||
import fdroidserver.common
|
||||
import fdroidserver.metadata
|
||||
import fdroidserver.update
|
||||
|
||||
|
||||
class UpdateTest(unittest.TestCase):
|
||||
'''fdroid androguard manual tests'''
|
||||
|
||||
def testScanMetadataAndroguardAAPT(self):
|
||||
|
||||
def _create_apkmetadata_object(apkName):
|
||||
'''Create an empty apk metadata object'''
|
||||
apk = {}
|
||||
apk['apkName'] = apkName
|
||||
apk['uses-permission'] = []
|
||||
apk['uses-permission-sdk-23'] = []
|
||||
apk['features'] = []
|
||||
apk['icons_src'] = {}
|
||||
return apk
|
||||
|
||||
config = dict()
|
||||
fdroidserver.common.fill_config_defaults(config)
|
||||
fdroidserver.update.config = config
|
||||
os.chdir(os.path.dirname(__file__))
|
||||
if os.path.basename(os.getcwd()) != 'tests':
|
||||
raise Exception('This test must be run in the "tests/" subdir')
|
||||
|
||||
config['ndk_paths'] = dict()
|
||||
config['accepted_formats'] = ['json', 'txt', 'yml']
|
||||
fdroidserver.common.config = config
|
||||
fdroidserver.update.config = config
|
||||
|
||||
fdroidserver.update.options = type('', (), {})()
|
||||
fdroidserver.update.options.clean = True
|
||||
fdroidserver.update.options.delete_unknown = True
|
||||
|
||||
self.assertTrue(fdroidserver.common.set_command_in_config('aapt'))
|
||||
try:
|
||||
from androguard.core.bytecodes.apk import APK
|
||||
except ImportError:
|
||||
raise Exception("androguard not installed!")
|
||||
|
||||
apkList = ['../info.guardianproject.urzip.apk', '../org.dyndns.fules.ck_20.apk']
|
||||
|
||||
for apkName in apkList:
|
||||
logging.debug("Processing " + apkName)
|
||||
apkfile = os.path.join('repo', apkName)
|
||||
|
||||
apkaapt = _create_apkmetadata_object(apkName)
|
||||
logging.debug("Using AAPT for metadata")
|
||||
fdroidserver.update.scan_apk_aapt(apkaapt, apkfile)
|
||||
# avoid AAPT application name bug
|
||||
del apkaapt['name']
|
||||
|
||||
apkandroguard = _create_apkmetadata_object(apkName)
|
||||
logging.debug("Using androguard for metadata")
|
||||
fdroidserver.update.scan_apk_androguard(apkandroguard, apkfile)
|
||||
# avoid AAPT application name bug
|
||||
del apkandroguard['name']
|
||||
|
||||
self.maxDiff = None
|
||||
self.assertEqual(apkaapt, apkandroguard)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = optparse.OptionParser()
|
||||
parser.add_option("-v", "--verbose", action="store_true", default=False,
|
||||
help="Spew out even more information than normal")
|
||||
(fdroidserver.common.options, args) = parser.parse_args(['--verbose'])
|
||||
|
||||
newSuite = unittest.TestSuite()
|
||||
newSuite.addTest(unittest.makeSuite(UpdateTest))
|
||||
unittest.main()
|
||||
20
tests/metadata/apk/info.guardianproject.urzip.yaml
Normal file
20
tests/metadata/apk/info.guardianproject.urzip.yaml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
antiFeatures: !!set {}
|
||||
features: []
|
||||
hash: abfb3adb7496611749e7abfb014c5c789e3a02489e48a5c3665110d1b1acd931
|
||||
hashType: sha256
|
||||
icon: info.guardianproject.urzip.100.png
|
||||
icons:
|
||||
'0': info.guardianproject.urzip.100.png
|
||||
'160': info.guardianproject.urzip.100.png
|
||||
icons_src:
|
||||
'-1': res/drawable/ic_launcher.png
|
||||
'160': res/drawable/ic_launcher.png
|
||||
minSdkVersion: '4'
|
||||
packageName: info.guardianproject.urzip
|
||||
sig: e0ecb5fc2d63088e4a07ae410a127722
|
||||
size: 9969
|
||||
targetSdkVersion: '18'
|
||||
uses-permission: []
|
||||
uses-permission-sdk-23: []
|
||||
versionCode: 100
|
||||
versionName: '0.1'
|
||||
41
tests/metadata/apk/org.dyndns.fules.ck.yaml
Normal file
41
tests/metadata/apk/org.dyndns.fules.ck.yaml
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
antiFeatures: !!set {}
|
||||
features: []
|
||||
hash: 897486e1f857c6c0ee32ccbad0e1b8cd82f6d0e65a44a23f13f852d2b63a18c8
|
||||
hashType: sha256
|
||||
icon: org.dyndns.fules.ck.20.png
|
||||
icons:
|
||||
'0': org.dyndns.fules.ck.20.png
|
||||
'120': org.dyndns.fules.ck.20.png
|
||||
'160': org.dyndns.fules.ck.20.png
|
||||
'240': org.dyndns.fules.ck.20.png
|
||||
icons_src:
|
||||
'-1': res/drawable-mdpi-v4/icon_launcher.png
|
||||
'120': res/drawable-ldpi-v4/icon_launcher.png
|
||||
'160': res/drawable-mdpi-v4/icon_launcher.png
|
||||
'240': res/drawable-hdpi-v4/icon_launcher.png
|
||||
minSdkVersion: '7'
|
||||
nativecode:
|
||||
- arm64-v8a
|
||||
- armeabi
|
||||
- armeabi-v7a
|
||||
- mips
|
||||
- mips64
|
||||
- x86
|
||||
- x86_64
|
||||
packageName: org.dyndns.fules.ck
|
||||
sig: 9bf7a6a67f95688daec75eab4b1436ac
|
||||
size: 132453
|
||||
targetSdkVersion: '8'
|
||||
uses-permission:
|
||||
- !!python/object/new:fdroidserver.update.UsesPermission
|
||||
- android.permission.BIND_INPUT_METHOD
|
||||
- null
|
||||
- !!python/object/new:fdroidserver.update.UsesPermission
|
||||
- android.permission.READ_EXTERNAL_STORAGE
|
||||
- null
|
||||
- !!python/object/new:fdroidserver.update.UsesPermission
|
||||
- android.permission.VIBRATE
|
||||
- null
|
||||
uses-permission-sdk-23: []
|
||||
versionCode: 20
|
||||
versionName: v1.6pre2
|
||||
BIN
tests/org.dyndns.fules.ck_20.apk
Normal file
BIN
tests/org.dyndns.fules.ck_20.apk
Normal file
Binary file not shown.
|
|
@ -224,6 +224,54 @@ class UpdateTest(unittest.TestCase):
|
|||
self.assertIsNone(apk.get('obbMainFile'))
|
||||
self.assertIsNone(apk.get('obbPatchFile'))
|
||||
|
||||
def testScanApkMetadata(self):
|
||||
|
||||
def _build_yaml_representer(dumper, data):
|
||||
'''Creates a YAML representation of a Build instance'''
|
||||
return dumper.represent_dict(data)
|
||||
|
||||
config = dict()
|
||||
fdroidserver.common.fill_config_defaults(config)
|
||||
fdroidserver.update.config = config
|
||||
os.chdir(os.path.dirname(__file__))
|
||||
if os.path.basename(os.getcwd()) != 'tests':
|
||||
raise Exception('This test must be run in the "tests/" subdir')
|
||||
|
||||
config['ndk_paths'] = dict()
|
||||
config['accepted_formats'] = ['json', 'txt', 'yml']
|
||||
fdroidserver.common.config = config
|
||||
fdroidserver.update.config = config
|
||||
|
||||
fdroidserver.update.options = type('', (), {})()
|
||||
fdroidserver.update.options.clean = True
|
||||
fdroidserver.update.options.delete_unknown = True
|
||||
|
||||
for icon_dir in fdroidserver.update.get_all_icon_dirs('repo'):
|
||||
if not os.path.exists(icon_dir):
|
||||
os.makedirs(icon_dir)
|
||||
|
||||
knownapks = fdroidserver.common.KnownApks()
|
||||
apkList = ['../urzip.apk', '../org.dyndns.fules.ck_20.apk']
|
||||
|
||||
for apkName in apkList:
|
||||
_, apk, cachechanged = fdroidserver.update.scan_apk({}, apkName, 'repo', knownapks, False)
|
||||
# Don't care about the date added to the repo and relative apkName
|
||||
del apk['added']
|
||||
del apk['apkName']
|
||||
# avoid AAPT application name bug
|
||||
del apk['name']
|
||||
|
||||
savepath = os.path.join('metadata', 'apk', apk['packageName'] + '.yaml')
|
||||
# Uncomment to save APK metadata
|
||||
# with open(savepath, 'w') as f:
|
||||
# yaml.add_representer(fdroidserver.metadata.Build, _build_yaml_representer)
|
||||
# yaml.dump(apk, f, default_flow_style=False)
|
||||
|
||||
with open(savepath, 'r') as f:
|
||||
frompickle = yaml.load(f)
|
||||
self.maxDiff = None
|
||||
self.assertEqual(apk, frompickle)
|
||||
|
||||
def test_scan_invalid_apk(self):
|
||||
os.chdir(os.path.join(localmodule, 'tests'))
|
||||
if os.path.basename(os.getcwd()) != 'tests':
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue