Compare commits
16 Commits
a1f5713ebd
...
7f99dec45d
Author | SHA1 | Date |
---|---|---|
Jochen Sprickerhof | 7f99dec45d | |
Hans-Christoph Steiner | 4666330a4d | |
linsui | 7104411296 | |
Hans-Christoph Steiner | 99bd544ab9 | |
Hans-Christoph Steiner | 5df3d27126 | |
Hans-Christoph Steiner | 1b65e33835 | |
Hans-Christoph Steiner | 299e3e5f4c | |
Hans-Christoph Steiner | 1cb1394de3 | |
Hans-Christoph Steiner | 9a9b5beeaa | |
Hans-Christoph Steiner | 14c8647909 | |
linsui | d243cbd030 | |
Michael Pöhn | 08c553e1cb | |
linsui | f82d648cb1 | |
Michael Pöhn | 79586fd9e3 | |
Hans-Christoph Steiner | 6f07538cdc | |
Jochen Sprickerhof | 769ef07536 |
|
@ -285,9 +285,7 @@ black:
|
|||
- black --check --diff --color $CI_PROJECT_DIR
|
||||
|
||||
fedora_latest:
|
||||
image: fedora:latest
|
||||
only:
|
||||
- master@fdroid/fdroidserver
|
||||
image: fedora:39 # support ends on 2024-11-12
|
||||
script:
|
||||
# tricks to hopefully make runs more reliable
|
||||
- echo "timeout=600" >> /etc/dnf/dnf.conf
|
||||
|
|
|
@ -53,7 +53,7 @@ ssh_channel = None
|
|||
|
||||
|
||||
# Note that 'force' here also implies test mode.
|
||||
def build_server(app, build, vcs, build_dir, output_dir, log_dir, force):
|
||||
def build_server(app, build, output_dir, log_dir, force, refresh):
|
||||
"""Do a build on the builder vm.
|
||||
|
||||
Parameters
|
||||
|
@ -61,10 +61,6 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force):
|
|||
app
|
||||
app metadata dict
|
||||
build
|
||||
vcs
|
||||
version control system controller object
|
||||
build_dir
|
||||
local source-code checkout of app
|
||||
output_dir
|
||||
target folder for the build result
|
||||
force
|
||||
|
@ -194,10 +190,6 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force):
|
|||
srclibpaths.append(
|
||||
common.getsrclib(lib, 'build/srclib', basepath=True, prepare=False))
|
||||
|
||||
# If one was used for the main source, add that too.
|
||||
basesrclib = vcs.getsrclib()
|
||||
if basesrclib:
|
||||
srclibpaths.append(basesrclib)
|
||||
for name, number, lib in srclibpaths:
|
||||
logging.info("Sending srclib '%s'" % lib)
|
||||
ftp.chdir(posixpath.join(homedir, 'build', 'srclib'))
|
||||
|
@ -214,9 +206,19 @@ def build_server(app, build, vcs, build_dir, output_dir, log_dir, force):
|
|||
else:
|
||||
raise BuildException(_('cannot find required srclibs: "{path}"')
|
||||
.format(path=srclibsfile))
|
||||
|
||||
vcs, build_dir = common.setup_vcs(app)
|
||||
# When using server mode, still keep a local cache of the repo, by
|
||||
# grabbing the source now.
|
||||
vcs.gotorevision(build.commit, refresh)
|
||||
|
||||
# Initialise submodules if required
|
||||
if build.submodules:
|
||||
vcs.initsubmodules()
|
||||
|
||||
# Copy the main app source code
|
||||
# (no need if it's a srclib)
|
||||
if (not basesrclib) and os.path.exists(build_dir):
|
||||
if os.path.exists(build_dir):
|
||||
ftp.chdir(posixpath.join(homedir, 'build'))
|
||||
fv = '.fdroidvcs-' + app.id
|
||||
ftp.put(os.path.join('build', fv), fv)
|
||||
|
@ -361,7 +363,7 @@ def get_metadata_from_apk(app, build, apkfile):
|
|||
return versionCode, versionName
|
||||
|
||||
|
||||
def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, extlib_dir, tmp_dir, force, onserver, refresh):
|
||||
def build_local(app, build, output_dir, log_dir, srclib_dir, extlib_dir, tmp_dir, force, onserver, refresh):
|
||||
"""Do a build locally."""
|
||||
ndk_path = build.ndk_path()
|
||||
if build.ndk or (build.buildjni and build.buildjni != ['no']):
|
||||
|
@ -414,6 +416,7 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
|
|||
% (app.id, build.versionName, build.sudo))
|
||||
|
||||
# Prepare the source code...
|
||||
vcs, build_dir = common.setup_vcs(app)
|
||||
root_dir, srclibpaths = common.prepare_source(vcs, app, build,
|
||||
build_dir, srclib_dir,
|
||||
extlib_dir, onserver, refresh)
|
||||
|
@ -759,8 +762,8 @@ def build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, ext
|
|||
os.path.join(output_dir, tarname))
|
||||
|
||||
|
||||
def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir,
|
||||
srclib_dir, extlib_dir, tmp_dir, repo_dir, vcs, test,
|
||||
def trybuild(app, build, output_dir, log_dir, also_check_dir,
|
||||
srclib_dir, extlib_dir, tmp_dir, repo_dir, test,
|
||||
server, force, onserver, refresh):
|
||||
"""Build a particular version of an application, if it needs building.
|
||||
|
||||
|
@ -806,17 +809,9 @@ def trybuild(app, build, build_dir, output_dir, log_dir, also_check_dir,
|
|||
build.versionName, build.versionCode, app.id))
|
||||
|
||||
if server:
|
||||
# When using server mode, still keep a local cache of the repo, by
|
||||
# grabbing the source now.
|
||||
vcs.gotorevision(build.commit, refresh)
|
||||
|
||||
# Initialise submodules if required
|
||||
if build.submodules:
|
||||
vcs.initsubmodules()
|
||||
|
||||
build_server(app, build, vcs, build_dir, output_dir, log_dir, force)
|
||||
build_server(app, build, output_dir, log_dir, force, refresh)
|
||||
else:
|
||||
build_local(app, build, vcs, build_dir, output_dir, log_dir, srclib_dir, extlib_dir, tmp_dir, force, onserver, refresh)
|
||||
build_local(app, build, output_dir, log_dir, srclib_dir, extlib_dir, tmp_dir, force, onserver, refresh)
|
||||
return True
|
||||
|
||||
|
||||
|
@ -1024,9 +1019,6 @@ def main():
|
|||
endtime = time.time() + 72 * 60 * 60
|
||||
max_build_time_reached = False
|
||||
for appid, app in apps.items():
|
||||
|
||||
first = True
|
||||
|
||||
for build in app.get('Builds', []):
|
||||
if time.time() > endtime:
|
||||
max_build_time_reached = True
|
||||
|
@ -1047,18 +1039,10 @@ def main():
|
|||
|
||||
tools_version_log = ''
|
||||
try:
|
||||
|
||||
# For the first build of a particular app, we need to set up
|
||||
# the source repo. We can reuse it on subsequent builds, if
|
||||
# there are any.
|
||||
if first:
|
||||
vcs, build_dir = common.setup_vcs(app)
|
||||
first = False
|
||||
|
||||
logging.debug("Checking %s:%s" % (appid, build.versionCode))
|
||||
if trybuild(app, build, build_dir, output_dir, log_dir,
|
||||
if trybuild(app, build, output_dir, log_dir,
|
||||
also_check_dir, srclib_dir, extlib_dir,
|
||||
tmp_dir, repo_dir, vcs, options.test,
|
||||
tmp_dir, repo_dir, options.test,
|
||||
options.server, options.force,
|
||||
options.onserver, options.refresh):
|
||||
toolslog = os.path.join(log_dir,
|
||||
|
|
|
@ -1149,7 +1149,6 @@ class vcs:
|
|||
self.local = local
|
||||
self.clone_failed = False
|
||||
self.refreshed = False
|
||||
self.srclib = None
|
||||
|
||||
def _gettags(self):
|
||||
raise NotImplementedError
|
||||
|
@ -1258,10 +1257,6 @@ class vcs:
|
|||
"""Get current commit reference (hash, revision, etc)."""
|
||||
raise VCSException('getref not supported for this vcs type')
|
||||
|
||||
def getsrclib(self):
|
||||
"""Return the srclib (name, path) used in setting up the current revision, or None."""
|
||||
return self.srclib
|
||||
|
||||
|
||||
class vcs_git(vcs):
|
||||
|
||||
|
@ -2296,11 +2291,6 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=
|
|||
for name, number, libpath in srclibpaths:
|
||||
place_srclib(root_dir, int(number) if number else None, libpath)
|
||||
|
||||
basesrclib = vcs.getsrclib()
|
||||
# If one was used for the main source, add that too.
|
||||
if basesrclib:
|
||||
srclibpaths.append(basesrclib)
|
||||
|
||||
# Update the local.properties file
|
||||
localprops = [os.path.join(build_dir, 'local.properties')]
|
||||
if build.subdir:
|
||||
|
@ -2354,6 +2344,8 @@ def prepare_source(vcs, app, build, build_dir, srclib_dir, extlib_dir, onserver=
|
|||
gradlefile = build_gradle
|
||||
elif os.path.exists(build_gradle_kts):
|
||||
gradlefile = build_gradle_kts
|
||||
else:
|
||||
raise BuildException("No gradle file found")
|
||||
regsub_file(r'compileSdkVersion[ =]+[0-9]+',
|
||||
r'compileSdkVersion %s' % n,
|
||||
gradlefile)
|
||||
|
|
|
@ -837,7 +837,15 @@ def push_binary_transparency(git_repo_path, git_remote):
|
|||
origin.set_url(git_remote)
|
||||
else:
|
||||
origin = gitrepo.create_remote('origin', git_remote)
|
||||
origin.push(GIT_BRANCH)
|
||||
for _i in range(3):
|
||||
try:
|
||||
origin.push(GIT_BRANCH)
|
||||
except git.GitCommandError as e:
|
||||
logging.error(e)
|
||||
continue
|
||||
break
|
||||
else:
|
||||
raise FDroidException(_("Pushing to remote server failed!"))
|
||||
|
||||
|
||||
def main():
|
||||
|
|
|
@ -722,7 +722,13 @@ def check_updates_ucm_http_aum_pattern(app): # noqa: D403
|
|||
|
||||
|
||||
def check_certificate_pinned_binaries(app):
|
||||
if len(app.get('AllowedAPKSigningKeys')) > 0:
|
||||
keys = app.get('AllowedAPKSigningKeys')
|
||||
known_keys = common.config.get('apk_signing_key_block_list', [])
|
||||
if keys:
|
||||
if known_keys:
|
||||
for key in keys:
|
||||
if key in known_keys:
|
||||
yield _('Known debug key is used in AllowedAPKSigningKeys: ') + key
|
||||
return
|
||||
if app.get('Binaries') is not None:
|
||||
yield _(
|
||||
|
|
|
@ -268,7 +268,8 @@ def main():
|
|||
urls[icondir].append(url)
|
||||
|
||||
for icondir in icondirs:
|
||||
_run_wget(os.path.join(basedir, section, icondir), urls[icondir])
|
||||
if icondir in urls:
|
||||
_run_wget(os.path.join(basedir, section, icondir), urls[icondir])
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
@ -221,6 +221,7 @@ class BuildTest(unittest.TestCase):
|
|||
@mock.patch('fdroidserver.build.FDroidPopen')
|
||||
@mock.patch('fdroidserver.common.is_debuggable_or_testOnly', lambda f: False)
|
||||
@mock.patch('fdroidserver.common.get_native_code', lambda f: 'x86')
|
||||
@mock.patch('fdroidserver.common.setup_vcs', lambda f: (mock.Mock(), "."))
|
||||
def test_build_local_maven(self, fake_FDroidPopen, fake_get_apk_id):
|
||||
"""Test build_local() with a maven project"""
|
||||
|
||||
|
@ -256,14 +257,11 @@ class BuildTest(unittest.TestCase):
|
|||
build.versionCode,
|
||||
build.versionName,
|
||||
)
|
||||
vcs = mock.Mock()
|
||||
|
||||
build.maven = 'yes@..'
|
||||
fdroidserver.build.build_local(
|
||||
app,
|
||||
build,
|
||||
vcs,
|
||||
build_dir=self.testdir,
|
||||
output_dir=self.testdir,
|
||||
log_dir=os.getcwd(),
|
||||
srclib_dir=None,
|
||||
|
@ -278,8 +276,6 @@ class BuildTest(unittest.TestCase):
|
|||
fdroidserver.build.build_local(
|
||||
app,
|
||||
build,
|
||||
vcs,
|
||||
build_dir=self.testdir,
|
||||
output_dir=self.testdir,
|
||||
log_dir=os.getcwd(),
|
||||
srclib_dir=None,
|
||||
|
@ -314,7 +310,6 @@ class BuildTest(unittest.TestCase):
|
|||
build.ndk = 'r21e' # aka 21.4.7075529
|
||||
ndk_version = '21.4.7075529'
|
||||
ndk_dir = Path(config['sdk_path']) / 'ndk' / ndk_version
|
||||
vcs = mock.Mock()
|
||||
|
||||
def make_fake_apk(output, build):
|
||||
with open(build.output, 'w') as fp:
|
||||
|
@ -346,6 +341,8 @@ class BuildTest(unittest.TestCase):
|
|||
'fdroidserver.build.FDroidPopen', FakeProcess
|
||||
) as _ignored, mock.patch(
|
||||
'sdkmanager.install', wraps=fake_sdkmanager_install
|
||||
) as _ignored, mock.patch(
|
||||
'fdroidserver.common.setup_vcs', return_value=(mock.Mock(), testdir)
|
||||
) as _ignored:
|
||||
_ignored # silence the linters
|
||||
with self.assertRaises(
|
||||
|
@ -355,8 +352,6 @@ class BuildTest(unittest.TestCase):
|
|||
fdroidserver.build.build_local(
|
||||
app,
|
||||
build,
|
||||
vcs,
|
||||
build_dir=testdir,
|
||||
output_dir=testdir,
|
||||
log_dir=None,
|
||||
srclib_dir=None,
|
||||
|
@ -374,8 +369,6 @@ class BuildTest(unittest.TestCase):
|
|||
fdroidserver.build.build_local(
|
||||
app,
|
||||
build,
|
||||
vcs,
|
||||
build_dir=testdir,
|
||||
output_dir=testdir,
|
||||
log_dir=os.getcwd(),
|
||||
srclib_dir=None,
|
||||
|
@ -398,6 +391,7 @@ class BuildTest(unittest.TestCase):
|
|||
'fdroidserver.common.sha256sum',
|
||||
lambda f: 'ad7ce5467e18d40050dc51b8e7affc3e635c85bd8c59be62de32352328ed467e',
|
||||
)
|
||||
@mock.patch('fdroidserver.common.setup_vcs', lambda f: (mock.Mock(), "."))
|
||||
def test_build_local_ndk_some_installed(self):
|
||||
"""Test if `fdroid build` detects installed NDKs and auto-installs when missing"""
|
||||
with tempfile.TemporaryDirectory() as testdir, TmpCwd(
|
||||
|
@ -425,7 +419,6 @@ class BuildTest(unittest.TestCase):
|
|||
build.ndk = 'r21e' # aka 21.4.7075529
|
||||
ndk_version = '21.4.7075529'
|
||||
ndk_dir = Path(config['sdk_path']) / 'ndk' / ndk_version
|
||||
vcs = mock.Mock()
|
||||
|
||||
def make_fake_apk(output, build):
|
||||
with open(build.output, 'w') as fp:
|
||||
|
@ -455,8 +448,6 @@ class BuildTest(unittest.TestCase):
|
|||
fdroidserver.build.build_local(
|
||||
app,
|
||||
build,
|
||||
vcs,
|
||||
build_dir=testdir,
|
||||
output_dir=testdir,
|
||||
log_dir=os.getcwd(),
|
||||
srclib_dir=None,
|
||||
|
@ -490,7 +481,6 @@ class BuildTest(unittest.TestCase):
|
|||
build.scanignore = ['foo.aar']
|
||||
build.versionCode = 1
|
||||
build.versionName = '1.0'
|
||||
vcs = mock.Mock()
|
||||
|
||||
os.mkdir('reports')
|
||||
os.mkdir('target')
|
||||
|
@ -523,30 +513,31 @@ class BuildTest(unittest.TestCase):
|
|||
fp.write('APK PLACEHOLDER')
|
||||
return output
|
||||
|
||||
with mock.patch('fdroidserver.common.replace_build_vars', wraps=make_fake_apk):
|
||||
with mock.patch('fdroidserver.common.get_native_code', return_value='x86'):
|
||||
with mock.patch(
|
||||
'fdroidserver.common.get_apk_id',
|
||||
return_value=(app.id, build.versionCode, build.versionName),
|
||||
):
|
||||
with mock.patch(
|
||||
'fdroidserver.common.is_debuggable_or_testOnly',
|
||||
return_value=False,
|
||||
):
|
||||
fdroidserver.build.build_local(
|
||||
app,
|
||||
build,
|
||||
vcs,
|
||||
build_dir=self.testdir,
|
||||
output_dir=self.testdir,
|
||||
log_dir=None,
|
||||
srclib_dir=None,
|
||||
extlib_dir=None,
|
||||
tmp_dir=None,
|
||||
force=False,
|
||||
onserver=False,
|
||||
refresh=False,
|
||||
)
|
||||
with mock.patch(
|
||||
'fdroidserver.common.replace_build_vars', wraps=make_fake_apk
|
||||
) as _ignored, mock.patch(
|
||||
'fdroidserver.common.get_native_code', return_value='x86'
|
||||
) as _ignored, mock.patch(
|
||||
'fdroidserver.common.get_apk_id',
|
||||
return_value=(app.id, build.versionCode, build.versionName),
|
||||
) as _ignored, mock.patch(
|
||||
'fdroidserver.common.is_debuggable_or_testOnly', return_value=False
|
||||
) as _ignored, mock.patch(
|
||||
'fdroidserver.common.setup_vcs', return_value=(mock.Mock(), self.testdir)
|
||||
) as _ignored:
|
||||
_ignored # silence the linters
|
||||
fdroidserver.build.build_local(
|
||||
app,
|
||||
build,
|
||||
output_dir=self.testdir,
|
||||
log_dir=None,
|
||||
srclib_dir=None,
|
||||
extlib_dir=None,
|
||||
tmp_dir=None,
|
||||
force=False,
|
||||
onserver=False,
|
||||
refresh=False,
|
||||
)
|
||||
|
||||
self.assertTrue(os.path.exists('foo.aar'))
|
||||
self.assertTrue(os.path.isdir('build'))
|
||||
|
@ -881,8 +872,6 @@ class BuildTest(unittest.TestCase):
|
|||
}
|
||||
fdroidserver.common.config = {'sdk_path': '/fake/android/sdk/path'}
|
||||
fdroidserver.build.options = mock.MagicMock()
|
||||
vcs = mock.Mock()
|
||||
vcs.getsrclib = mock.Mock(return_value=None)
|
||||
app = fdroidserver.metadata.App()
|
||||
app['metadatapath'] = 'metadata/fake.id.yml'
|
||||
app['id'] = 'fake.id'
|
||||
|
@ -897,29 +886,33 @@ class BuildTest(unittest.TestCase):
|
|||
)
|
||||
app['Builds'] = [build]
|
||||
|
||||
test_flag = ('--on-server', True)
|
||||
fdroidserver.build.build_server(app, build, vcs, '', '', '', False)
|
||||
self.assertTrue(fdroidserver_vmtools_get_build_vm.called)
|
||||
with mock.patch(
|
||||
'fdroidserver.common.setup_vcs', return_value=(mock.Mock(), "")
|
||||
) as _ignored:
|
||||
_ignored # silence the linters
|
||||
test_flag = ('--on-server', True)
|
||||
fdroidserver.build.build_server(app, build, '', '', False, False)
|
||||
self.assertTrue(fdroidserver_vmtools_get_build_vm.called)
|
||||
|
||||
for force in (True, False):
|
||||
test_flag = ('--force', force)
|
||||
fdroidserver.build.build_server(app, build, vcs, '', '', '', force)
|
||||
for force in (True, False):
|
||||
test_flag = ('--force', force)
|
||||
fdroidserver.build.build_server(app, build, '', '', force, False)
|
||||
|
||||
fdroidserver.build.options.notarball = True
|
||||
test_flag = ('--no-tarball', True)
|
||||
fdroidserver.build.build_server(app, build, vcs, '', '', '', False)
|
||||
fdroidserver.build.options.notarball = False
|
||||
test_flag = ('--no-tarball', False)
|
||||
fdroidserver.build.build_server(app, build, vcs, '', '', '', False)
|
||||
fdroidserver.build.options.notarball = True
|
||||
test_flag = ('--no-tarball', True)
|
||||
fdroidserver.build.build_server(app, build, '', '', False, False)
|
||||
fdroidserver.build.options.notarball = False
|
||||
test_flag = ('--no-tarball', False)
|
||||
fdroidserver.build.build_server(app, build, '', '', False, False)
|
||||
|
||||
fdroidserver.build.options.skipscan = False
|
||||
test_flag = ('--scan-binary', True)
|
||||
fdroidserver.build.build_server(app, build, vcs, '', '', '', False)
|
||||
fdroidserver.build.options.skipscan = True
|
||||
test_flag = ('--scan-binary', False)
|
||||
fdroidserver.build.build_server(app, build, vcs, '', '', '', False)
|
||||
test_flag = ('--skip-scan', True)
|
||||
fdroidserver.build.build_server(app, build, vcs, '', '', '', False)
|
||||
fdroidserver.build.options.skipscan = False
|
||||
test_flag = ('--scan-binary', True)
|
||||
fdroidserver.build.build_server(app, build, '', '', False, False)
|
||||
fdroidserver.build.options.skipscan = True
|
||||
test_flag = ('--scan-binary', False)
|
||||
fdroidserver.build.build_server(app, build, '', '', False, False)
|
||||
test_flag = ('--skip-scan', True)
|
||||
fdroidserver.build.build_server(app, build, '', '', False, False)
|
||||
|
||||
@mock.patch('fdroidserver.vmtools.get_build_vm')
|
||||
@mock.patch('fdroidserver.vmtools.get_clean_builder')
|
||||
|
@ -930,6 +923,7 @@ class BuildTest(unittest.TestCase):
|
|||
@mock.patch('fdroidserver.build.build_local')
|
||||
@mock.patch('fdroidserver.common.get_android_tools_version_log', lambda: 'versions')
|
||||
@mock.patch('fdroidserver.common.deploy_build_log_with_rsync', lambda a, b, c: None)
|
||||
@mock.patch('fdroidserver.common.setup_vcs', lambda f: (mock.Mock(), "."))
|
||||
def test_build_server_no_local_prepare(
|
||||
self,
|
||||
build_build_local,
|
||||
|
@ -1005,8 +999,6 @@ class BuildTest(unittest.TestCase):
|
|||
fdroidserver.build.options = options
|
||||
fdroidserver.build.config = {'sdk_path': '/fake/android/sdk/path'}
|
||||
|
||||
vcs = mock.Mock()
|
||||
vcs.getsrclib = mock.Mock(return_value=None)
|
||||
app = fdroidserver.metadata.App()
|
||||
app['metadatapath'] = 'metadata/fake.id.yml'
|
||||
app['id'] = 'fake.id'
|
||||
|
@ -1033,7 +1025,6 @@ class BuildTest(unittest.TestCase):
|
|||
fdroidserver.build.trybuild(
|
||||
app,
|
||||
build,
|
||||
build_dir,
|
||||
'unsigned',
|
||||
'logs',
|
||||
None,
|
||||
|
@ -1041,7 +1032,6 @@ class BuildTest(unittest.TestCase):
|
|||
extlib_dir,
|
||||
'tmp',
|
||||
'repo',
|
||||
vcs,
|
||||
options.test,
|
||||
options.server,
|
||||
options.force,
|
||||
|
|
|
@ -701,8 +701,14 @@ class IndexTest(unittest.TestCase):
|
|||
app = apps[appid]
|
||||
metadata = index.package_metadata(app, 'repo')
|
||||
# files
|
||||
self.assertEqual(36027, metadata['featureGraphic']['en-US']['size'])
|
||||
self.assertEqual(1413, metadata['icon']['en-US']['size'])
|
||||
self.assertEqual(
|
||||
os.path.getsize(f'repo/{appid}/en-US/featureGraphic.png'),
|
||||
metadata['featureGraphic']['en-US']['size'],
|
||||
)
|
||||
self.assertEqual(
|
||||
os.path.getsize(f'repo/{appid}/en-US/icon.png'),
|
||||
metadata['icon']['en-US']['size'],
|
||||
)
|
||||
# localized strings
|
||||
self.assertEqual({'en-US': 'title'}, metadata['name'])
|
||||
self.assertEqual({'en-US': 'video'}, metadata['video'])
|
||||
|
|
|
@ -438,6 +438,45 @@ class LintTest(unittest.TestCase):
|
|||
with self.assertRaises(TypeError):
|
||||
fdroidserver.lint.lint_config('mirrors.yml')
|
||||
|
||||
def test_check_certificate_pinned_binaries_empty(self):
|
||||
fdroidserver.common.config = {}
|
||||
app = fdroidserver.metadata.App()
|
||||
app.AllowedAPKSigningKeys = [
|
||||
'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc'
|
||||
]
|
||||
self.assertEqual(
|
||||
[],
|
||||
list(fdroidserver.lint.check_certificate_pinned_binaries(app)),
|
||||
"when the config is empty, any signing key should be allowed",
|
||||
)
|
||||
|
||||
def test_lint_known_debug_keys_no_match(self):
|
||||
fdroidserver.common.config = {
|
||||
"apk_signing_key_block_list": "a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc"
|
||||
}
|
||||
app = fdroidserver.metadata.App()
|
||||
app.AllowedAPKSigningKeys = [
|
||||
'2fd4fd5f54babba4bcb21237809bb653361d0d2583c80964ec89b28a26e9539e'
|
||||
]
|
||||
self.assertEqual(
|
||||
[],
|
||||
list(fdroidserver.lint.check_certificate_pinned_binaries(app)),
|
||||
"A signing key that does not match one in the config should be allowed",
|
||||
)
|
||||
|
||||
def test_lint_known_debug_keys(self):
|
||||
fdroidserver.common.config = {
|
||||
'apk_signing_key_block_list': 'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc'
|
||||
}
|
||||
app = fdroidserver.metadata.App()
|
||||
app.AllowedAPKSigningKeys = [
|
||||
'a40da80a59d170caa950cf15c18c454d47a39b26989d8b640ecd745ba71bf5dc'
|
||||
]
|
||||
for warn in fdroidserver.lint.check_certificate_pinned_binaries(app):
|
||||
anywarns = True
|
||||
logging.debug(warn)
|
||||
self.assertTrue(anywarns)
|
||||
|
||||
|
||||
class LintAntiFeaturesTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
|
|
|
@ -70,7 +70,10 @@ class NightlyTest(unittest.TestCase):
|
|||
|
||||
def tearDown(self):
|
||||
self.tempdir.cleanup()
|
||||
os.rmdir(self.testroot)
|
||||
try:
|
||||
os.rmdir(self.testroot)
|
||||
except OSError: # other test modules might have left stuff around
|
||||
pass
|
||||
|
||||
def _copy_test_debug_keystore(self):
|
||||
self.dot_android.mkdir()
|
||||
|
|
|
@ -246,7 +246,6 @@ class ScannerTest(unittest.TestCase):
|
|||
build.scanignore = ['baz.so', 'foo.aar']
|
||||
build.versionCode = 1
|
||||
build.versionName = '1.0'
|
||||
vcs = mock.Mock()
|
||||
|
||||
for f in ('baz.so', 'foo.aar', 'gradle-wrapper.jar'):
|
||||
with open(f, 'w') as fp:
|
||||
|
@ -269,30 +268,31 @@ class ScannerTest(unittest.TestCase):
|
|||
fp.write('APK PLACEHOLDER')
|
||||
return output
|
||||
|
||||
with mock.patch('fdroidserver.common.replace_build_vars', wraps=make_fake_apk):
|
||||
with mock.patch('fdroidserver.common.get_native_code', return_value='x86'):
|
||||
with mock.patch(
|
||||
'fdroidserver.common.get_apk_id',
|
||||
return_value=(app.id, build.versionCode, build.versionName),
|
||||
):
|
||||
with mock.patch(
|
||||
'fdroidserver.common.is_debuggable_or_testOnly',
|
||||
return_value=False,
|
||||
):
|
||||
fdroidserver.build.build_local(
|
||||
app,
|
||||
build,
|
||||
vcs,
|
||||
build_dir=self.testdir,
|
||||
output_dir=self.testdir,
|
||||
log_dir=None,
|
||||
srclib_dir=None,
|
||||
extlib_dir=None,
|
||||
tmp_dir=None,
|
||||
force=False,
|
||||
onserver=False,
|
||||
refresh=False,
|
||||
)
|
||||
with mock.patch(
|
||||
'fdroidserver.common.replace_build_vars', wraps=make_fake_apk
|
||||
) as _ignored, mock.patch(
|
||||
'fdroidserver.common.get_native_code', return_value='x86'
|
||||
) as _ignored, mock.patch(
|
||||
'fdroidserver.common.get_apk_id',
|
||||
return_value=(app.id, build.versionCode, build.versionName),
|
||||
) as _ignored, mock.patch(
|
||||
'fdroidserver.common.is_debuggable_or_testOnly', return_value=False
|
||||
) as _ignored, mock.patch(
|
||||
'fdroidserver.common.setup_vcs', return_value=(mock.Mock(), self.testdir)
|
||||
) as _ignored:
|
||||
_ignored # silence the linters
|
||||
fdroidserver.build.build_local(
|
||||
app,
|
||||
build,
|
||||
output_dir=self.testdir,
|
||||
log_dir=None,
|
||||
srclib_dir=None,
|
||||
extlib_dir=None,
|
||||
tmp_dir=None,
|
||||
force=False,
|
||||
onserver=False,
|
||||
refresh=False,
|
||||
)
|
||||
self.assertTrue(os.path.exists('baz.so'))
|
||||
self.assertTrue(os.path.exists('foo.aar'))
|
||||
self.assertFalse(os.path.exists('gradle-wrapper.jar'))
|
||||
|
|
|
@ -18,6 +18,9 @@
|
|||
import os
|
||||
import sys
|
||||
import tempfile
|
||||
import unittest
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class TmpCwd:
|
||||
|
@ -60,3 +63,12 @@ def mkdtemp():
|
|||
return tempfile.TemporaryDirectory()
|
||||
else:
|
||||
return tempfile.TemporaryDirectory(ignore_cleanup_errors=True)
|
||||
|
||||
|
||||
def mkdir_testfiles(localmodule, test):
|
||||
"""Keep the test files in a labeled test dir for easy reference"""
|
||||
testroot = Path(localmodule) / '.testfiles'
|
||||
testroot.mkdir(exist_ok=True)
|
||||
testdir = testroot / unittest.TestCase.id(test)
|
||||
testdir.mkdir(exist_ok=True)
|
||||
return tempfile.mkdtemp(dir=testdir)
|
||||
|
|
Loading…
Reference in New Issue