mirror of
https://gitlab.com/fdroid/fdroidserver.git
synced 2024-11-20 13:50:12 +01:00
1153ac24fd
Python provides us a lovely URL parser with some level of validation built in. The parsed URL is then much easier to validate.
144 lines
6.2 KiB
Python
Executable File
144 lines
6.2 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 requests
|
|
import shutil
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
from unittest import mock
|
|
|
|
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
|
|
# work around the syntax error from: import fdroidserver.import
|
|
import import_proxy
|
|
|
|
|
|
class ImportTest(unittest.TestCase):
|
|
'''fdroid import'''
|
|
|
|
def setUp(self):
|
|
logging.basicConfig(level=logging.DEBUG)
|
|
self.basedir = os.path.join(localmodule, 'tests')
|
|
self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles'))
|
|
if not os.path.exists(self.tmpdir):
|
|
os.makedirs(self.tmpdir)
|
|
os.chdir(self.basedir)
|
|
|
|
def test_import_gitlab(self):
|
|
# FDroidPopen needs some config to work
|
|
config = dict()
|
|
fdroidserver.common.fill_config_defaults(config)
|
|
fdroidserver.common.config = config
|
|
|
|
url = 'https://gitlab.com/fdroid/ci-test-app'
|
|
r = requests.head(url)
|
|
if r.status_code != 200:
|
|
print("ERROR", url, 'unreachable (', r.status_code, ')')
|
|
print('Skipping ImportTest!')
|
|
return
|
|
|
|
app = import_proxy.get_app_from_url(url)
|
|
import_proxy.clone_to_tmp_dir(app)
|
|
self.assertEqual(app.RepoType, 'git')
|
|
self.assertEqual(app.Repo, 'https://gitlab.com/fdroid/ci-test-app.git')
|
|
|
|
def test_get_all_gradle_and_manifests(self):
|
|
a = import_proxy.get_all_gradle_and_manifests(os.path.join('source-files', 'cn.wildfirechat.chat'))
|
|
paths = [
|
|
os.path.join('source-files', 'cn.wildfirechat.chat', 'avenginekit', 'build.gradle'),
|
|
os.path.join('source-files', 'cn.wildfirechat.chat', 'build.gradle'),
|
|
os.path.join('source-files', 'cn.wildfirechat.chat', 'chat', 'build.gradle'),
|
|
os.path.join('source-files', 'cn.wildfirechat.chat', 'client', 'build.gradle'),
|
|
os.path.join('source-files', 'cn.wildfirechat.chat', 'client', 'src', 'main', 'AndroidManifest.xml'),
|
|
os.path.join('source-files', 'cn.wildfirechat.chat', 'emojilibrary', 'build.gradle'),
|
|
os.path.join('source-files', 'cn.wildfirechat.chat', 'gradle', 'build_libraries.gradle'),
|
|
os.path.join('source-files', 'cn.wildfirechat.chat', 'imagepicker', 'build.gradle'),
|
|
os.path.join('source-files', 'cn.wildfirechat.chat', 'mars-core-release', 'build.gradle'),
|
|
os.path.join('source-files', 'cn.wildfirechat.chat', 'push', 'build.gradle'),
|
|
os.path.join('source-files', 'cn.wildfirechat.chat', 'settings.gradle'),
|
|
]
|
|
self.assertEqual(sorted(paths), sorted(a))
|
|
|
|
def test_get_gradle_subdir(self):
|
|
subdirs = {
|
|
'cn.wildfirechat.chat': 'chat',
|
|
'com.anpmech.launcher': 'app',
|
|
'org.tasks': 'app',
|
|
'ut.ewh.audiometrytest': 'app',
|
|
}
|
|
for f in ('cn.wildfirechat.chat', 'com.anpmech.launcher', 'org.tasks', 'ut.ewh.audiometrytest'):
|
|
build_dir = os.path.join('source-files', f)
|
|
paths = import_proxy.get_all_gradle_and_manifests(build_dir)
|
|
logging.info(paths)
|
|
subdir = import_proxy.get_gradle_subdir(build_dir, paths)
|
|
self.assertEqual(subdirs[f], subdir)
|
|
|
|
def test_bad_urls(self):
|
|
for url in ('asdf',
|
|
'file://thing.git',
|
|
'https:///github.com/my/project',
|
|
'git:///so/many/slashes',
|
|
'ssh:/notabug.org/missing/a/slash',
|
|
'git:notabug.org/missing/some/slashes',
|
|
'https//github.com/bar/baz'):
|
|
with self.assertRaises(ValueError):
|
|
import_proxy.get_app_from_url(url)
|
|
|
|
def test_get_app_from_url(self):
|
|
testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir)
|
|
os.chdir(testdir)
|
|
os.mkdir(os.path.join(testdir, 'tmp'))
|
|
tmp_importer = os.path.join(testdir, 'tmp', 'importer')
|
|
data = (
|
|
('cn.wildfirechat.chat', 'https://github.com/wildfirechat/android-chat', '0.6.9', '23'),
|
|
('com.anpmech.launcher', 'https://github.com/KeikaiLauncher/KeikaiLauncher', 'Unknown', None),
|
|
('ut.ewh.audiometrytest', 'https://github.com/ReeceStevens/ut_ewh_audiometer_2014', '1.65', '14'),
|
|
)
|
|
for appid, url, vn, vc in data:
|
|
shutil.rmtree(tmp_importer, ignore_errors=True)
|
|
shutil.copytree(os.path.join(self.basedir, 'source-files', appid),
|
|
tmp_importer)
|
|
|
|
app = import_proxy.get_app_from_url(url)
|
|
with mock.patch('fdroidserver.common.getvcs',
|
|
lambda a, b, c: fdroidserver.common.vcs(url, testdir)):
|
|
with mock.patch('fdroidserver.common.vcs.gotorevision',
|
|
lambda s, rev: None):
|
|
with mock.patch('shutil.rmtree', lambda a: None):
|
|
build_dir = import_proxy.clone_to_tmp_dir(app)
|
|
self.assertEqual('git', app.RepoType)
|
|
self.assertEqual(url, app.Repo)
|
|
self.assertEqual(url, app.SourceCode)
|
|
logging.info(build_dir)
|
|
paths = import_proxy.get_all_gradle_and_manifests(build_dir)
|
|
self.assertNotEqual(paths, [])
|
|
versionName, versionCode, package = fdroidserver.common.parse_androidmanifests(paths, app)
|
|
self.assertEqual(vn, versionName)
|
|
self.assertEqual(vc, versionCode)
|
|
self.assertEqual(appid, package)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
os.chdir(os.path.dirname(__file__))
|
|
|
|
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(ImportTest))
|
|
unittest.main(failfast=False)
|