mirror of
				https://github.com/f-droid/fdroidserver.git
				synced 2025-11-04 06:30:27 +03:00 
			
		
		
		
	Merge branch 'update_test_improvements' into 'master'
test improvements/fixes See merge request fdroid/fdroidserver!791
This commit is contained in:
		
						commit
						1f7228d538
					
				
					 5 changed files with 62 additions and 30 deletions
				
			
		| 
						 | 
				
			
			@ -66,12 +66,17 @@ debian_testing:
 | 
			
		|||
    - apt-get install
 | 
			
		||||
        aapt
 | 
			
		||||
        androguard
 | 
			
		||||
        apksigner
 | 
			
		||||
        fdroidserver
 | 
			
		||||
        git
 | 
			
		||||
        gnupg
 | 
			
		||||
        python3-defusedxml
 | 
			
		||||
        python3-setuptools
 | 
			
		||||
        zipalign
 | 
			
		||||
    # Debian has apksigner depend on binfmt support which isn't very docker friendly
 | 
			
		||||
    # We create a shell wrapper instead
 | 
			
		||||
    - echo -e '#!/bin/sh\njava -jar /usr/lib/android-sdk/build-tools/debian/apksigner.jar "$@"' > /usr/local/bin/apksigner
 | 
			
		||||
    - chmod +x /usr/local/bin/apksigner
 | 
			
		||||
    - python3 -c 'import fdroidserver'
 | 
			
		||||
    - python3 -c 'import androguard'
 | 
			
		||||
    - cd tests
 | 
			
		||||
| 
						 | 
				
			
			@ -197,7 +202,7 @@ fedora_latest:
 | 
			
		|||
    - 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 AAPT_VERSION=`sed -n "s,^MINIMUM_AAPT_VERSION\s*=\s*['\"]\(.*\)[['\"],\1,p" fdroidserver/common.py`
 | 
			
		||||
    - 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
 | 
			
		||||
| 
						 | 
				
			
			@ -209,7 +214,7 @@ fedora_latest:
 | 
			
		|||
    - mkdir ~/.android
 | 
			
		||||
    - touch ~/.android/repositories.cfg
 | 
			
		||||
    - echo y | $ANDROID_HOME/tools/bin/sdkmanager "platform-tools"
 | 
			
		||||
    - echo y | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;$AAPT_VERSION"
 | 
			
		||||
    - echo y | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;$BUILD_TOOLS_VERSION"
 | 
			
		||||
    - chown -R testuser .
 | 
			
		||||
    - cd tests
 | 
			
		||||
    - su testuser --login --command
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -429,7 +429,11 @@ def find_apksigner():
 | 
			
		|||
    if set_command_in_config('apksigner'):
 | 
			
		||||
        return config['apksigner']
 | 
			
		||||
    build_tools_path = os.path.join(config['sdk_path'], 'build-tools')
 | 
			
		||||
    if not os.path.isdir(build_tools_path):
 | 
			
		||||
        return None
 | 
			
		||||
    for f in sorted(os.listdir(build_tools_path), reverse=True):
 | 
			
		||||
        if not os.path.isdir(os.path.join(build_tools_path, f)):
 | 
			
		||||
            continue
 | 
			
		||||
        if LooseVersion(f) < LooseVersion(MINIMUM_AAPT_BUILD_TOOLS_VERSION):
 | 
			
		||||
            return None
 | 
			
		||||
        if os.path.exists(os.path.join(build_tools_path, f, 'apksigner')):
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -675,6 +675,8 @@ class CommonTest(unittest.TestCase):
 | 
			
		|||
    def test_sign_apk_targetsdk_30(self):
 | 
			
		||||
        fdroidserver.common.config = None
 | 
			
		||||
        config = fdroidserver.common.read_config(fdroidserver.common.options)
 | 
			
		||||
        if not fdroidserver.common.find_apksigner():
 | 
			
		||||
            self.skipTest('SKIPPING as apksigner is not installed!')
 | 
			
		||||
        config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner')
 | 
			
		||||
        config['keyalias'] = 'sova'
 | 
			
		||||
        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,11 @@ import textwrap
 | 
			
		|||
from collections import OrderedDict
 | 
			
		||||
from unittest import mock
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
    from yaml import CSafeLoader as SafeLoader
 | 
			
		||||
