mirror of
https://gitlab.com/fdroid/fdroidserver.git
synced 2024-11-04 14:30:11 +01:00
bf8518ee8f
This simplifies usage, goes from build['flag'] to build.flag Also makes static analyzers able to detect invalid attributes as the set is now limited in the class definition. As a bonus, setting of the default field values is now done in the constructor, not separately and manually. While at it, unify "build", "thisbuild", "info", "thisinfo", etc into just "build".
162 lines
6.5 KiB
Python
Executable File
162 lines
6.5 KiB
Python
Executable File
#!/usr/bin/env python2
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
|
|
|
|
import inspect
|
|
import optparse
|
|
import os
|
|
import re
|
|
import shutil
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
|
|
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
|
|
|
|
|
|
class CommonTest(unittest.TestCase):
|
|
'''fdroidserver/common.py'''
|
|
|
|
def _set_build_tools(self):
|
|
build_tools = os.path.join(fdroidserver.common.config['sdk_path'], 'build-tools')
|
|
if os.path.exists(build_tools):
|
|
fdroidserver.common.config['build_tools'] = ''
|
|
for f in sorted(os.listdir(build_tools), reverse=True):
|
|
versioned = os.path.join(build_tools, f)
|
|
if os.path.isdir(versioned) \
|
|
and os.path.isfile(os.path.join(versioned, 'aapt')):
|
|
fdroidserver.common.config['build_tools'] = versioned
|
|
break
|
|
return True
|
|
else:
|
|
print 'no build-tools found: ' + build_tools
|
|
return False
|
|
|
|
def _find_all(self):
|
|
for cmd in ('aapt', 'adb', 'android', 'zipalign'):
|
|
path = fdroidserver.common.find_sdk_tools_cmd(cmd)
|
|
if path is not None:
|
|
self.assertTrue(os.path.exists(path))
|
|
self.assertTrue(os.path.isfile(path))
|
|
|
|
def test_find_sdk_tools_cmd(self):
|
|
fdroidserver.common.config = dict()
|
|
# TODO add this once everything works without sdk_path set in config
|
|
# self._find_all()
|
|
sdk_path = os.getenv('ANDROID_HOME')
|
|
if os.path.exists(sdk_path):
|
|
fdroidserver.common.config['sdk_path'] = sdk_path
|
|
if os.path.exists('/usr/bin/aapt'):
|
|
# this test only works when /usr/bin/aapt is installed
|
|
self._find_all()
|
|
build_tools = os.path.join(sdk_path, 'build-tools')
|
|
if self._set_build_tools():
|
|
self._find_all()
|
|
else:
|
|
print 'no build-tools found: ' + build_tools
|
|
|
|
def testIsApkDebuggable(self):
|
|
config = dict()
|
|
config['sdk_path'] = os.getenv('ANDROID_HOME')
|
|
fdroidserver.common.config = config
|
|
self._set_build_tools()
|
|
config['aapt'] = fdroidserver.common.find_sdk_tools_cmd('aapt')
|
|
# these are set debuggable
|
|
testfiles = []
|
|
testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip.apk'))
|
|
testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-badsig.apk'))
|
|
testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-badcert.apk'))
|
|
for apkfile in testfiles:
|
|
debuggable = fdroidserver.common.isApkDebuggable(apkfile, config)
|
|
self.assertTrue(debuggable,
|
|
"debuggable APK state was not properly parsed!")
|
|
# these are set NOT debuggable
|
|
testfiles = []
|
|
testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-release.apk'))
|
|
testfiles.append(os.path.join(os.path.dirname(__file__), 'urzip-release-unsigned.apk'))
|
|
for apkfile in testfiles:
|
|
debuggable = fdroidserver.common.isApkDebuggable(apkfile, config)
|
|
self.assertFalse(debuggable,
|
|
"debuggable APK state was not properly parsed!")
|
|
|
|
def testPackageNameValidity(self):
|
|
for name in ["org.fdroid.fdroid",
|
|
"org.f_droid.fdr0ID"]:
|
|
self.assertTrue(fdroidserver.common.is_valid_package_name(name),
|
|
"{0} should be a valid package name".format(name))
|
|
for name in ["0rg.fdroid.fdroid",
|
|
".f_droid.fdr0ID",
|
|
"org.fdroid/fdroid",
|
|
"/org.fdroid.fdroid"]:
|
|
self.assertFalse(fdroidserver.common.is_valid_package_name(name),
|
|
"{0} should not be a valid package name".format(name))
|
|
|
|
def test_prepare_sources(self):
|
|
testint = 99999999
|
|
teststr = 'FAKE_STR_FOR_TESTING'
|
|
|
|
tmpdir = os.path.join(os.path.dirname(__file__), '..', '.testfiles')
|
|
if not os.path.exists(tmpdir):
|
|
os.makedirs(tmpdir)
|
|
tmptestsdir = tempfile.mkdtemp(prefix='test_prepare_sources', dir=tmpdir)
|
|
shutil.copytree(os.path.join(os.path.dirname(__file__), 'source-files'),
|
|
os.path.join(tmptestsdir, 'source-files'))
|
|
|
|
testdir = os.path.join(tmptestsdir, 'source-files', 'fdroid', 'fdroidclient')
|
|
|
|
config = dict()
|
|
config['sdk_path'] = os.getenv('ANDROID_HOME')
|
|
config['ndk_paths'] = {'r10d': os.getenv('ANDROID_NDK_HOME')}
|
|
config['build_tools'] = 'FAKE_BUILD_TOOLS_VERSION'
|
|
fdroidserver.common.config = config
|
|
app = fdroidserver.metadata.App()
|
|
app.id = 'org.fdroid.froid'
|
|
build = fdroidserver.metadata.Build()
|
|
build.commit = 'master'
|
|
build.forceversion = True
|
|
build.forcevercode = True
|
|
build.gradle = ['yes']
|
|
build.target = 'android-' + str(testint)
|
|
build.version = teststr
|
|
build.vercode = testint
|
|
|
|
class FakeVcs():
|
|
# no need to change to the correct commit here
|
|
def gotorevision(self, rev, refresh=True):
|
|
pass
|
|
|
|
# no srclib info needed, but it could be added...
|
|
def getsrclib(self):
|
|
return None
|
|
|
|
fdroidserver.common.prepare_source(FakeVcs(), app, build, testdir, testdir, testdir)
|
|
|
|
with open(os.path.join(testdir, 'build.gradle'), 'r') as f:
|
|
filedata = f.read()
|
|
self.assertIsNotNone(re.search("\s+compileSdkVersion %s\s+" % testint, filedata))
|
|
|
|
with open(os.path.join(testdir, 'AndroidManifest.xml')) as f:
|
|
filedata = f.read()
|
|
self.assertIsNone(re.search('android:debuggable', filedata))
|
|
self.assertIsNotNone(re.search('android:versionName="%s"' % build.version, filedata))
|
|
self.assertIsNotNone(re.search('android:versionCode="%s"' % build.vercode, filedata))
|
|
|
|
|
|
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(CommonTest))
|
|
unittest.main()
|