2016-01-04 21:17:58 +01:00
|
|
|
#!/usr/bin/env python3
|
2015-07-22 10:16:43 +02:00
|
|
|
|
|
|
|
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
|
|
|
|
|
2018-08-08 00:59:25 +02:00
|
|
|
import io
|
2017-11-29 22:03:26 +01:00
|
|
|
import glob
|
2015-07-22 10:16:43 +02:00
|
|
|
import inspect
|
2017-11-30 10:14:38 +01:00
|
|
|
import logging
|
2015-07-22 10:16:43 +02:00
|
|
|
import optparse
|
|
|
|
import os
|
2017-11-29 22:03:26 +01:00
|
|
|
import random
|
|
|
|
import shutil
|
2015-07-22 10:16:43 +02:00
|
|
|
import sys
|
|
|
|
import unittest
|
2016-11-23 15:14:44 +01:00
|
|
|
import yaml
|
2017-05-09 14:13:14 +02:00
|
|
|
import tempfile
|
2018-08-08 00:59:25 +02:00
|
|
|
import textwrap
|
|
|
|
from unittest import mock
|
2015-07-22 10:16:43 +02:00
|
|
|
|
|
|
|
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)
|
|
|
|
|
2019-12-13 23:51:18 +01:00
|
|
|
from testcommon import TmpCwd
|
|
|
|
|
2015-07-22 10:16:43 +02:00
|
|
|
import fdroidserver.common
|
|
|
|
import fdroidserver.metadata
|
2018-08-08 00:59:25 +02:00
|
|
|
from fdroidserver.exception import MetaDataException
|
2015-07-22 10:16:43 +02:00
|
|
|
|
|
|
|
|
|
|
|
class MetadataTest(unittest.TestCase):
|
|
|
|
'''fdroidserver/metadata.py'''
|
|
|
|
|
2017-11-30 10:14:38 +01:00
|
|
|
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)
|
|
|
|
|
2019-05-10 12:02:13 +02:00
|
|
|
def test_FieldValidator_BitcoinAddress(self):
|
2019-05-07 22:43:05 +02:00
|
|
|
validator = None
|
|
|
|
for vali in fdroidserver.metadata.valuetypes:
|
|
|
|
if vali.name == 'Bitcoin address':
|
|
|
|
validator = vali
|
|
|
|
break
|
|
|
|
self.assertIsNotNone(validator, "could not find 'Bitcoin address' validator")
|
|
|
|
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
|
|
|
|
# some valid addresses (P2PKH, P2SH, Bech32)
|
|
|
|
self.assertIsNone(validator.check('1BrrrrErsrWetrTrnrrrrm4GFg7xJaNVN2', 'fake.app.id'))
|
|
|
|
self.assertIsNone(validator.check('3JrrrrWrEZr3rNrrvrecrnyirrnqRhWNLy', 'fake.app.id'))
|
|
|
|
self.assertIsNone(validator.check('bc1qar0srrr7xrkvr5lr43lrdnwrre5rgtrzrf5rrq', 'fake.app.id'))
|
|
|
|
|
2019-05-10 12:02:13 +02:00
|
|
|
# some invalid addresses
|
2019-05-07 22:43:05 +02:00
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
2019-05-10 12:02:13 +02:00
|
|
|
'21BvMrSYsrWrtrrlL5A10mlGFr7rrarrN2', 'fake.app.id')
|
2019-05-07 22:43:05 +02:00
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
|
|
|
'5Hrgr3ur5rGLrfKrrrrrrHSrqJrroGrrzrQrrrrrrLNrsrDrrrA', 'fake.app.id')
|
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
|
|
|
'92rr46rUrgTrrromrVrirW6r1rrrdrerrdbJrrrhrCsYrrrrrrc', 'fake.app.id')
|
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
|
|
|
'K1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id')
|
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
|
|
|
'L1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id')
|
2019-05-10 12:02:13 +02:00
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
|
|
|
'tb1qw5r8drrejxrrg4y5rrrrrraryrrrrwrkxrjrsx', 'fake.app.id')
|
|
|
|
|
|
|
|
def test_FieldValidator_LitecoinAddress(self):
|
|
|
|
validator = None
|
|
|
|
for vali in fdroidserver.metadata.valuetypes:
|
|
|
|
if vali.name == 'Litecoin address':
|
|
|
|
validator = vali
|
|
|
|
break
|
|
|
|
self.assertIsNotNone(validator, "could not find 'Litecoin address' validator")
|
|
|
|
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
|
|
|
|
# some valid addresses (L, M, 3)
|
|
|
|
self.assertIsNone(validator.check('LgeGrrrrJAxyXprrPrrBrrX5Qrrrrrrrrd', 'fake.app.id'))
|
|
|
|
self.assertIsNone(validator.check('MrrrrrrrJAxyXpanPtrrRAX5QHxvUJo8id', 'fake.app.id'))
|
|
|
|
self.assertIsNone(validator.check('3rereVr9rAryrranrrrrrAXrrHx', 'fake.app.id'))
|
|
|
|
|
|
|
|
# some invalid addresses (various special use/testnet addresses, invalid chars)
|
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
|
|
|
'21BvMrSYsrWrtrrrn5Au4l4GFr7rrarrN2', 'fake.app.id')
|
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
|
|
|
'5Hrgr3ur5rGLrfKrrrrrr1SrqJrroGrrzrQrrrrrrLNrsrDrrrA', 'fake.app.id')
|
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
|
|
|
'92rr46rUrgTrrromrVrirW6r1rrrdrerrdbJrrrhrCsYrrrrrrc', 'fake.app.id')
|
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
|
|
|
'K1BvMrSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id')
|
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
|
|
|
'L0000rSYsrWrtrrrn5Au4m4GFr7rrarrN2', 'fake.app.id')
|
2019-05-07 22:43:05 +02:00
|
|
|
self.assertRaises(fdroidserver.exception.MetaDataException, validator.check,
|
|
|
|
'tb1qw5r8drrejxrrg4y5rrrrrraryrrrrwrkxrjrsx', 'fake.app.id')
|
|
|
|
|
2015-07-22 10:16:43 +02:00
|
|
|
def test_read_metadata(self):
|
convert metadata.Build to a subclass of dict
Like with the App class in the commit before, this makes it a lot
easier to work with this data when converting between the internal
formats and external formats like YAML, JSON, MsgPack, protobuf, etc.
The one unfortunate thing here is Build.update. It becomes
dict.update(), which is a method not an attribute.
build.get('update') or build['update'] could be used, but that would
be oddly inconsistent. So instead the field is renamed to
'androidupdate', except for in the .txt v0 metadata files. This better
describes what field does anyway, since it runs `android update`.
Build.update is only referenced in two places right next to each other
for the ant builds, so this change still seems worthwhile.
2016-11-29 13:26:32 +01:00
|
|
|
|
|
|
|
def _build_yaml_representer(dumper, data):
|
|
|
|
'''Creates a YAML representation of a Build instance'''
|
|
|
|
return dumper.represent_dict(data)
|
|
|
|
|
2015-07-22 10:16:43 +02:00
|
|
|
self.maxDiff = None
|
|
|
|
|
2015-08-27 11:43:17 +02:00
|
|
|
# these need to be set to prevent code running on None, only
|
|
|
|
# 'accepted_formats' is actually used in metadata.py
|
2015-07-22 10:16:43 +02:00
|
|
|
config = dict()
|
|
|
|
config['sdk_path'] = '/opt/android-sdk'
|
|
|
|
config['ndk_paths'] = dict()
|
2016-11-23 15:01:23 +01:00
|
|
|
config['accepted_formats'] = ['json', 'txt', 'yml']
|
2015-07-22 10:16:43 +02:00
|
|
|
fdroidserver.common.config = config
|
2019-05-07 22:43:05 +02:00
|
|
|
fdroidserver.metadata.warnings_action = None
|
2015-07-22 10:16:43 +02:00
|
|
|
|
|
|
|
apps = fdroidserver.metadata.read_metadata(xref=True)
|
2017-06-27 23:55:38 +02:00
|
|
|
for appid in ('org.smssecure.smssecure', 'org.adaway',
|
|
|
|
'org.videolan.vlc', 'com.politedroid'):
|
2016-11-23 15:14:44 +01:00
|
|
|
savepath = os.path.join('metadata', 'dump', appid + '.yaml')
|
2016-11-23 17:25:59 +01:00
|
|
|
frommeta = dict(apps[appid])
|
2015-11-28 13:09:47 +01:00
|
|
|
self.assertTrue(appid in apps)
|
2016-11-23 15:14:44 +01:00
|
|
|
with open(savepath, 'r') as f:
|
|
|
|
frompickle = yaml.load(f)
|
2016-06-10 12:02:03 +02:00
|
|
|
self.assertEqual(frommeta, frompickle)
|
2017-06-27 23:55:38 +02:00
|
|
|
# comment above assert and uncomment below to update test
|
|
|
|
# files when new metadata fields are added
|
2016-11-23 15:14:44 +01:00
|
|
|
# with open(savepath, 'w') as f:
|
convert metadata.Build to a subclass of dict
Like with the App class in the commit before, this makes it a lot
easier to work with this data when converting between the internal
formats and external formats like YAML, JSON, MsgPack, protobuf, etc.
The one unfortunate thing here is Build.update. It becomes
dict.update(), which is a method not an attribute.
build.get('update') or build['update'] could be used, but that would
be oddly inconsistent. So instead the field is renamed to
'androidupdate', except for in the .txt v0 metadata files. This better
describes what field does anyway, since it runs `android update`.
Build.update is only referenced in two places right next to each other
for the ant builds, so this change still seems worthwhile.
2016-11-29 13:26:32 +01:00
|
|
|
# yaml.add_representer(fdroidserver.metadata.Build, _build_yaml_representer)
|
2016-11-23 15:14:44 +01:00
|
|
|
# yaml.dump(frommeta, f, default_flow_style=False)
|
2015-07-22 10:16:43 +02:00
|
|
|
|
2017-05-09 14:13:14 +02:00
|
|
|
def test_rewrite_yaml_fakeotaupdate(self):
|
2017-11-30 10:14:38 +01:00
|
|
|
testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir)
|
2017-05-09 14:13:14 +02:00
|
|
|
fdroidserver.common.config = {'accepted_formats': ['txt', 'yml']}
|
2019-05-07 22:43:05 +02:00
|
|
|
fdroidserver.metadata.warnings_action = None
|
2017-05-09 14:13:14 +02:00
|
|
|
|
|
|
|
# rewrite metadata
|
|
|
|
allapps = fdroidserver.metadata.read_metadata(xref=True)
|
|
|
|
for appid, app in allapps.items():
|
|
|
|
if appid == 'fake.ota.update':
|
|
|
|
fdroidserver.metadata.write_metadata(os.path.join(testdir, appid + '.yml'), app)
|
|
|
|
|
|
|
|
# assert rewrite result
|
2018-10-19 15:01:34 +02:00
|
|
|
with open(os.path.join(testdir, 'fake.ota.update.yml'), 'r') as result:
|
|
|
|
with open('metadata-rewrite-yml/fake.ota.update.yml', 'r') as orig:
|
2017-05-09 14:13:14 +02:00
|
|
|
self.maxDiff = None
|
|
|
|
self.assertEqual(result.read(), orig.read())
|
|
|
|
|
|
|
|
def test_rewrite_yaml_fdroidclient(self):
|
2017-11-30 10:14:38 +01:00
|
|
|
testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir)
|
2017-05-09 14:13:14 +02:00
|
|
|
fdroidserver.common.config = {'accepted_formats': ['txt', 'yml']}
|
|
|
|
|
|
|
|
# rewrite metadata
|
|
|
|
allapps = fdroidserver.metadata.read_metadata(xref=True)
|
|
|
|
for appid, app in allapps.items():
|
|
|
|
if appid == 'org.fdroid.fdroid':
|
|
|
|
fdroidserver.metadata.write_metadata(os.path.join(testdir, appid + '.yml'), app)
|
|
|
|
|
|
|
|
# assert rewrite result
|
2018-10-19 15:01:34 +02:00
|
|
|
with open(os.path.join(testdir, 'org.fdroid.fdroid.yml'), 'r') as result:
|
|
|
|
with open('metadata-rewrite-yml/org.fdroid.fdroid.yml', 'r') as orig:
|
2017-05-09 14:13:14 +02:00
|
|
|
self.maxDiff = None
|
|
|
|
self.assertEqual(result.read(), orig.read())
|
|
|
|
|
|
|
|
def test_rewrite_yaml_special_build_params(self):
|
2017-11-30 10:14:38 +01:00
|
|
|
testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir)
|
2017-05-09 14:13:14 +02:00
|
|
|
fdroidserver.common.config = {'accepted_formats': ['txt', 'yml']}
|
|
|
|
|
|
|
|
# rewrite metadata
|
|
|
|
allapps = fdroidserver.metadata.read_metadata(xref=True)
|
|
|
|
for appid, app in allapps.items():
|
|
|
|
if appid == 'app.with.special.build.params':
|
|
|
|
fdroidserver.metadata.write_metadata(os.path.join(testdir, appid + '.yml'), app)
|
|
|
|
|
|
|
|
# assert rewrite result
|
2018-10-19 15:01:34 +02:00
|
|
|
with open(os.path.join(testdir, 'app.with.special.build.params.yml'), 'r') as result:
|
|
|
|
with open('metadata-rewrite-yml/app.with.special.build.params.yml', 'r') as orig:
|
2017-05-09 14:13:14 +02:00
|
|
|
self.maxDiff = None
|
|
|
|
self.assertEqual(result.read(), orig.read())
|
|
|
|
|
2017-11-29 22:03:26 +01:00
|
|
|
def test_read_metadata_sort_by_time(self):
|
2017-11-30 10:14:38 +01:00
|
|
|
testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir)
|
2017-11-29 22:03:26 +01:00
|
|
|
metadatadir = os.path.join(testdir, 'metadata')
|
|
|
|
os.makedirs(metadatadir)
|
|
|
|
fdroidserver.common.config = {'accepted_formats': ['txt']}
|
|
|
|
|
|
|
|
randomlist = []
|
2017-11-30 10:14:38 +01:00
|
|
|
randomapps = glob.glob(os.path.join(self.basedir, 'metadata', '*.txt'))
|
2017-11-29 22:03:26 +01:00
|
|
|
random.shuffle(randomapps)
|
|
|
|
i = 1
|
|
|
|
for f in randomapps:
|
|
|
|
shutil.copy(f, metadatadir)
|
|
|
|
new = os.path.join(metadatadir, os.path.basename(f))
|
|
|
|
stat = os.stat(new)
|
|
|
|
os.utime(new, (stat.st_ctime, stat.st_mtime + i))
|
|
|
|
# prepend new item so newest is always first
|
|
|
|
randomlist = [os.path.basename(f)[:-4]] + randomlist
|
|
|
|
i += 1
|
|
|
|
os.chdir(testdir)
|
|
|
|
allapps = fdroidserver.metadata.read_metadata(xref=True, sort_by_time=True)
|
|
|
|
allappids = []
|
|
|
|
for appid, app in allapps.items():
|
|
|
|
allappids.append(appid)
|
|
|
|
self.assertEqual(randomlist, allappids)
|
|
|
|
|
2018-08-08 00:59:25 +02:00
|
|
|
def test_parse_yaml_metadata_unknown_app_field(self):
|
|
|
|
mf = io.StringIO(textwrap.dedent("""\
|
|
|
|
AutoName: F-Droid
|
|
|
|
RepoType: git
|
|
|
|
Builds: []
|
|
|
|
bad: value"""))
|
2018-08-08 02:18:19 +02:00
|
|
|
mf.name = 'mock_filename.yaml'
|
2018-08-08 00:59:25 +02:00
|
|
|
with mock.patch('fdroidserver.metadata.warnings_action', 'error'):
|
|
|
|
with self.assertRaises(MetaDataException):
|
|
|
|
fdroidserver.metadata.parse_yaml_metadata(mf, {})
|
|
|
|
|
|
|
|
def test_parse_yaml_metadata_unknown_build_flag(self):
|
|
|
|
mf = io.StringIO(textwrap.dedent("""\
|
|
|
|
AutoName: F-Droid
|
|
|
|
RepoType: git
|
|
|
|
Builds:
|
|
|
|
- bad: value"""))
|
2018-08-08 02:18:19 +02:00
|
|
|
mf.name = 'mock_filename.yaml'
|
2018-08-08 00:59:25 +02:00
|
|
|
with mock.patch('fdroidserver.metadata.warnings_action', 'error'):
|
|
|
|
with self.assertRaises(MetaDataException):
|
|
|
|
fdroidserver.metadata.parse_yaml_metadata(mf, {})
|
|
|
|
|
2018-10-10 15:04:45 +02:00
|
|
|
def test_write_yaml_with_placeholder_values(self):
|
2018-08-19 14:11:16 +02:00
|
|
|
mf = io.StringIO()
|
|
|
|
|
|
|
|
app = fdroidserver.metadata.App()
|
|
|
|
app.Categories = ['None']
|
|
|
|
app.SourceCode = "https://gitlab.com/fdroid/fdroidclient.git"
|
|
|
|
app.IssueTracker = "https://gitlab.com/fdroid/fdroidclient/issues"
|
|
|
|
app.RepoType = 'git'
|
|
|
|
app.Repo = 'https://gitlab.com/fdroid/fdroidclient.git'
|
|
|
|
app.AutoUpdateMode = 'None'
|
|
|
|
app.UpdateCheckMode = 'Tags'
|
|
|
|
build = fdroidserver.metadata.Build()
|
2018-10-10 15:04:45 +02:00
|
|
|
build.versionName = 'Unknown' # taken from fdroidserver/import.py
|
|
|
|
build.versionCode = '0' # taken from fdroidserver/import.py
|
2018-08-19 14:11:16 +02:00
|
|
|
build.disable = 'Generated by import.py ...'
|
|
|
|
build.commit = 'Unknown'
|
|
|
|
build.gradle = [True]
|
|
|
|
app.builds = [build]
|
|
|
|
|
2018-10-10 15:04:45 +02:00
|
|
|
fdroidserver.metadata.write_yaml(mf, app)
|
2018-08-19 14:11:16 +02:00
|
|
|
|
|
|
|
mf.seek(0)
|
|
|
|
self.assertEqual(mf.read(), textwrap.dedent("""\
|
|
|
|
Categories:
|
|
|
|
- None
|
|
|
|
License: Unknown
|
|
|
|
SourceCode: https://gitlab.com/fdroid/fdroidclient.git
|
|
|
|
IssueTracker: https://gitlab.com/fdroid/fdroidclient/issues
|
|
|
|
|
|
|
|
RepoType: git
|
|
|
|
Repo: https://gitlab.com/fdroid/fdroidclient.git
|
|
|
|
|
|
|
|
Builds:
|
|
|
|
- versionName: Unknown
|
2018-10-10 15:04:45 +02:00
|
|
|
versionCode: 0
|
2018-08-19 14:11:16 +02:00
|
|
|
disable: Generated by import.py ...
|
|
|
|
commit: Unknown
|
|
|
|
gradle:
|
|
|
|
- true
|
|
|
|
|
|
|
|
AutoUpdateMode: None
|
|
|
|
UpdateCheckMode: Tags
|
|
|
|
"""))
|
|
|
|
|
2018-08-28 10:04:05 +02:00
|
|
|
def test_parse_yaml_metadata_prebuild_list(self):
|
2018-08-28 10:16:13 +02:00
|
|
|
mf = io.StringIO(textwrap.dedent("""\
|
|
|
|
AutoName: F-Droid
|
|
|
|
RepoType: git
|
|
|
|
Builds:
|
|
|
|
- versionCode: 1
|
|
|
|
versionName: v0.1.0
|
2018-11-14 13:42:05 +01:00
|
|
|
sudo:
|
|
|
|
- apt-get update
|
|
|
|
- apt-get install -y whatever
|
|
|
|
- sed -i -e 's/<that attr="bad"/<that attr="good"/' ~/.whatever/config.xml
|
|
|
|
init:
|
|
|
|
- bash generate_some_file.sh
|
|
|
|
- sed -i -e 'g/what/ever/' /some/file
|
2018-08-28 10:16:13 +02:00
|
|
|
prebuild:
|
2018-11-14 13:42:05 +01:00
|
|
|
- npm something
|
|
|
|
- echo 'important setting' >> /a/file
|
|
|
|
build:
|
|
|
|
- ./gradlew someSpecialTask
|
|
|
|
- sed -i 'd/that wrong config/' gradle.properties
|
|
|
|
- ./gradlew compile
|
2018-08-28 10:16:13 +02:00
|
|
|
"""))
|
|
|
|
mf.name = 'mock_filename.yaml'
|
|
|
|
mf.seek(0)
|
|
|
|
result = {}
|
|
|
|
with mock.patch('fdroidserver.metadata.warnings_action', 'error'):
|
|
|
|
fdroidserver.metadata.parse_yaml_metadata(mf, result)
|
2018-11-14 13:42:05 +01:00
|
|
|
self.maxDiff = None
|
|
|
|
self.assertDictEqual(result, {'AutoName': 'F-Droid',
|
|
|
|
'RepoType': 'git',
|
|
|
|
'Builds': [{'versionCode': 1,
|
|
|
|
'versionName': 'v0.1.0',
|
|
|
|
'sudo': "apt-get update && "
|
|
|
|
"apt-get install -y whatever && "
|
|
|
|
"sed -i -e 's/<that attr=\"bad\"/<that attr=\"good\"/' ~/.whatever/config.xml",
|
|
|
|
'init': "bash generate_some_file.sh && "
|
|
|
|
"sed -i -e 'g/what/ever/' /some/file",
|
|
|
|
'prebuild': "npm something && echo 'important setting' >> /a/file",
|
|
|
|
'build': "./gradlew someSpecialTask && "
|
|
|
|
"sed -i 'd/that wrong config/' gradle.properties && "
|
|
|
|
"./gradlew compile"}]})
|
|
|
|
|
|
|
|
def test_parse_yaml_metadata_prebuild_strings(self):
|
|
|
|
mf = io.StringIO(textwrap.dedent("""\
|
|
|
|
AutoName: F-Droid
|
|
|
|
RepoType: git
|
|
|
|
Builds:
|
|
|
|
- versionCode: 1
|
|
|
|
versionName: v0.1.0
|
|
|
|
sudo: |-
|
|
|
|
apt-get update && apt-get install -y whatever && sed -i -e 's/<that attr="bad"/<that attr="good"/' ~/.whatever/config.xml
|
|
|
|
init: bash generate_some_file.sh && sed -i -e 'g/what/ever/' /some/file
|
|
|
|
prebuild: npm something && echo 'important setting' >> /a/file
|
|
|
|
build: |-
|
|
|
|
./gradlew someSpecialTask && sed -i 'd/that wrong config/' gradle.properties && ./gradlew compile
|
|
|
|
"""))
|
|
|
|
mf.name = 'mock_filename.yaml'
|
|
|
|
mf.seek(0)
|
|
|
|
result = {}
|
|
|
|
with mock.patch('fdroidserver.metadata.warnings_action', 'error'):
|
|
|
|
fdroidserver.metadata.parse_yaml_metadata(mf, result)
|
|
|
|
self.maxDiff = None
|
2018-08-28 10:16:13 +02:00
|
|
|
self.assertDictEqual(result, {'AutoName': 'F-Droid',
|
|
|
|
'RepoType': 'git',
|
|
|
|
'Builds': [{'versionCode': 1,
|
|
|
|
'versionName': 'v0.1.0',
|
2018-11-14 13:42:05 +01:00
|
|
|
'sudo': "apt-get update && "
|
|
|
|
"apt-get install -y whatever && "
|
|
|
|
"sed -i -e 's/<that attr=\"bad\"/<that attr=\"good\"/' ~/.whatever/config.xml",
|
|
|
|
'init': "bash generate_some_file.sh && "
|
|
|
|
"sed -i -e 'g/what/ever/' /some/file",
|
|
|
|
'prebuild': "npm something && echo 'important setting' >> /a/file",
|
|
|
|
'build': "./gradlew someSpecialTask && "
|
|
|
|
"sed -i 'd/that wrong config/' gradle.properties && "
|
|
|
|
"./gradlew compile"}]})
|
2018-08-28 10:16:13 +02:00
|
|
|
|
2018-08-28 10:04:05 +02:00
|
|
|
def test_parse_yaml_metadata_prebuild_string(self):
|
|
|
|
mf = io.StringIO(textwrap.dedent("""\
|
|
|
|
AutoName: F-Droid
|
|
|
|
RepoType: git
|
|
|
|
Builds:
|
|
|
|
- versionCode: 1
|
|
|
|
versionName: v0.1.0
|
|
|
|
prebuild: |-
|
|
|
|
a && b && sed -i 's,a,b,'
|
|
|
|
"""))
|
|
|
|
mf.name = 'mock_filename.yaml'
|
|
|
|
mf.seek(0)
|
|
|
|
result = {}
|
|
|
|
with mock.patch('fdroidserver.metadata.warnings_action', 'error'):
|
|
|
|
fdroidserver.metadata.parse_yaml_metadata(mf, result)
|
|
|
|
self.assertDictEqual(result, {'AutoName': 'F-Droid',
|
|
|
|
'RepoType': 'git',
|
|
|
|
'Builds': [{'versionCode': 1,
|
|
|
|
'versionName': 'v0.1.0',
|
|
|
|
'prebuild': "a && b && "
|
|
|
|
"sed -i 's,a,b,'"}]})
|
|
|
|
|
2019-07-15 15:45:02 +02:00
|
|
|
def test_parse_yaml_provides_should_be_ignored(self):
|
2019-07-11 01:46:18 +02:00
|
|
|
mf = io.StringIO(textwrap.dedent("""\
|
|
|
|
Provides: this.is.deprecated
|
|
|
|
AutoName: F-Droid
|
|
|
|
RepoType: git
|
|
|
|
Builds:
|
|
|
|
- versionCode: 1
|
|
|
|
versionName: v0.1.0
|
|
|
|
prebuild: |-
|
|
|
|
a && b && sed -i 's,a,b,'
|
|
|
|
"""))
|
|
|
|
mf.name = 'mock_filename.yaml'
|
|
|
|
mf.seek(0)
|
|
|
|
result = {}
|
|
|
|
with mock.patch('fdroidserver.metadata.warnings_action', 'error'):
|
2019-07-15 15:45:02 +02:00
|
|
|
fdroidserver.metadata.parse_yaml_metadata(mf, result)
|
|
|
|
self.assertNotIn('Provides', result)
|
|
|
|
self.assertNotIn('provides', result)
|
2019-07-11 01:46:18 +02:00
|
|
|
|
2018-11-13 19:53:15 +01:00
|
|
|
def test_write_yaml_1_line_scripts_as_string(self):
|
2018-08-28 10:16:13 +02:00
|
|
|
mf = io.StringIO()
|
|
|
|
app = fdroidserver.metadata.App()
|
2018-11-14 14:20:33 +01:00
|
|
|
app.Categories = ['None']
|
2018-08-28 10:16:13 +02:00
|
|
|
app.builds = []
|
|
|
|
build = fdroidserver.metadata.Build()
|
|
|
|
build.versionCode = 102030
|
|
|
|
build.versionName = 'v1.2.3'
|
2018-11-13 19:53:15 +01:00
|
|
|
build.sudo = "chmod +rwx /opt"
|
|
|
|
build.init = "sed -i -e 'g/what/ever/' /some/file"
|
|
|
|
build.prebuild = "sed -i 'd/that wrong config/' gradle.properties"
|
|
|
|
build.build = "./gradlew compile"
|
2018-08-28 10:16:13 +02:00
|
|
|
app.builds.append(build)
|
|
|
|
fdroidserver.metadata.write_yaml(mf, app)
|
|
|
|
mf.seek(0)
|
|
|
|
self.assertEqual(mf.read(), textwrap.dedent("""\
|
|
|
|
Categories:
|
|
|
|
- None
|
|
|
|
License: Unknown
|
|
|
|
|
|
|
|
Builds:
|
|
|
|
- versionName: v1.2.3
|
|
|
|
versionCode: 102030
|
2018-11-13 19:53:15 +01:00
|
|
|
sudo: chmod +rwx /opt
|
|
|
|
init: sed -i -e 'g/what/ever/' /some/file
|
|
|
|
prebuild: sed -i 'd/that wrong config/' gradle.properties
|
|
|
|
build: ./gradlew compile
|
|
|
|
|
|
|
|
AutoUpdateMode: None
|
|
|
|
UpdateCheckMode: None
|
|
|
|
"""))
|
|
|
|
|
|
|
|
def test_write_yaml_1_line_scripts_as_list(self):
|
|
|
|
mf = io.StringIO()
|
|
|
|
app = fdroidserver.metadata.App()
|
|
|
|
app.Categories = ['None']
|
|
|
|
app.builds = []
|
|
|
|
build = fdroidserver.metadata.Build()
|
|
|
|
build.versionCode = 102030
|
|
|
|
build.versionName = 'v1.2.3'
|
|
|
|
build.sudo = ["chmod +rwx /opt"]
|
|
|
|
build.init = ["sed -i -e 'g/what/ever/' /some/file"]
|
|
|
|
build.prebuild = ["sed -i 'd/that wrong config/' gradle.properties"]
|
|
|
|
build.build = ["./gradlew compile"]
|
|
|
|
app.builds.append(build)
|
|
|
|
fdroidserver.metadata.write_yaml(mf, app)
|
|
|
|
mf.seek(0)
|
|
|
|
self.assertEqual(mf.read(), textwrap.dedent("""\
|
|
|
|
Categories:
|
|
|
|
- None
|
|
|
|
License: Unknown
|
|
|
|
|
|
|
|
Builds:
|
|
|
|
- versionName: v1.2.3
|
|
|
|
versionCode: 102030
|
|
|
|
sudo: chmod +rwx /opt
|
|
|
|
init: sed -i -e 'g/what/ever/' /some/file
|
|
|
|
prebuild: sed -i 'd/that wrong config/' gradle.properties
|
|
|
|
build: ./gradlew compile
|
|
|
|
|
|
|
|
AutoUpdateMode: None
|
|
|
|
UpdateCheckMode: None
|
|
|
|
"""))
|
|
|
|
|
|
|
|
def test_write_yaml_multiline_scripts_from_list(self):
|
|
|
|
mf = io.StringIO()
|
|
|
|
app = fdroidserver.metadata.App()
|
|
|
|
app.Categories = ['None']
|
|
|
|
app.builds = []
|
|
|
|
build = fdroidserver.metadata.Build()
|
|
|
|
build.versionCode = 102030
|
|
|
|
build.versionName = 'v1.2.3'
|
|
|
|
build.sudo = ["apt-get update",
|
|
|
|
"apt-get install -y whatever",
|
|
|
|
"sed -i -e 's/<that attr=\"bad\"/<that attr=\"good\"/' ~/.whatever/config.xml"]
|
|
|
|
build.init = ["bash generate_some_file.sh",
|
|
|
|
"sed -i -e 'g/what/ever/' /some/file"]
|
|
|
|
build.prebuild = ["npm something",
|
|
|
|
"echo 'important setting' >> /a/file"]
|
|
|
|
build.build = ["./gradlew someSpecialTask",
|
|
|
|
"sed -i 'd/that wrong config/' gradle.properties",
|
|
|
|
"./gradlew compile"]
|
|
|
|
app.builds.append(build)
|
|
|
|
fdroidserver.metadata.write_yaml(mf, app)
|
|
|
|
mf.seek(0)
|
|
|
|
self.assertEqual(mf.read(), textwrap.dedent("""\
|
|
|
|
Categories:
|
|
|
|
- None
|
|
|
|
License: Unknown
|
|
|
|
|
|
|
|
Builds:
|
|
|
|
- versionName: v1.2.3
|
|
|
|
versionCode: 102030
|
|
|
|
sudo:
|
|
|
|
- apt-get update
|
|
|
|
- apt-get install -y whatever
|
|
|
|
- sed -i -e 's/<that attr="bad"/<that attr="good"/' ~/.whatever/config.xml
|
|
|
|
init:
|
|
|
|
- bash generate_some_file.sh
|
|
|
|
- sed -i -e 'g/what/ever/' /some/file
|
|
|
|
prebuild:
|
|
|
|
- npm something
|
|
|
|
- echo 'important setting' >> /a/file
|
|
|
|
build:
|
|
|
|
- ./gradlew someSpecialTask
|
|
|
|
- sed -i 'd/that wrong config/' gradle.properties
|
|
|
|
- ./gradlew compile
|
|
|
|
|
|
|
|
AutoUpdateMode: None
|
|
|
|
UpdateCheckMode: None
|
|
|
|
"""))
|
|
|
|
|
|
|
|
def test_write_yaml_multiline_scripts_from_string(self):
|
|
|
|
mf = io.StringIO()
|
|
|
|
app = fdroidserver.metadata.App()
|
|
|
|
app.Categories = ['None']
|
|
|
|
app.builds = []
|
|
|
|
build = fdroidserver.metadata.Build()
|
|
|
|
build.versionCode = 102030
|
|
|
|
build.versionName = 'v1.2.3'
|
|
|
|
build.sudo = "apt-get update && apt-get install -y whatever && sed -i -e 's/<that attr=\"bad\"/<that attr=\"good\"/' ~/.whatever/config.xml"
|
|
|
|
build.init = "bash generate_some_file.sh && sed -i -e 'g/what/ever/' /some/file"
|
|
|
|
build.prebuild = "npm something && echo 'important setting' >> /a/file"
|
|
|
|
build.build = "./gradlew someSpecialTask && sed -i 'd/that wrong config/' gradle.properties && ./gradlew compile"
|
|
|
|
app.builds.append(build)
|
|
|
|
fdroidserver.metadata.write_yaml(mf, app)
|
|
|
|
mf.seek(0)
|
|
|
|
self.assertEqual(mf.read(), textwrap.dedent("""\
|
|
|
|
Categories:
|
|
|
|
- None
|
|
|
|
License: Unknown
|
|
|
|
|
|
|
|
Builds:
|
|
|
|
- versionName: v1.2.3
|
|
|
|
versionCode: 102030
|
|
|
|
sudo:
|
|
|
|
- apt-get update
|
|
|
|
- apt-get install -y whatever
|
|
|
|
- sed -i -e 's/<that attr="bad"/<that attr="good"/' ~/.whatever/config.xml
|
|
|
|
init:
|
|
|
|
- bash generate_some_file.sh
|
|
|
|
- sed -i -e 'g/what/ever/' /some/file
|
2018-08-28 10:16:13 +02:00
|
|
|
prebuild:
|
2018-11-13 19:53:15 +01:00
|
|
|
- npm something
|
|
|
|
- echo 'important setting' >> /a/file
|
|
|
|
build:
|
|
|
|
- ./gradlew someSpecialTask
|
|
|
|
- sed -i 'd/that wrong config/' gradle.properties
|
|
|
|
- ./gradlew compile
|
2018-08-28 10:16:13 +02:00
|
|
|
|
|
|
|
AutoUpdateMode: None
|
|
|
|
UpdateCheckMode: None
|
|
|
|
"""))
|
|
|
|
|
2019-07-11 03:18:30 +02:00
|
|
|
def test_write_yaml_make_sure_provides_does_not_get_written(self):
|
|
|
|
mf = io.StringIO()
|
|
|
|
app = fdroidserver.metadata.App()
|
|
|
|
app.Categories = ['None']
|
|
|
|
app.Provides = 'this.is.deprecated'
|
|
|
|
app.builds = []
|
|
|
|
build = fdroidserver.metadata.Build()
|
|
|
|
build.versionCode = 102030
|
|
|
|
build.versionName = 'v1.2.3'
|
|
|
|
build.gradle = ['yes']
|
|
|
|
app.builds.append(build)
|
|
|
|
fdroidserver.metadata.write_yaml(mf, app)
|
|
|
|
mf.seek(0)
|
|
|
|
self.assertEqual(mf.read(), textwrap.dedent("""\
|
|
|
|
Categories:
|
|
|
|
- None
|
|
|
|
License: Unknown
|
|
|
|
|
|
|
|
Builds:
|
|
|
|
- versionName: v1.2.3
|
|
|
|
versionCode: 102030
|
|
|
|
gradle:
|
|
|
|
- yes
|
|
|
|
|
|
|
|
AutoUpdateMode: None
|
|
|
|
UpdateCheckMode: None
|
|
|
|
"""))
|
|
|
|
|
2019-12-13 23:51:18 +01:00
|
|
|
def test_parse_txt_srclib(self):
|
2019-12-24 00:42:29 +01:00
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
2019-12-13 23:51:18 +01:00
|
|
|
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
|
|
|
with open('JSoup.txt', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
# Source details (the only mandatory fields)
|
|
|
|
Repo Type:git
|
|
|
|
Repo:https://github.com/jhy/jsoup.git
|
|
|
|
|
|
|
|
# Comma-separated list of subdirs to use. The first existing subdirectory
|
|
|
|
# found between those given will be used. If none is found or provided, the
|
|
|
|
# root of the repo directory will be used instead.
|
|
|
|
Subdir:
|
|
|
|
|
|
|
|
# Any extra commands to prepare the source library
|
|
|
|
Prepare:
|
|
|
|
'''))
|
|
|
|
srclib = fdroidserver.metadata.parse_txt_srclib('JSoup.txt')
|
|
|
|
self.assertDictEqual({'Repo': 'https://github.com/jhy/jsoup.git',
|
2019-12-15 17:27:27 +01:00
|
|
|
'RepoType': 'git',
|
2019-12-13 23:51:18 +01:00
|
|
|
'Subdir': [''],
|
|
|
|
'Prepare': ''},
|
|
|
|
srclib)
|
|
|
|
|
2019-12-24 00:42:29 +01:00
|
|
|
def test_parse_txt_srclib_simple(self):
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
|
|
|
with open('simple.txt', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
# this should be simple
|
|
|
|
Repo Type:git
|
|
|
|
Repo:https://git.host/repo.git
|
|
|
|
'''))
|
|
|
|
srclib = fdroidserver.metadata.parse_txt_srclib('simple.txt')
|
|
|
|
self.assertDictEqual({'Repo': 'https://git.host/repo.git',
|
|
|
|
'RepoType': 'git',
|
|
|
|
'Subdir': None,
|
|
|
|
'Prepare': None},
|
|
|
|
srclib)
|
|
|
|
|
|
|
|
def test_parse_txt_srclib_simple_blanks(self):
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
|
|
|
with open('simple.txt', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
# this should be simple
|
|
|
|
|
|
|
|
Repo Type:git
|
|
|
|
|
|
|
|
Repo:https://git.host/repo.git
|
|
|
|
|
|
|
|
Subdir:
|
|
|
|
|
|
|
|
Prepare:
|
|
|
|
'''))
|
|
|
|
srclib = fdroidserver.metadata.parse_txt_srclib('simple.txt')
|
|
|
|
self.assertDictEqual({'Repo': 'https://git.host/repo.git',
|
|
|
|
'RepoType': 'git',
|
|
|
|
'Subdir': [''],
|
|
|
|
'Prepare': ''},
|
|
|
|
srclib)
|
|
|
|
|
|
|
|
def test_parse_txt_srclib_Changelog_cketti(self):
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
|
|
|
with open('Changelog-cketti.txt', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
Repo Type:git
|
|
|
|
Repo:https://github.com/cketti/ckChangeLog
|
|
|
|
|
|
|
|
Subdir:library,ckChangeLog/src/main
|
|
|
|
Prepare:[ -f project.properties ] || echo 'source.dir=java' > ant.properties && echo -e 'android.library=true\\ntarget=android-19' > project.properties
|
|
|
|
'''))
|
|
|
|
srclib = fdroidserver.metadata.parse_txt_srclib('Changelog-cketti.txt')
|
|
|
|
self.assertDictEqual({'Repo': 'https://github.com/cketti/ckChangeLog',
|
|
|
|
'RepoType': 'git',
|
|
|
|
'Subdir': ['library', 'ckChangeLog/src/main'],
|
|
|
|
'Prepare': "[ -f project.properties ] || echo 'source.dir=java' > "
|
|
|
|
"ant.properties && echo -e "
|
|
|
|
"'android.library=true\\ntarget=android-19' > project.properties"},
|
|
|
|
srclib)
|
|
|
|
|
|
|
|
def test_parse_yml_srclib_unknown_key(self):
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
|
|
|
with open('test.yml', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
RepoType: git
|
|
|
|
Repo: https://example.com/test.git
|
|
|
|
Evil: I should not be here.
|
|
|
|
'''))
|
|
|
|
with self.assertRaisesRegex(MetaDataException,
|
|
|
|
"Invalid srclib metadata: "
|
|
|
|
"unknown key 'Evil' in "
|
|
|
|
"'test.yml'"):
|
|
|
|
fdroidserver.metadata.parse_yml_srclib('test.yml')
|
|
|
|
|
|
|
|
def test_parse_yml_srclib_does_not_exists(self):
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
with self.assertRaisesRegex(MetaDataException,
|
|
|
|
"Invalid scrlib metadata: "
|
|
|
|
"'non/existent-test-srclib.yml' "
|
|
|
|
"does not exist"):
|
|
|
|
fdroidserver.metadata.parse_yml_srclib('non/existent-test-srclib.yml')
|
|
|
|
|
|
|
|
def test_parse_yml_srclib_simple(self):
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
|
|
|
with open('simple.yml', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
# this should be simple
|
|
|
|
RepoType: git
|
|
|
|
Repo: https://git.host/repo.git
|
|
|
|
'''))
|
|
|
|
srclib = fdroidserver.metadata.parse_yml_srclib('simple.yml')
|
|
|
|
self.assertDictEqual({'Repo': 'https://git.host/repo.git',
|
|
|
|
'RepoType': 'git',
|
|
|
|
'Subdir': None,
|
|
|
|
'Prepare': None},
|
|
|
|
srclib)
|
|
|
|
|
|
|
|
def test_parse_yml_srclib_simple_with_blanks(self):
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
|
|
|
with open('simple.yml', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
# this should be simple
|
|
|
|
|
|
|
|
RepoType: git
|
|
|
|
|
|
|
|
Repo: https://git.host/repo.git
|
|
|
|
|
|
|
|
Subdir:
|
|
|
|
|
|
|
|
Prepare:
|
|
|
|
'''))
|
|
|
|
srclib = fdroidserver.metadata.parse_yml_srclib('simple.yml')
|
|
|
|
self.assertDictEqual({'Repo': 'https://git.host/repo.git',
|
|
|
|
'RepoType': 'git',
|
|
|
|
'Subdir': [''],
|
|
|
|
'Prepare': ''},
|
|
|
|
srclib)
|
|
|
|
|
|
|
|
def test_parse_yml_srclib_Changelog_cketti(self):
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
|
|
|
with open('Changelog-cketti.yml', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
RepoType: git
|
|
|
|
Repo: https://github.com/cketti/ckChangeLog
|
|
|
|
|
|
|
|
Subdir: library,ckChangeLog/src/main
|
|
|
|
Prepare: "[ -f project.properties ] || echo 'source.dir=java' > ant.properties && echo -e 'android.library=true\\\\ntarget=android-19' > project.properties"
|
|
|
|
'''))
|
|
|
|
srclib = fdroidserver.metadata.parse_yml_srclib('Changelog-cketti.yml')
|
2020-02-03 23:30:23 +01:00
|
|
|
self.assertDictEqual(srclib,
|
|
|
|
{'Repo': 'https://github.com/cketti/ckChangeLog',
|
2019-12-24 00:42:29 +01:00
|
|
|
'RepoType': 'git',
|
|
|
|
'Subdir': ['library', 'ckChangeLog/src/main'],
|
|
|
|
'Prepare': "[ -f project.properties ] || echo 'source.dir=java' > "
|
|
|
|
"ant.properties && echo -e "
|
2020-02-03 23:30:23 +01:00
|
|
|
"'android.library=true\\ntarget=android-19' > project.properties"})
|
2019-12-24 00:42:29 +01:00
|
|
|
|
2020-02-29 15:50:06 +01:00
|
|
|
def test_read_srclibs_yml_subdir_list(self):
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
fdroidserver.metadata.srclibs = None
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
|
|
|
os.mkdir('srclibs')
|
|
|
|
with open('srclibs/with-list.yml', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
# this should be simple
|
|
|
|
RepoType: git
|
|
|
|
Repo: https://git.host/repo.git
|
|
|
|
|
|
|
|
Subdir:
|
|
|
|
- This is your last chance.
|
|
|
|
- After this, there is no turning back.
|
|
|
|
- You take the blue pill—the story ends,
|
|
|
|
- you wake up in your bed
|
|
|
|
- and believe whatever you want to believe.
|
|
|
|
- You take the red pill—you stay in Wonderland
|
|
|
|
- and I show you how deep the rabbit-hole goes.
|
|
|
|
Prepare:
|
|
|
|
There is a difference between knowing the path
|
|
|
|
and walking the path.
|
|
|
|
'''))
|
|
|
|
fdroidserver.metadata.read_srclibs()
|
|
|
|
self.maxDiff = None
|
|
|
|
self.assertDictEqual(fdroidserver.metadata.srclibs,
|
|
|
|
{'with-list': {'RepoType': 'git',
|
|
|
|
'Repo': 'https://git.host/repo.git',
|
|
|
|
'Subdir': ['This is your last chance.',
|
|
|
|
'After this, there is no turning back.',
|
|
|
|
'You take the blue pill—the story ends,',
|
|
|
|
'you wake up in your bed',
|
|
|
|
'and believe whatever you want to believe.',
|
|
|
|
'You take the red pill—you stay in Wonderland',
|
|
|
|
'and I show you how deep the rabbit-hole goes.'],
|
|
|
|
'Prepare': 'There is a difference between knowing the path '
|
|
|
|
'and walking the path.'}})
|
|
|
|
|
2020-02-29 13:42:12 +01:00
|
|
|
def test_read_srclibs_yml_prepare_list(self):
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
|
|
|
fdroidserver.metadata.srclibs = None
|
|
|
|
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
|
|
|
os.mkdir('srclibs')
|
|
|
|
with open('srclibs/with-list.yml', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
# this should be simple
|
|
|
|
RepoType: git
|
|
|
|
Repo: https://git.host/repo.git
|
|
|
|
|
|
|
|
Subdir:
|
|
|
|
Prepare:
|
|
|
|
- The Matrix is a system, Neo.
|
|
|
|
- That system is our enemy.
|
|
|
|
- But when you're inside, you look around, what do you see?
|
|
|
|
- Businessmen, teachers, lawyers, carpenters.
|
|
|
|
- The very minds of the people we are trying to save.
|
|
|
|
- But until we do, these people are still a part of that system and that makes them our enemy.
|
|
|
|
- You have to understand, most of these people are not ready to be unplugged.
|
|
|
|
- And many of them are so inert, so hopelessly dependent on the system that they will fight to protect it.
|
|
|
|
'''))
|
|
|
|
fdroidserver.metadata.read_srclibs()
|
|
|
|
self.maxDiff = None
|
|
|
|
self.assertDictEqual(fdroidserver.metadata.srclibs,
|
|
|
|
{'with-list': {'RepoType': 'git',
|
|
|
|
'Repo': 'https://git.host/repo.git',
|
|
|
|
'Subdir': [''],
|
|
|
|
'Prepare': 'The Matrix is a system, Neo. && '
|
|
|
|
'That system is our enemy. && '
|
|
|
|
'But when you\'re inside, you look around, what do you see? && '
|
|
|
|
'Businessmen, teachers, lawyers, carpenters. && '
|
|
|
|
'The very minds of the people we are trying to save. && '
|
|
|
|
'But until we do, these people are still a part of that system and that makes them our enemy. && '
|
|
|
|
'You have to understand, most of these people are not ready to be unplugged. && '
|
|
|
|
'And many of them are so inert, so hopelessly dependent on the system that they will fight to protect it.'}})
|
|
|
|
|
2019-12-24 00:42:29 +01:00
|
|
|
def test_read_srclibs(self):
|
|
|
|
fdroidserver.metadata.warnings_action = 'error'
|
2020-02-03 23:30:23 +01:00
|
|
|
fdroidserver.metadata.srclibs = None
|
2019-12-24 00:42:29 +01:00
|
|
|
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
|
|
|
os.mkdir('srclibs')
|
|
|
|
with open('srclibs/simple.yml', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
RepoType: git
|
|
|
|
Repo: https://git.host/repo.git
|
|
|
|
'''))
|
|
|
|
with open('srclibs/simple-wb.txt', 'w', encoding='utf-8') as f:
|
|
|
|
f.write(textwrap.dedent('''\
|
|
|
|
# this should be simple
|
|
|
|
Repo Type:git
|
|
|
|
Repo:https://git.host/repo.git
|
|
|
|
|
|
|
|
Subdir:
|
|
|
|
Prepare:
|
|
|
|
'''))
|
|
|
|
fdroidserver.metadata.read_srclibs()
|
|
|
|
self.assertDictEqual(fdroidserver.metadata.srclibs,
|
|
|
|
{'simple-wb': {'RepoType': 'git',
|
|
|
|
'Repo': 'https://git.host/repo.git',
|
|
|
|
'Subdir': [''],
|
|
|
|
'Prepare': ''},
|
|
|
|
'simple': {'RepoType': 'git',
|
|
|
|
'Repo': 'https://git.host/repo.git',
|
|
|
|
'Subdir': None,
|
|
|
|
'Prepare': None}})
|
|
|
|
|
2015-07-22 10:16:43 +02:00
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2018-08-14 10:34:13 +02:00
|
|
|
os.chdir(os.path.dirname(__file__))
|
|
|
|
|
2015-07-22 10:16:43 +02:00
|
|
|
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(MetadataTest))
|
2018-10-10 15:04:45 +02:00
|
|
|
unittest.main(failfast=True)
|