except ImportError:
 | 
			
		||||
    from yaml import SafeLoader
 | 
			
		||||
 | 
			
		||||
localmodule = os.path.realpath(
 | 
			
		||||
    os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..'))
 | 
			
		||||
print('localmodule: ' + localmodule)
 | 
			
		||||
| 
						 | 
				
			
			@ -103,7 +108,7 @@ class MetadataTest(unittest.TestCase):
 | 
			
		|||
    def test_valid_funding_yml_regex(self):
 | 
			
		||||
        """Check the regex can find all the cases"""
 | 
			
		||||
        with open(os.path.join(self.basedir, 'funding-usernames.yaml')) as fp:
 | 
			
		||||
            data = yaml.safe_load(fp)
 | 
			
		||||
            data = yaml.load(fp, Loader=SafeLoader)
 | 
			
		||||
 | 
			
		||||
        for k, entries in data.items():
 | 
			
		||||
            for entry in entries:
 | 
			
		||||
| 
						 | 
				
			
			@ -135,8 +140,8 @@ class MetadataTest(unittest.TestCase):
 | 
			
		|||
            frommeta = dict(apps[appid])
 | 
			
		||||
            self.assertTrue(appid in apps)
 | 
			
		||||
            with open(savepath, 'r') as f:
 | 
			
		||||
                frompickle = yaml.load(f)
 | 
			
		||||
            self.assertEqual(frommeta, frompickle)
 | 
			
		||||
                from_yaml = yaml.load(f, Loader=SafeLoader)
 | 
			
		||||
            self.assertEqual(frommeta, from_yaml)
 | 
			
		||||
            # comment above assert and uncomment below to update test
 | 
			
		||||
            # files when new metadata fields are added
 | 
			
		||||
            # with open(savepath, 'w') as f:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,6 +21,22 @@ from binascii import unhexlify
 | 
			
		|||
from distutils.version import LooseVersion
 | 
			
		||||
from testcommon import TmpCwd
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
    from yaml import CSafeLoader as SafeLoader
 | 
			
		||||
except ImportError:
 | 
			
		||||
    from yaml import SafeLoader
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
    from yaml import CFullLoader as FullLoader
 | 
			
		||||
except ImportError:
 | 
			
		||||
    try:
 | 
			
		||||
        # FullLoader is available from PyYaml 5.1+, as we don't load user
 | 
			
		||||
        # controlled data here, it's okay to fall back the unsafe older
 | 
			
		||||
        # Loader
 | 
			
		||||
        from yaml import FullLoader
 | 
			
		||||
    except ImportError:
 | 
			
		||||
        from yaml import Loader as FullLoader
 | 
			
		||||
 | 
			
		||||
localmodule = os.path.realpath(
 | 
			
		||||
    os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..'))
 | 
			
		||||
print('localmodule: ' + localmodule)
 | 
			
		||||
| 
						 | 
				
			
			@ -207,6 +223,10 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
        shutil.copytree(os.path.join(self.basedir, 'triple-t-2'), tmptestsdir)
 | 
			
		||||
        os.chdir(tmptestsdir)
 | 
			
		||||
 | 
			
		||||
        config = dict()
 | 
			
		||||
        fdroidserver.common.fill_config_defaults(config)
 | 
			
		||||
        fdroidserver.common.config = config
 | 
			
		||||
        fdroidserver.update.config = config
 | 
			
		||||
        fdroidserver.update.options = fdroidserver.common.options
 | 
			
		||||
 | 
			
		||||
        apps = fdroidserver.metadata.read_metadata(xref=True)
 | 
			
		||||
| 
						 | 
				
			
			@ -339,9 +359,10 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
 | 
			
		||||
    def testScanApksAndObbs(self):
 | 
			
		||||
        os.chdir(os.path.join(localmodule, 'tests'))
 | 
			
		||||
        if os.path.basename(os.getcwd()) != 'tests':
 | 
			
		||||
            raise Exception('This test must be run in the "tests/" subdir')
 | 
			
		||||
 | 
			
		||||
        testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir)
 | 
			
		||||
        os.chdir(testdir)
 | 
			
		||||
        shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo')
 | 
			
		||||
        shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata')
 | 
			
		||||
        config = dict()
 | 
			
		||||
        fdroidserver.common.fill_config_defaults(config)
 | 
			
		||||
        config['ndk_paths'] = dict()
 | 
			
		||||
| 
						 | 
				
			
			@ -396,9 +417,9 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
    def test_apkcache_json(self):
 | 
			
		||||
        """test the migration from pickle to json"""
 | 
			
		||||
        os.chdir(os.path.join(localmodule, 'tests'))
 | 
			
		||||
        if os.path.basename(os.getcwd()) != 'tests':
 | 
			
		||||
            raise Exception('This test must be run in the "tests/" subdir')
 | 
			
		||||
 | 
			
		||||
        testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir)
 | 
			
		||||
        os.chdir(testdir)
 | 
			
		||||
        shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo')
 | 
			
		||||
        config = dict()
 | 
			
		||||
        fdroidserver.common.fill_config_defaults(config)
 | 
			
		||||
        config['ndk_paths'] = dict()
 | 
			
		||||
