mirror of
https://gitlab.com/fdroid/fdroidserver.git
synced 2024-09-11 15:13:27 +02:00
This syncs up the field names between the fdroiddata .yml files, the keys used in the implementation in fdroidserver, the index data format, and the final data structures in fdroidclient. This makes it easier for devs to follow, and makes the Jackson parsing library automatically handle converting the data from the index file to Java instances. This bumps the metadata version since the apkcache will have to be discarded. Here are the name changes: * apkname --> apkName * id --> packageName * sha256 --> hash * version --> versionName * versioncode --> versionCode tests/repo/index.xml was changed only to bump the metadata version from 17 to 18.
143 lines
6.0 KiB
Python
Executable File
143 lines
6.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
|
|
|
|
import inspect
|
|
import logging
|
|
import optparse
|
|
import os
|
|
import sys
|
|
import unittest
|
|
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.update
|
|
from fdroidserver.common import FDroidPopen
|
|
|
|
|
|
class UpdateTest(unittest.TestCase):
|
|
'''fdroid update'''
|
|
|
|
def javagetsig(self, apkfile):
|
|
getsig_dir = os.path.join(os.path.dirname(__file__), 'getsig')
|
|
if not os.path.exists(getsig_dir + "/getsig.class"):
|
|
logging.critical("getsig.class not found. To fix: cd '%s' && ./make.sh" % getsig_dir)
|
|
sys.exit(1)
|
|
# FDroidPopen needs some config to work
|
|
config = dict()
|
|
fdroidserver.common.fill_config_defaults(config)
|
|
fdroidserver.common.config = config
|
|
p = FDroidPopen(['java', '-cp', os.path.join(os.path.dirname(__file__), 'getsig'),
|
|
'getsig', os.path.join(os.getcwd(), apkfile)])
|
|
sig = None
|
|
for line in p.output.splitlines():
|
|
if line.startswith('Result:'):
|
|
sig = line[7:].strip()
|
|
break
|
|
if p.returncode == 0:
|
|
return sig
|
|
else:
|
|
return None
|
|
|
|
def testGoodGetsig(self):
|
|
# config needed to use jarsigner and keytool
|
|
config = dict()
|
|
fdroidserver.common.fill_config_defaults(config)
|
|
fdroidserver.update.config = config
|
|
apkfile = os.path.join(os.path.dirname(__file__), 'urzip.apk')
|
|
sig = self.javagetsig(apkfile)
|
|
self.assertIsNotNone(sig, "sig is None")
|
|
pysig = fdroidserver.update.getsig(apkfile)
|
|
self.assertIsNotNone(pysig, "pysig is None")
|
|
self.assertEqual(sig, fdroidserver.update.getsig(apkfile),
|
|
"python sig not equal to java sig!")
|
|
self.assertEqual(len(sig), len(pysig),
|
|
"the length of the two sigs are different!")
|
|
try:
|
|
self.assertEqual(unhexlify(sig), unhexlify(pysig),
|
|
"the length of the two sigs are different!")
|
|
except TypeError as e:
|
|
print(e)
|
|
self.assertTrue(False, 'TypeError!')
|
|
|
|
def testBadGetsig(self):
|
|
# config needed to use jarsigner and keytool
|
|
config = dict()
|
|
fdroidserver.common.fill_config_defaults(config)
|
|
fdroidserver.update.config = config
|
|
apkfile = os.path.join(os.path.dirname(__file__), 'urzip-badsig.apk')
|
|
sig = self.javagetsig(apkfile)
|
|
self.assertIsNone(sig, "sig should be None: " + str(sig))
|
|
pysig = fdroidserver.update.getsig(apkfile)
|
|
self.assertIsNone(pysig, "python sig should be None: " + str(sig))
|
|
|
|
apkfile = os.path.join(os.path.dirname(__file__), 'urzip-badcert.apk')
|
|
sig = self.javagetsig(apkfile)
|
|
self.assertIsNone(sig, "sig should be None: " + str(sig))
|
|
pysig = fdroidserver.update.getsig(apkfile)
|
|
self.assertIsNone(pysig, "python sig should be None: " + str(sig))
|
|
|
|
def testScanApksAndObbs(self):
|
|
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 = dict()
|
|
fdroidserver.common.fill_config_defaults(config)
|
|
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
|
|
|
|
apps = fdroidserver.metadata.read_metadata(xref=True)
|
|
knownapks = fdroidserver.common.KnownApks()
|
|
apks, cachechanged = fdroidserver.update.scan_apks({}, 'repo', knownapks, False)
|
|
self.assertEqual(len(apks), 6)
|
|
apk = apks[0]
|
|
self.assertEqual(apk['minSdkVersion'], '4')
|
|
self.assertEqual(apk['targetSdkVersion'], '18')
|
|
self.assertFalse('maxSdkVersion' in apk)
|
|
|
|
fdroidserver.update.insert_obbs('repo', apps, apks)
|
|
for apk in apks:
|
|
if apk['packageName'] == 'obb.mainpatch.current':
|
|
self.assertEqual(apk.get('obbMainFile'), 'main.1619.obb.mainpatch.current.obb')
|
|
self.assertEqual(apk.get('obbPatchFile'), 'patch.1619.obb.mainpatch.current.obb')
|
|
elif apk['packageName'] == 'obb.main.oldversion':
|
|
self.assertEqual(apk.get('obbMainFile'), 'main.1434483388.obb.main.oldversion.obb')
|
|
self.assertIsNone(apk.get('obbPatchFile'))
|
|
elif apk['packageName'] == 'obb.main.twoversions':
|
|
self.assertIsNone(apk.get('obbPatchFile'))
|
|
if apk['versionCode'] == 1101613:
|
|
self.assertEqual(apk.get('obbMainFile'), 'main.1101613.obb.main.twoversions.obb')
|
|
elif apk['versionCode'] == 1101615:
|
|
self.assertEqual(apk.get('obbMainFile'), 'main.1101615.obb.main.twoversions.obb')
|
|
elif apk['versionCode'] == 1101617:
|
|
self.assertEqual(apk.get('obbMainFile'), 'main.1101615.obb.main.twoversions.obb')
|
|
else:
|
|
self.assertTrue(False)
|
|
elif apk['packageName'] == 'info.guardianproject.urzip':
|
|
self.assertIsNone(apk.get('obbMainFile'))
|
|
self.assertIsNone(apk.get('obbPatchFile'))
|
|
|
|
|
|
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()
|