mirror of
https://gitlab.com/fdroid/fdroidserver.git
synced 2024-09-04 03:30:13 +02:00
The .txt format was the last place where the lowercase "builds" was used, this converts references everywhere to be "Builds". This makes it possible to load metadata YAML files with any YAML parser, then have it possible to use fdroidserver methods on that data, like metadata.write_metadata(). The test files in tests/metadata/dump/*.yaml were manually edited by cutting the builds: block and putting it the sort order for Builds: so the contents should be unchanged. ``` sed -i \ -e 's/app\.builds/app.get('Builds', \[\])/g' \ -e "s/app\.get(Builds, \[\]) =/app\['Builds'] =/g" \ -e "s/app\.get(Builds, \[\]) =/app\['Builds'] =/g" \ -e "s/app\.get(Builds, \[\])/app.get('Builds', \[\])/g" \ -e "s/app\.get('Builds', \[\])\.append/app\['Builds'\].append/g" \ -e "s/app\['builds'\]/app.get('Builds', [])/g" \ */*.* ```
168 lines
6.7 KiB
Python
Executable File
168 lines
6.7 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 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.checkupdates
|
|
import fdroidserver.metadata
|
|
from fdroidserver.exception import FDroidException
|
|
|
|
|
|
class CheckupdatesTest(unittest.TestCase):
|
|
'''fdroidserver/checkupdates.py'''
|
|
|
|
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_autoupdatemode_no_suffix(self):
|
|
fdroidserver.checkupdates.options = mock.Mock()
|
|
fdroidserver.checkupdates.options.auto = 'bleh'
|
|
fdroidserver.checkupdates.config = {}
|
|
|
|
app = fdroidserver.metadata.App()
|
|
app.id = 'loop.starts.shooting'
|
|
app.metadatapath = 'metadata/' + app.id + '.yml'
|
|
app.CurrentVersion = '1.1.8-fdroid'
|
|
app.CurrentVersionCode = 10108
|
|
app.UpdateCheckMode = 'HTTP'
|
|
app.AutoUpdateMode = 'Version %v'
|
|
|
|
build = fdroidserver.metadata.Build()
|
|
build.versionCode = app.CurrentVersionCode
|
|
build.versionName = app.CurrentVersion
|
|
app['Builds'].append(build)
|
|
|
|
with mock.patch('fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109)):
|
|
with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()):
|
|
with mock.patch('subprocess.call', lambda cmd: 0):
|
|
fdroidserver.checkupdates.checkupdates_app(app)
|
|
build = app['Builds'][-1]
|
|
self.assertEqual(build.versionName, '1.1.9')
|
|
self.assertEqual(build.commit, '1.1.9')
|
|
|
|
def test_autoupdatemode_suffix(self):
|
|
fdroidserver.checkupdates.options = mock.Mock()
|
|
fdroidserver.checkupdates.options.auto = 'bleh'
|
|
fdroidserver.checkupdates.config = {}
|
|
|
|
app = fdroidserver.metadata.App()
|
|
app.id = 'loop.starts.shooting'
|
|
app.metadatapath = 'metadata/' + app.id + '.yml'
|
|
app.CurrentVersion = '1.1.8-fdroid'
|
|
app.CurrentVersionCode = 10108
|
|
app.UpdateCheckMode = 'HTTP'
|
|
app.AutoUpdateMode = 'Version +.%c-fdroid v%v_%c'
|
|
|
|
build = fdroidserver.metadata.Build()
|
|
build.versionCode = app.CurrentVersionCode
|
|
build.versionName = app.CurrentVersion
|
|
app['Builds'].append(build)
|
|
|
|
with mock.patch('fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109)):
|
|
with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()):
|
|
with mock.patch('subprocess.call', lambda cmd: 0):
|
|
fdroidserver.checkupdates.checkupdates_app(app)
|
|
build = app['Builds'][-1]
|
|
self.assertEqual(build.versionName, '1.1.9.10109-fdroid')
|
|
self.assertEqual(build.commit, 'v1.1.9_10109')
|
|
|
|
def test_checkupdates_app_http(self):
|
|
fdroidserver.checkupdates.options = mock.Mock()
|
|
fdroidserver.checkupdates.options.auto = 'bleh'
|
|
fdroidserver.checkupdates.config = {}
|
|
|
|
app = fdroidserver.metadata.App()
|
|
app.id = 'loop.starts.shooting'
|
|
app.metadatapath = 'metadata/' + app.id + '.yml'
|
|
app.CurrentVersionCode = 10108
|
|
app.UpdateCheckMode = 'HTTP'
|
|
app.UpdateCheckData = 'mock'
|
|
|
|
with mock.patch('fdroidserver.checkupdates.check_http', lambda app: (None, 'bla')):
|
|
fdroidserver.checkupdates.checkupdates_app(app)
|
|
|
|
with mock.patch('fdroidserver.checkupdates.check_http', lambda app: ('1.1.9', 10109)):
|
|
with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()) as wrmock:
|
|
with mock.patch('subprocess.call', lambda cmd: 0):
|
|
fdroidserver.checkupdates.checkupdates_app(app)
|
|
wrmock.assert_called_with(app.metadatapath, app)
|
|
|
|
def test_check_http(self):
|
|
fdroidserver.checkupdates.options = mock.Mock()
|
|
|
|
app = fdroidserver.metadata.App()
|
|
app.id = 'loop.starts.shooting'
|
|
app.metadatapath = 'metadata/' + app.id + '.yml'
|
|
app.CurrentVersionCode = 10108
|
|
app.UpdateCheckMode = 'HTTP'
|
|
app.UpdateCheckData = 'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)'
|
|
app.UpdateCheckIgnore = 'beta'
|
|
|
|
respmock = mock.Mock()
|
|
respmock.read = lambda: 'v1.1.9\nc10109'.encode('utf-8')
|
|
with mock.patch('urllib.request.urlopen', lambda a, b, c: respmock):
|
|
vername, vercode = fdroidserver.checkupdates.check_http(app)
|
|
self.assertEqual(vername, '1.1.9')
|
|
self.assertEqual(vercode, '10109')
|
|
|
|
def test_check_http_blocks_unknown_schemes(self):
|
|
app = fdroidserver.metadata.App()
|
|
for scheme in ('file', 'ssh', 'http', ';pwn'):
|
|
app.id = scheme
|
|
faked = scheme + '://fake.url/for/testing/scheme'
|
|
app.UpdateCheckData = faked + '|ignored|' + faked + '|ignored'
|
|
app.metadatapath = 'metadata/' + app.id + '.yml'
|
|
vername, vercode = fdroidserver.checkupdates.check_http(app)
|
|
self.assertIsNone(vername)
|
|
self.assertTrue(FDroidException.__name__ in vercode)
|
|
|
|
def test_check_http_ignore(self):
|
|
fdroidserver.checkupdates.options = mock.Mock()
|
|
|
|
app = fdroidserver.metadata.App()
|
|
app.id = 'loop.starts.shooting'
|
|
app.metadatapath = 'metadata/' + app.id + '.yml'
|
|
app.CurrentVersionCode = 10108
|
|
app.UpdateCheckMode = 'HTTP'
|
|
app.UpdateCheckData = 'https://a.net/b.txt|c(.*)|https://d.net/e.txt|v(.*)'
|
|
app.UpdateCheckIgnore = 'beta'
|
|
|
|
respmock = mock.Mock()
|
|
respmock.read = lambda: 'v1.1.9-beta\nc10109'.encode('utf-8')
|
|
with mock.patch('urllib.request.urlopen', lambda a, b, c: respmock):
|
|
vername, vercode = fdroidserver.checkupdates.check_http(app)
|
|
self.assertEqual(vername, None)
|
|
self.assertEqual(vercode, 'Version 1.1.9-beta is ignored')
|
|
|
|
|
|
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(CheckupdatesTest))
|
|
unittest.main(failfast=False)
|