| 
						 | 
				
			
			@ -437,9 +458,6 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
        fdroidserver.common.config = config
 | 
			
		||||
        fdroidserver.update.config = config
 | 
			
		||||
        os.chdir(os.path.join(localmodule, 'tests'))
 | 
			
		||||
        if os.path.basename(os.getcwd()) != 'tests':
 | 
			
		||||
            raise Exception('This test must be run in the "tests/" subdir')
 | 
			
		||||
 | 
			
		||||
        try:
 | 
			
		||||
            config['aapt'] = fdroidserver.common.find_sdk_tools_cmd('aapt')
 | 
			
		||||
        except fdroidserver.exception.FDroidException:
 | 
			
		||||
| 
						 | 
				
			
			@ -466,17 +484,16 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
 | 
			
		||||
            print('USE_ANDROGUARD', use_androguard)
 | 
			
		||||
 | 
			
		||||
            try:
 | 
			
		||||
                apksigner = fdroidserver.common.find_sdk_tools_cmd('apksigner')
 | 
			
		||||
                if use_androguard and apksigner:  # v2 parsing needs both
 | 
			
		||||
            apksigner = fdroidserver.common.find_apksigner()
 | 
			
		||||
            if apksigner:
 | 
			
		||||
                if use_androguard:  # v2 parsing needs both
 | 
			
		||||
                    config['apksigner'] = apksigner
 | 
			
		||||
                    apk_info = fdroidserver.update.scan_apk('v2.only.sig_2.apk')
 | 
			
		||||
                    self.assertIsNone(apk_info.get('maxSdkVersion'))
 | 
			
		||||
                    self.assertEqual(apk_info.get('versionName'), 'v2-only')
 | 
			
		||||
                    self.assertEqual(apk_info.get('versionCode'), 2)
 | 
			
		||||
            except fdroidserver.exception.FDroidException:
 | 
			
		||||
            else:
 | 
			
		||||
                print('WARNING: skipping v2-only test since apksigner cannot be found')
 | 
			
		||||
 | 
			
		||||
            apk_info = fdroidserver.update.scan_apk('repo/v1.v2.sig_1020.apk')
 | 
			
		||||
            self.assertIsNone(apk_info.get('maxSdkVersion'))
 | 
			
		||||
            self.assertEqual(apk_info.get('versionName'), 'v1+2')
 | 
			
		||||
| 
						 | 
				
			
			@ -587,13 +604,10 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
        fdroidserver.common.fill_config_defaults(config)
 | 
			
		||||
        fdroidserver.update.config = config
 | 
			
		||||
        os.chdir(os.path.join(localmodule, 'tests'))
 | 
			
		||||
        if os.path.basename(os.getcwd()) != 'tests':
 | 
			
		||||
            raise Exception('This test must be run in the "tests/" subdir')
 | 
			
		||||
 | 
			
		||||
        config['ndk_paths'] = dict()
 | 
			
		||||
        fdroidserver.common.config = config
 | 
			
		||||
        fdroidserver.update.config = config
 | 
			
		||||
 | 
			
		||||
        fdroidserver.update.options = type('', (), {})()
 | 
			
		||||
        fdroidserver.update.options.clean = True
 | 
			
		||||
        fdroidserver.update.options.rename_apks = False
 | 
			
		||||
