mirror of
https://github.com/f-droid/fdroidserver.git
synced 2025-11-13 10:40:29 +03:00
Index v2
This commit is contained in:
parent
45e79b1223
commit
d70e5c2cd9
10 changed files with 677 additions and 53 deletions
|
|
@ -2372,6 +2372,72 @@ class CommonTest(unittest.TestCase):
|
|||
fdroidserver.common.set_FDroidPopen_env(build)
|
||||
self.assertNotIn('', os.getenv('PATH').split(os.pathsep))
|
||||
|
||||
def test_is_repo_file(self):
|
||||
is_repo_file = fdroidserver.common.is_repo_file
|
||||
self.assertFalse(is_repo_file('does-not-exist'))
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
|
||||
Path('repo').mkdir()
|
||||
repo_files = [
|
||||
'repo/com.example.test.helloworld_1.apk',
|
||||
'repo/com.politedroid_6.apk',
|
||||
'repo/duplicate.permisssions_9999999.apk',
|
||||
'repo/fake.ota.update_1234.zip',
|
||||
'repo/info.guardianproject.index-v1.jar_123.apk',
|
||||
'repo/info.zwanenburg.caffeinetile_4.apk',
|
||||
'repo/main.1101613.obb.main.twoversions.obb',
|
||||
]
|
||||
index_files = [
|
||||
'repo/entry.jar',
|
||||
'repo/entry.json',
|
||||
'repo/index-v1.jar',
|
||||
'repo/index-v1.json',
|
||||
'repo/index-v2.jar',
|
||||
'repo/index-v2.json',
|
||||
'repo/index.css',
|
||||
'repo/index.html',
|
||||
'repo/index.jar',
|
||||
'repo/index.png',
|
||||
'repo/index.xml',
|
||||
]
|
||||
non_repo_files = ['repo/categories.txt']
|
||||
for f in repo_files + index_files + non_repo_files:
|
||||
open(f, 'w').close()
|
||||
|
||||
repo_dirs = [
|
||||
'repo/com.politedroid',
|
||||
'repo/info.guardianproject.index-v1.jar',
|
||||
'repo/status',
|
||||
]
|
||||
for d in repo_dirs:
|
||||
os.mkdir(d)
|
||||
|
||||
for f in repo_files:
|
||||
self.assertTrue(os.path.exists(f), f + ' was created')
|
||||
self.assertTrue(is_repo_file(f), f + ' is repo file')
|
||||
|
||||
for f in index_files:
|
||||
self.assertTrue(os.path.exists(f), f + ' was created')
|
||||
self.assertFalse(is_repo_file(f), f + ' is repo file')
|
||||
gpg_signed = [
|
||||
'repo/entry.json',
|
||||
'repo/index-v1.json',
|
||||
'repo/index-v2.json',
|
||||
]
|
||||
self.assertEqual(
|
||||
(f in gpg_signed or is_repo_file(f, for_gpg_signing=False)),
|
||||
is_repo_file(f, for_gpg_signing=True),
|
||||
f + ' gpg signable?',
|
||||
)
|
||||
|
||||
for d in repo_dirs:
|
||||
self.assertTrue(os.path.exists(d), d + ' was created')
|
||||
self.assertFalse(is_repo_file(d), d + ' not repo file')
|
||||
|
||||
for f in non_repo_files:
|
||||
self.assertTrue(os.path.exists(f), f + ' was created')
|
||||
self.assertFalse(is_repo_file(f), f + ' not repo file')
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
os.chdir(os.path.dirname(__file__))
|
||||
|
|
|
|||
91
tests/gpgsign.TestCase
Executable file
91
tests/gpgsign.TestCase
Executable file
|
|
@ -0,0 +1,91 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import inspect
|
||||
import json
|
||||
import logging
|
||||
import optparse
|
||||
import os
|
||||
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)
|
||||
|
||||
from fdroidserver import common, gpgsign
|
||||
from pathlib import Path
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
|
||||
class GpgsignTest(unittest.TestCase):
|
||||
|
||||
basedir = Path(__file__).resolve().parent
|
||||
|
||||
def setUp(self):
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
self.tempdir = tempfile.TemporaryDirectory()
|
||||
os.chdir(self.tempdir.name)
|
||||
self.repodir = Path('repo')
|
||||
self.repodir.mkdir()
|
||||
|
||||
gpgsign.config = None
|
||||
config = common.read_config(common.options)
|
||||
config['verbose'] = True
|
||||
config['gpghome'] = str((self.basedir / 'gnupghome').resolve())
|
||||
config['gpgkey'] = '1DBA2E89'
|
||||
gpgsign.config = config
|
||||
|
||||
def tearDown(self):
|
||||
self.tempdir.cleanup()
|
||||
|
||||
@patch('sys.argv', ['fdroid gpgsign', '--verbose'])
|
||||
@patch('fdroidserver.gpgsign.FDroidPopen')
|
||||
def test_sign_index(self, FDroidPopen):
|
||||
"""This skips running gpg because its hard to setup in a test env"""
|
||||
index_v1_json = 'repo/index-v1.json'
|
||||
shutil.copy(str(self.basedir / index_v1_json), 'repo')
|
||||
shutil.copy(str(self.basedir / 'SpeedoMeterApp.main_1.apk'), 'repo')
|
||||
|
||||
def _side_effect(gpg):
|
||||
f = gpg[-1]
|
||||
sig = gpg[3]
|
||||
self.assertTrue(sig.startswith(f))
|
||||
open(sig, 'w').close()
|
||||
p = MagicMock()
|
||||
p.returncode = 0
|
||||
return p
|
||||
|
||||
FDroidPopen.side_effect = _side_effect
|
||||
gpgsign.main()
|
||||
self.assertTrue(FDroidPopen.called)
|
||||
self.assertTrue((self.repodir / 'index-v1.json').exists())
|
||||
self.assertTrue((self.repodir / 'index-v1.json.asc').exists())
|
||||
self.assertTrue((self.repodir / 'SpeedoMeterApp.main_1.apk.asc').exists())
|
||||
self.assertFalse((self.repodir / 'index.jar.asc').exists())
|
||||
# smoke check status JSON
|
||||
with (self.repodir / 'status/gpgsign.json').open() as fp:
|
||||
data = json.load(fp)
|
||||
self.assertTrue('index-v1.json' in data['signed'])
|
||||
|
||||
|
||||
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",
|
||||
)
|
||||
(common.options, args) = parser.parse_args(['--verbose'])
|
||||
|
||||
newSuite = unittest.TestSuite()
|
||||
newSuite.addTest(unittest.makeSuite(GpgsignTest))
|
||||
unittest.main(failfast=False)
|
||||
|
|
@ -57,7 +57,7 @@ class IndexTest(unittest.TestCase):
|
|||
fdroidserver.signindex.config = config
|
||||
|
||||
if not os.path.exists('repo/index-v1.jar'):
|
||||
fdroidserver.signindex.sign_index_v1(
|
||||
fdroidserver.signindex.sign_index(
|
||||
os.path.join(self.basedir, 'repo'), 'index-v1.json'
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -56,17 +56,17 @@ class SignindexTest(unittest.TestCase):
|
|||
def tearDown(self):
|
||||
self.tempdir.cleanup()
|
||||
|
||||
def test_sign_index_v1(self):
|
||||
def test_sign_index(self):
|
||||
shutil.copy(str(self.basedir / 'repo/index-v1.json'), 'repo')
|
||||
signindex.sign_index_v1(str(self.repodir), 'index-v1.json')
|
||||
signindex.sign_index(str(self.repodir), 'index-v1.json')
|
||||
self.assertTrue((self.repodir / 'index-v1.jar').exists())
|
||||
self.assertTrue((self.repodir / 'index-v1.json').exists())
|
||||
|
||||
def test_sign_index_v1_corrupt(self):
|
||||
def test_sign_index_corrupt(self):
|
||||
with open('repo/index-v1.json', 'w') as fp:
|
||||
fp.write('corrupt JSON!')
|
||||
with self.assertRaises(json.decoder.JSONDecodeError, msg='error on bad JSON'):
|
||||
signindex.sign_index_v1(str(self.repodir), 'index-v1.json')
|
||||
signindex.sign_index(str(self.repodir), 'index-v1.json')
|
||||
|
||||
def test_signindex(self):
|
||||
os.mkdir('archive')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue