diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 84644945..4c5140ad 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -281,35 +281,27 @@ fedora_latest: findutils git gnupg - java-1.8.0-openjdk-devel + java-17-openjdk-devel python3 python3-babel python3-matplotlib python3-pip rsync - unzip - wget which + - $pip install sdkmanager - ./setup.py sdist - useradd -m -c "test account" --password "fakepassword" testuser - su testuser --login --command "cd `pwd`; $pip install --user dist/fdroidserver-*.tar.gz" - test -e ~testuser/.local/share/locale/de/LC_MESSAGES/fdroidserver.mo - - wget --no-verbose -O tools.zip https://dl.google.com/android/repository/tools_r25.2.5-linux.zip - - unzip -q tools.zip - - rm tools.zip - export BUILD_TOOLS_VERSION=`sed -n "s,^MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION\s*=\s*['\"]\(.*\)[['\"],\1,p" fdroidserver/common.py` - - export JAVA_HOME=/etc/alternatives/jre - export ANDROID_HOME=`pwd`/android-sdk - - mkdir $ANDROID_HOME - - mv tools $ANDROID_HOME/ - mkdir -p $ANDROID_HOME/licenses/ - printf "\n8933bad161af4178b1185d1a37fbf41ea5269c55\nd56f5187479451eabf01fb78af6dfcb131a6481e\n24333f8a63b6825ea9c5514f83c2829b004d1fee" > $ANDROID_HOME/licenses/android-sdk-license - printf "\n84831b9409646a918e30573bab4c9c91346d8abd" > $ANDROID_HOME/licenses/android-sdk-preview-license - printf "\n79120722343a6f314e0719f863036c702b0e6b2a\n84831b9409646a918e30573bab4c9c91346d8abd" > $ANDROID_HOME/licenses/android-sdk-preview-license-old - mkdir ~/.android - touch ~/.android/repositories.cfg - - echo y | $ANDROID_HOME/tools/bin/sdkmanager "platform-tools" > /dev/null - - echo y | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;$BUILD_TOOLS_VERSION" > /dev/null + - sdkmanager "platform-tools" "build-tools;$BUILD_TOOLS_VERSION" - chown -R testuser . - cd tests - su testuser --login --command @@ -453,7 +445,7 @@ plugin_fetchsrclibs: # test a full update and deploy cycle to gitlab.com servergitmirrors: - image: debian:buster + image: debian:bullseye-backports <<: *apt-template only: - master@fdroid/fdroidserver @@ -470,12 +462,15 @@ servergitmirrors: python3-pil python3-pip python3-pycparser + python3-setuptools python3-venv rsync wget + - apt-get install -t bullseye-backports apksigner - python3 -m venv --system-site-packages env - . env/bin/activate - export PYTHONPATH=`pwd` + - export SETUPTOOLS_USE_DISTUTILS=stdlib # https://github.com/pypa/setuptools/issues/2956 - $pip install -e . - mkdir /root/.ssh/ - ./tests/key-tricks.py diff --git a/tests/build.TestCase b/tests/build.TestCase index 7558237d..13378060 100755 --- a/tests/build.TestCase +++ b/tests/build.TestCase @@ -26,6 +26,7 @@ import fdroidserver.build import fdroidserver.common import fdroidserver.metadata import fdroidserver.scanner +import fdroidserver.vmtools class FakeProcess: @@ -544,6 +545,93 @@ class BuildTest(unittest.TestCase): self.assertFalse(os.path.exists(production_result)) self.assertFalse(os.path.exists(production_compare_file)) + @mock.patch('fdroidserver.vmtools.get_build_vm') + @mock.patch('fdroidserver.vmtools.get_clean_builder') + @mock.patch('paramiko.SSHClient') + @mock.patch('subprocess.check_output') + def test_build_server_cmdline( + self, + subprocess_check_output, + paramiko_SSHClient, + fdroidserver_vmtools_get_clean_builder, + fdroidserver_vmtools_get_build_vm, + ): + """Test command line flags passed to the buildserver""" + global cmdline_args + test_flag = ['', False] + + def _exec_command(args): + flag = test_flag[0] + if test_flag[1]: + self.assertTrue(flag in args, flag + ' should be present') + else: + self.assertFalse(flag in args, flag + ' should not be present') + + testdir = tempfile.mkdtemp( + prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir + ) + os.chdir(testdir) + os.mkdir('tmp') + + chan = mock.MagicMock() + chan.exec_command = _exec_command + chan.recv_exit_status = lambda: 0 + transport = mock.MagicMock() + transport.open_session = mock.Mock(return_value=chan) + sshs = mock.MagicMock() + sshs.get_transport = mock.Mock(return_value=transport) + paramiko_SSHClient.return_value = sshs + subprocess_check_output.return_value = ( + b'0123456789abcdef0123456789abcdefcafebabe' + ) + fdroidserver_vmtools_get_clean_builder.side_effect = lambda s: { + 'hostname': 'example.com', + 'idfile': '/path/to/id/file', + 'port': 123, + 'user': 'fake', + } + 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' + app['RepoType'] = 'git' + build = fdroidserver.metadata.Build( + { + 'versionCode': 123, + 'versionName': '1.2.3', + 'commit': '1.2.3', + 'disable': False, + } + ) + app['Builds'] = [build] + + test_flag = ('--on-server', True) + fdroidserver.build.build_server(app, build, vcs, '', '', '', 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) + + 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.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) + if __name__ == "__main__": os.chdir(os.path.dirname(__file__)) diff --git a/tests/common.TestCase b/tests/common.TestCase index 6c22c9e6..d90bb180 100755 --- a/tests/common.TestCase +++ b/tests/common.TestCase @@ -21,6 +21,7 @@ import textwrap import yaml import gzip import stat +from distutils.version import LooseVersion from zipfile import BadZipFile, ZipFile, ZipInfo from unittest import mock from pathlib import Path @@ -782,6 +783,7 @@ class CommonTest(unittest.TestCase): self.assertEqual(apksigner, config.get('apksigner')) def test_find_apksigner_system_package_android_home(self): + """Test that apksigner v30 or newer is found""" testdir = tempfile.mkdtemp( prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir ) @@ -789,8 +791,19 @@ class CommonTest(unittest.TestCase): android_home = os.getenv('ANDROID_HOME') if not android_home or not os.path.isdir(android_home): self.skipTest('SKIPPING since ANDROID_HOME (%s) is not a dir!' % android_home) - if not glob.glob(os.path.join(android_home, 'build-tools', '*', 'apksigner')): + build_tools = glob.glob(os.path.join(android_home, 'build-tools', '*', 'apksigner')) + if not build_tools: self.skipTest('SKIPPING since ANDROID_HOME (%s) build-tools has no apksigner!' % android_home) + min_version = fdroidserver.common.MINIMUM_APKSIGNER_BUILD_TOOLS_VERSION + version = '0' + for bt in sorted(build_tools): + v = bt.split('/')[-2] + if v == 'debian': + continue + if LooseVersion(version) < LooseVersion(v): + version = v + if LooseVersion(version) < LooseVersion(min_version): + self.skipTest('SKIPPING since build-tools %s or higher is required!' % min_version) fdroidserver.common.config = {'sdk_path': android_home} os.environ['PATH'] = '/fake/path/to/avoid/conflicts' config = fdroidserver.common.read_config()