| 
						 | 
				
			
			@ -634,7 +648,7 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
            #     yaml.dump(apk, f, default_flow_style=False)
 | 
			
		||||
 | 
			
		||||
            with open(savepath, 'r') as f:
 | 
			
		||||
                from_yaml = yaml.load(f)
 | 
			
		||||
                from_yaml = yaml.load(f, Loader=FullLoader)
 | 
			
		||||
            self.maxDiff = None
 | 
			
		||||
            self.assertEqual(apk, from_yaml)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -743,6 +757,7 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
        fdroidserver.common.fill_config_defaults(config)
 | 
			
		||||
        fdroidserver.common.config = config
 | 
			
		||||
        fdroidserver.update.config = config
 | 
			
		||||
        fdroidserver.update.options = fdroidserver.common.options
 | 
			
		||||
        fdroidserver.update.options.delete_unknown = False
 | 
			
		||||
 | 
			
		||||
        knownapks = fdroidserver.common.KnownApks()
 | 
			
		||||
| 
						 | 
				
			
			@ -756,9 +771,10 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
 | 
			
		||||
    def test_translate_per_build_anti_features(self):
 | 
			
		||||
        os.chdir(os.path.join(localmodule, 'tests'))
 | 
			
		||||
        if os.path.basename(os.getcwd()) != 'tests':
 | 
			
		||||
            raise Exception('This test must be run in the "tests/" subdir')
 | 
			
		||||
 | 
			
		||||
        testdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir)
 | 
			
		||||
        os.chdir(testdir)
 | 
			
		||||
        shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo')
 | 
			
		||||
        shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata')
 | 
			
		||||
        config = dict()
 | 
			
		||||
        fdroidserver.common.fill_config_defaults(config)
 | 
			
		||||
        config['ndk_paths'] = dict()
 | 
			
		||||
| 
						 | 
				
			
			@ -844,7 +860,7 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
            self.assertEqual('Internet', app['Categories'][0])
 | 
			
		||||
            break
 | 
			
		||||
        with open(testfile) as fp:
 | 
			
		||||
            data = yaml.load(fp)
 | 
			
		||||
            data = yaml.load(fp, Loader=SafeLoader)
 | 
			
		||||
        self.assertEqual('urzip', data['Name'])
 | 
			
		||||
        self.assertEqual('urzip', data['Summary'])
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -943,7 +959,7 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
                    '''))
 | 
			
		||||
            fdroidserver.update.create_metadata_from_template(apk)
 | 
			
		||||
            with open(os.path.join('metadata', 'rocks.janicerand.yml')) as f:
 | 
			
		||||
                metadata_content = yaml.load(f)
 | 
			
		||||
                metadata_content = yaml.load(f, Loader=SafeLoader)
 | 
			
		||||
                self.maxDiff = None
 | 
			
		||||
                self.assertDictEqual(metadata_content,
 | 
			
		||||
                                     {'ArchivePolicy': '',
 | 
			
		||||
| 
						 | 
				
			
			@ -1050,7 +1066,7 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
            apps = {app.id: app}
 | 
			
		||||
            with open(os.path.join('build', app.id, 'FUNDING.yml'), 'w') as fp:
 | 
			
		||||
                fp.write(line)
 | 
			
		||||
            data = yaml.load(line)
 | 
			
		||||
            data = yaml.load(line, Loader=SafeLoader)
 | 
			
		||||
            fdroidserver.update.insert_funding_yml_donation_links(apps)
 | 
			
		||||
            if 'liberapay' in data:
 | 
			
		||||
                self.assertEqual(data['liberapay'], app.get('Liberapay'))
 | 
			
		||||
| 
						 | 
				
			
			@ -1080,7 +1096,7 @@ class UpdateTest(unittest.TestCase):
 | 
			
		|||
 | 
			
		||||
    def test_sanitize_funding_yml(self):
 | 
			
		||||
        with open(os.path.join(self.basedir, 'funding-usernames.yaml')) as fp:
 | 
			
		||||
            data = yaml.safe_load(fp)
 | 
			
		||||
            data = yaml.load(fp, Loader=SafeLoader)
 | 
			
		||||
        for k, entries in data.items():
 | 
			
		||||
            for entry in entries:
 | 
			
		||||
                if k in 'custom':
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue