mirror of
				https://github.com/f-droid/fdroidserver.git
				synced 2025-11-04 14:30:30 +03:00 
			
		
		
		
	Refactor TestCase files into python modules
Convert all TestCase files into standard python modules to be run and discovered by unittest.
This commit is contained in:
		
							parent
							
								
									4d6682bc70
								
							
						
					
					
						commit
						7ff32bc4b0
					
				
					 34 changed files with 471 additions and 1260 deletions
				
			
		| 
						 | 
					@ -252,7 +252,6 @@ lint_format_bandit_checks:
 | 
				
			||||||
            setup.py
 | 
					            setup.py
 | 
				
			||||||
            fdroidserver/*.py
 | 
					            fdroidserver/*.py
 | 
				
			||||||
            tests/*.py
 | 
					            tests/*.py
 | 
				
			||||||
            tests/*.TestCase
 | 
					 | 
				
			||||||
        || set_error
 | 
					        || set_error
 | 
				
			||||||
    - shellcheck --exclude SC2046,SC2090 --severity=warning --color tests/run-tests
 | 
					    - shellcheck --exclude SC2046,SC2090 --severity=warning --color tests/run-tests
 | 
				
			||||||
        || set_error
 | 
					        || set_error
 | 
				
			||||||
| 
						 | 
					@ -619,10 +618,10 @@ Windows:
 | 
				
			||||||
    - python -m pip install --upgrade babel pip setuptools
 | 
					    - python -m pip install --upgrade babel pip setuptools
 | 
				
			||||||
    - python -m pip install -e .
 | 
					    - python -m pip install -e .
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - $files = @(Get-ChildItem tests\*.TestCase)
 | 
					    - $files = @(Get-ChildItem tests\test_*.py)
 | 
				
			||||||
    - foreach ($f in $files) {
 | 
					    - foreach ($f in $files) {
 | 
				
			||||||
          write-output $f;
 | 
					          write-output $f;
 | 
				
			||||||
          python $f;
 | 
					          python -m unittest $f;
 | 
				
			||||||
          if( $LASTEXITCODE -eq 0 ) {
 | 
					          if( $LASTEXITCODE -eq 0 ) {
 | 
				
			||||||
              write-output "SUCCESS $f";
 | 
					              write-output "SUCCESS $f";
 | 
				
			||||||
          } else {
 | 
					          } else {
 | 
				
			||||||
| 
						 | 
					@ -631,15 +630,16 @@ Windows:
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # these are the tests that must pass
 | 
					    # these are the tests that must pass
 | 
				
			||||||
    - python tests\checkupdates.TestCase
 | 
					    - python -m unittest -k
 | 
				
			||||||
    - python tests\exception.TestCase
 | 
					        checkupdates
 | 
				
			||||||
    - python tests\import_subcommand.TestCase
 | 
					        exception
 | 
				
			||||||
    - python tests\init.TestCase
 | 
					        import_subcommand
 | 
				
			||||||
    - python tests\lint.TestCase
 | 
					        test_lint
 | 
				
			||||||
    - python tests\main.TestCase
 | 
					        test_metadata
 | 
				
			||||||
    - python tests\metadata.TestCase
 | 
					        test_rewritemeta
 | 
				
			||||||
    - python tests\rewritemeta.TestCase
 | 
					        test_vcs
 | 
				
			||||||
    - python tests\vcs.TestCase
 | 
					        tests.test_init
 | 
				
			||||||
 | 
					        tests.test_main
 | 
				
			||||||
  after_script:
 | 
					  after_script:
 | 
				
			||||||
    - Copy-Item C:\ProgramData\chocolatey\logs\chocolatey.log
 | 
					    - Copy-Item C:\ProgramData\chocolatey\logs\chocolatey.log
 | 
				
			||||||
  artifacts:
 | 
					  artifacts:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										41
									
								
								MANIFEST.in
									
										
									
									
									
								
							
							
						
						
									
										41
									
								
								MANIFEST.in
									
										
									
									
									
								
							| 
						 | 
					@ -50,7 +50,6 @@ include README.md
 | 
				
			||||||
include tests/aosp_testkey_debug.keystore
 | 
					include tests/aosp_testkey_debug.keystore
 | 
				
			||||||
include tests/apk.embedded_1.apk
 | 
					include tests/apk.embedded_1.apk
 | 
				
			||||||
include tests/bad-unicode-*.apk
 | 
					include tests/bad-unicode-*.apk
 | 
				
			||||||
include tests/build.TestCase
 | 
					 | 
				
			||||||
include tests/build-tools/17.0.0/aapt-output-com.moez.QKSMS_182.txt
 | 
					include tests/build-tools/17.0.0/aapt-output-com.moez.QKSMS_182.txt
 | 
				
			||||||
include tests/build-tools/17.0.0/aapt-output-com.politedroid_3.txt
 | 
					include tests/build-tools/17.0.0/aapt-output-com.politedroid_3.txt
 | 
				
			||||||
include tests/build-tools/17.0.0/aapt-output-com.politedroid_4.txt
 | 
					include tests/build-tools/17.0.0/aapt-output-com.politedroid_4.txt
 | 
				
			||||||
| 
						 | 
					@ -547,9 +546,7 @@ include tests/build-tools/28.0.3/aapt-output-obb.main.twoversions_1101617.txt
 | 
				
			||||||
include tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt
 | 
					include tests/build-tools/28.0.3/aapt-output-souch.smsbypass_9.txt
 | 
				
			||||||
include tests/build-tools/generate.sh
 | 
					include tests/build-tools/generate.sh
 | 
				
			||||||
include tests/check-fdroid-apk
 | 
					include tests/check-fdroid-apk
 | 
				
			||||||
include tests/checkupdates.TestCase
 | 
					 | 
				
			||||||
include tests/com.fake.IpaApp_1000000000001.ipa
 | 
					include tests/com.fake.IpaApp_1000000000001.ipa
 | 
				
			||||||
include tests/common.TestCase
 | 
					 | 
				
			||||||
include tests/config.py
 | 
					include tests/config.py
 | 
				
			||||||
include tests/config/antiFeatures.yml
 | 
					include tests/config/antiFeatures.yml
 | 
				
			||||||
include tests/config/categories.yml
 | 
					include tests/config/categories.yml
 | 
				
			||||||
| 
						 | 
					@ -569,10 +566,8 @@ include tests/config/ic_antifeature_upstreamnonfree.xml
 | 
				
			||||||
include tests/config/ro/antiFeatures.yml
 | 
					include tests/config/ro/antiFeatures.yml
 | 
				
			||||||
include tests/config/zh-rCN/antiFeatures.yml
 | 
					include tests/config/zh-rCN/antiFeatures.yml
 | 
				
			||||||
include tests/corrupt-featureGraphic.png
 | 
					include tests/corrupt-featureGraphic.png
 | 
				
			||||||
include tests/deploy.TestCase
 | 
					 | 
				
			||||||
include tests/dummy-keystore.jks
 | 
					include tests/dummy-keystore.jks
 | 
				
			||||||
include tests/dump_internal_metadata_format.py
 | 
					include tests/dump_internal_metadata_format.py
 | 
				
			||||||
include tests/exception.TestCase
 | 
					 | 
				
			||||||
include tests/extra/manual-vmtools-test.py
 | 
					include tests/extra/manual-vmtools-test.py
 | 
				
			||||||
include tests/funding-usernames.yaml
 | 
					include tests/funding-usernames.yaml
 | 
				
			||||||
include tests/get_android_tools_versions/android-ndk-r10e/RELEASE.TXT
 | 
					include tests/get_android_tools_versions/android-ndk-r10e/RELEASE.TXT
 | 
				
			||||||
| 
						 | 
					@ -591,10 +586,6 @@ include tests/gnupghome/secring.gpg
 | 
				
			||||||
include tests/gnupghome/trustdb.gpg
 | 
					include tests/gnupghome/trustdb.gpg
 | 
				
			||||||
include tests/gradle-maven-blocks.yaml
 | 
					include tests/gradle-maven-blocks.yaml
 | 
				
			||||||
include tests/gradle-release-checksums.py
 | 
					include tests/gradle-release-checksums.py
 | 
				
			||||||
include tests/import_subcommand.TestCase
 | 
					 | 
				
			||||||
include tests/index.TestCase
 | 
					 | 
				
			||||||
include tests/init.TestCase
 | 
					 | 
				
			||||||
include tests/install.TestCase
 | 
					 | 
				
			||||||
include tests/IsMD5Disabled.java
 | 
					include tests/IsMD5Disabled.java
 | 
				
			||||||
include tests/issue-1128-min-sdk-30-poc.apk
 | 
					include tests/issue-1128-min-sdk-30-poc.apk
 | 
				
			||||||
include tests/issue-1128-poc1.apk
 | 
					include tests/issue-1128-poc1.apk
 | 
				
			||||||
| 
						 | 
					@ -604,8 +595,6 @@ include tests/issue-1128-poc3b.apk
 | 
				
			||||||
include tests/janus.apk
 | 
					include tests/janus.apk
 | 
				
			||||||
include tests/keystore.jks
 | 
					include tests/keystore.jks
 | 
				
			||||||
include tests/key-tricks.py
 | 
					include tests/key-tricks.py
 | 
				
			||||||
include tests/lint.TestCase
 | 
					 | 
				
			||||||
include tests/main.TestCase
 | 
					 | 
				
			||||||
include tests/metadata/apk/info.guardianproject.urzip.yaml
 | 
					include tests/metadata/apk/info.guardianproject.urzip.yaml
 | 
				
			||||||
include tests/metadata/apk/org.dyndns.fules.ck.yaml
 | 
					include tests/metadata/apk/org.dyndns.fules.ck.yaml
 | 
				
			||||||
include tests/metadata/app.with.special.build.params.yml
 | 
					include tests/metadata/app.with.special.build.params.yml
 | 
				
			||||||
| 
						 | 
					@ -660,10 +649,7 @@ include tests/metadata-rewrite-yml/app.with.special.build.params.yml
 | 
				
			||||||
include tests/metadata-rewrite-yml/fake.ota.update.yml
 | 
					include tests/metadata-rewrite-yml/fake.ota.update.yml
 | 
				
			||||||
include tests/metadata-rewrite-yml/org.fdroid.fdroid.yml
 | 
					include tests/metadata-rewrite-yml/org.fdroid.fdroid.yml
 | 
				
			||||||
include tests/metadata/souch.smsbypass.yml
 | 
					include tests/metadata/souch.smsbypass.yml
 | 
				
			||||||
include tests/metadata.TestCase
 | 
					 | 
				
			||||||
include tests/minimal_targetsdk_30_unsigned.apk
 | 
					include tests/minimal_targetsdk_30_unsigned.apk
 | 
				
			||||||
include tests/net.TestCase
 | 
					 | 
				
			||||||
include tests/nightly.TestCase
 | 
					 | 
				
			||||||
include tests/Norway_bouvet_europe_2.obf.zip
 | 
					include tests/Norway_bouvet_europe_2.obf.zip
 | 
				
			||||||
include tests/no_targetsdk_minsdk1_unsigned.apk
 | 
					include tests/no_targetsdk_minsdk1_unsigned.apk
 | 
				
			||||||
include tests/no_targetsdk_minsdk30_unsigned.apk
 | 
					include tests/no_targetsdk_minsdk30_unsigned.apk
 | 
				
			||||||
| 
						 | 
					@ -674,7 +660,6 @@ include tests/org.bitbucket.tickytacky.mirrormirror_3.apk
 | 
				
			||||||
include tests/org.bitbucket.tickytacky.mirrormirror_4.apk
 | 
					include tests/org.bitbucket.tickytacky.mirrormirror_4.apk
 | 
				
			||||||
include tests/org.dyndns.fules.ck_20.apk
 | 
					include tests/org.dyndns.fules.ck_20.apk
 | 
				
			||||||
include tests/org.sajeg.fallingblocks_3.apk
 | 
					include tests/org.sajeg.fallingblocks_3.apk
 | 
				
			||||||
include tests/publish.TestCase
 | 
					 | 
				
			||||||
include tests/repo/com.example.test.helloworld_1.apk
 | 
					include tests/repo/com.example.test.helloworld_1.apk
 | 
				
			||||||
include tests/repo/com.politedroid_3.apk
 | 
					include tests/repo/com.politedroid_3.apk
 | 
				
			||||||
include tests/repo/com.politedroid_4.apk
 | 
					include tests/repo/com.politedroid_4.apk
 | 
				
			||||||
| 
						 | 
					@ -732,13 +717,9 @@ include tests/repo/patch.1619.obb.mainpatch.current.obb
 | 
				
			||||||
include tests/repo/souch.smsbypass_9.apk
 | 
					include tests/repo/souch.smsbypass_9.apk
 | 
				
			||||||
include tests/repo/urzip-*.apk
 | 
					include tests/repo/urzip-*.apk
 | 
				
			||||||
include tests/repo/v1.v2.sig_1020.apk
 | 
					include tests/repo/v1.v2.sig_1020.apk
 | 
				
			||||||
include tests/rewritemeta.TestCase
 | 
					 | 
				
			||||||
include tests/run-tests
 | 
					include tests/run-tests
 | 
				
			||||||
include tests/SANAPPSI.RSA
 | 
					include tests/SANAPPSI.RSA
 | 
				
			||||||
include tests/SANAPPSI.SF
 | 
					include tests/SANAPPSI.SF
 | 
				
			||||||
include tests/scanner.TestCase
 | 
					 | 
				
			||||||
include tests/signatures.TestCase
 | 
					 | 
				
			||||||
include tests/signindex.TestCase
 | 
					 | 
				
			||||||
include tests/signindex/guardianproject.jar
 | 
					include tests/signindex/guardianproject.jar
 | 
				
			||||||
include tests/signindex/guardianproject-v1.jar
 | 
					include tests/signindex/guardianproject-v1.jar
 | 
				
			||||||
include tests/signindex/testy.jar
 | 
					include tests/signindex/testy.jar
 | 
				
			||||||
| 
						 | 
					@ -864,7 +845,27 @@ include tests/source-files/yuriykulikov/AlarmClock/gradle/wrapper/gradle-wrapper
 | 
				
			||||||
include tests/source-files/Zillode/syncthing-silk/build.gradle
 | 
					include tests/source-files/Zillode/syncthing-silk/build.gradle
 | 
				
			||||||
include tests/SpeedoMeterApp.main_1.apk
 | 
					include tests/SpeedoMeterApp.main_1.apk
 | 
				
			||||||
include tests/testcommon.py
 | 
					include tests/testcommon.py
 | 
				
			||||||
 | 
					include tests/test_build.py
 | 
				
			||||||
 | 
					include tests/test_checkupdates.py
 | 
				
			||||||
 | 
					include tests/test_common.py
 | 
				
			||||||
 | 
					include tests/test_deploy.py
 | 
				
			||||||
 | 
					include tests/test_exception.py
 | 
				
			||||||
include tests/test_gradlew-fdroid
 | 
					include tests/test_gradlew-fdroid
 | 
				
			||||||
 | 
					include tests/test_import_subcommand.py
 | 
				
			||||||
 | 
					include tests/test_index.py
 | 
				
			||||||
 | 
					include tests/test_init.py
 | 
				
			||||||
 | 
					include tests/test_install.py
 | 
				
			||||||
 | 
					include tests/test_lint.py
 | 
				
			||||||
 | 
					include tests/test_main.py
 | 
				
			||||||
 | 
					include tests/test_metadata.py
 | 
				
			||||||
 | 
					include tests/test_nightly.py
 | 
				
			||||||
 | 
					include tests/test_publish.py
 | 
				
			||||||
 | 
					include tests/test_rewritemeta.py
 | 
				
			||||||
 | 
					include tests/test_scanner.py
 | 
				
			||||||
 | 
					include tests/test_signatures.py
 | 
				
			||||||
 | 
					include tests/test_signindex.py
 | 
				
			||||||
 | 
					include tests/test_update.py
 | 
				
			||||||
 | 
					include tests/test_vcs.py
 | 
				
			||||||
include tests/triple-t-2/build/org.piwigo.android/app/build.gradle
 | 
					include tests/triple-t-2/build/org.piwigo.android/app/build.gradle
 | 
				
			||||||
include tests/triple-t-2/build/org.piwigo.android/app/.gitignore
 | 
					include tests/triple-t-2/build/org.piwigo.android/app/.gitignore
 | 
				
			||||||
include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml
 | 
					include tests/triple-t-2/build/org.piwigo.android/app/src/debug/res/values/constants.xml
 | 
				
			||||||
| 
						 | 
					@ -921,7 +922,6 @@ include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/verif
 | 
				
			||||||
include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt
 | 
					include tests/triple-t-multiple/build/ch.admin.bag.covidcertificate.wallet/wallet/src/main/play/listings/en-US/title.txt
 | 
				
			||||||
include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml
 | 
					include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.verifier.yml
 | 
				
			||||||
include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml
 | 
					include tests/triple-t-multiple/metadata/ch.admin.bag.covidcertificate.wallet.yml
 | 
				
			||||||
include tests/update.TestCase
 | 
					 | 
				
			||||||
include tests/urzip.apk
 | 
					include tests/urzip.apk
 | 
				
			||||||
include tests/urzip-badcert.apk
 | 
					include tests/urzip-badcert.apk
 | 
				
			||||||
include tests/urzip-badsig.apk
 | 
					include tests/urzip-badsig.apk
 | 
				
			||||||
| 
						 | 
					@ -931,4 +931,3 @@ include tests/v2.only.sig_2.apk
 | 
				
			||||||
include tests/valid-package-names/random-package-names
 | 
					include tests/valid-package-names/random-package-names
 | 
				
			||||||
include tests/valid-package-names/RandomPackageNames.java
 | 
					include tests/valid-package-names/RandomPackageNames.java
 | 
				
			||||||
include tests/valid-package-names/test.py
 | 
					include tests/valid-package-names/test.py
 | 
				
			||||||
include tests/vcs.TestCase
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,13 +53,13 @@ To run the full test suite:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tests/run-tests
 | 
					    tests/run-tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To run the tests for individual Python modules, see the _.TestCase_ files, e.g.:
 | 
					To run the tests for individual Python modules, see the `tests/test_*.py` files, e.g.:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tests/metadata.TestCase
 | 
					    python -m unittest tests/test_metadata.py
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It is also possible to run individual tests:
 | 
					It is also possible to run individual tests:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tests/metadata.TestCase MetadataTest.test_rewrite_yaml_special_build_params
 | 
					    python -m unittest tests.test_metadata.MetadataTest.test_rewrite_yaml_special_build_params
 | 
				
			||||||
 | 
					
 | 
				
			||||||
There is a growing test suite that has good coverage on a number of key parts of
 | 
					There is a growing test suite that has good coverage on a number of key parts of
 | 
				
			||||||
this code base.  It does not yet cover all the code, and there are some parts
 | 
					this code base.  It does not yet cover all the code, and there are some parts
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,7 +9,7 @@ exec 1>&2
 | 
				
			||||||
files=`git diff-index --cached HEAD 2>&1 | sed 's/^:.*     //' | uniq | cut -b100-500`
 | 
					files=`git diff-index --cached HEAD 2>&1 | sed 's/^:.*     //' | uniq | cut -b100-500`
 | 
				
			||||||
if [ -z "$files" ]; then
 | 
					if [ -z "$files" ]; then
 | 
				
			||||||
    PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py tests/*-release-checksums.py"
 | 
					    PY_FILES="fdroid makebuildserver setup.py fdroidserver/*.py examples/*.py tests/*-release-checksums.py"
 | 
				
			||||||
    PY_TEST_FILES="tests/*.TestCase"
 | 
					    PY_TEST_FILES="tests/test_*.py"
 | 
				
			||||||
    SH_FILES="hooks/pre-commit"
 | 
					    SH_FILES="hooks/pre-commit"
 | 
				
			||||||
    BASH_FILES="gradlew-fdroid jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*"
 | 
					    BASH_FILES="gradlew-fdroid jenkins-build-all jenkins-setup-build-environment jenkins-test completion/bash-completion buildserver/provision-*"
 | 
				
			||||||
    RB_FILES="buildserver/Vagrantfile"
 | 
					    RB_FILES="buildserver/Vagrantfile"
 | 
				
			||||||
| 
						 | 
					@ -27,12 +27,12 @@ else
 | 
				
			||||||
    for f in $files; do
 | 
					    for f in $files; do
 | 
				
			||||||
        test -e $f || continue
 | 
					        test -e $f || continue
 | 
				
			||||||
        case $f in
 | 
					        case $f in
 | 
				
			||||||
 | 
					            test_*.py)
 | 
				
			||||||
 | 
					                PY_TEST_FILES+=" $f"
 | 
				
			||||||
 | 
					                ;;
 | 
				
			||||||
            *.py)
 | 
					            *.py)
 | 
				
			||||||
                PY_FILES+=" $f"
 | 
					                PY_FILES+=" $f"
 | 
				
			||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
            *.TestCase)
 | 
					 | 
				
			||||||
                PY_TEST_FILES+=" $f"
 | 
					 | 
				
			||||||
                ;;
 | 
					 | 
				
			||||||
            *.rb)
 | 
					            *.rb)
 | 
				
			||||||
                RB_FILES+=" $f"
 | 
					                RB_FILES+=" $f"
 | 
				
			||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@ ignore = "E123,E203,E402,E501,W503"
 | 
				
			||||||
[tool.black]
 | 
					[tool.black]
 | 
				
			||||||
skip-string-normalization = true
 | 
					skip-string-normalization = true
 | 
				
			||||||
target-version = ["py38"]
 | 
					target-version = ["py38"]
 | 
				
			||||||
include = '(^fdroid|\.pyi?|\.TestCase)$'
 | 
					include = '(^fdroid|\.pyi?)$'
 | 
				
			||||||
# These files will never be included in black runs.  To run black on
 | 
					# These files will never be included in black runs.  To run black on
 | 
				
			||||||
# one of thes files, remove it from this list.
 | 
					# one of thes files, remove it from this list.
 | 
				
			||||||
force-exclude = '''(
 | 
					force-exclude = '''(
 | 
				
			||||||
| 
						 | 
					@ -49,10 +49,10 @@ force-exclude = '''(
 | 
				
			||||||
  | tests/gradle-release-checksums\.py
 | 
					  | tests/gradle-release-checksums\.py
 | 
				
			||||||
  | tests/openssl-version-check-test\.py
 | 
					  | tests/openssl-version-check-test\.py
 | 
				
			||||||
  | tests/valid-package-names/test\.py
 | 
					  | tests/valid-package-names/test\.py
 | 
				
			||||||
  | tests/common\.TestCase
 | 
					  | tests/test_common\.py
 | 
				
			||||||
  | tests/publish\.TestCase
 | 
					  | tests/test_publish\.py
 | 
				
			||||||
  | tests/signatures\.TestCase
 | 
					  | tests/test_signatures\.py
 | 
				
			||||||
  | tests/update\.TestCase
 | 
					  | tests/test_update\.py
 | 
				
			||||||
)$'''
 | 
					)$'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										0
									
								
								tests/__init__.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								tests/__init__.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -1,91 +0,0 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					 | 
				
			||||||
import shutil
 | 
					 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
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)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import fdroidserver.init
 | 
					 | 
				
			||||||
from testcommon import mkdtemp, parse_args_for_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class InitTest(unittest.TestCase):
 | 
					 | 
				
			||||||
    '''fdroidserver/init.py'''
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def setUp(self):
 | 
					 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					 | 
				
			||||||
        self.basedir = os.path.join(localmodule, 'tests')
 | 
					 | 
				
			||||||
        fdroidserver.common.config = None
 | 
					 | 
				
			||||||
        fdroidserver.init.config = None
 | 
					 | 
				
			||||||
        self._td = mkdtemp()
 | 
					 | 
				
			||||||
        self.testdir = self._td.name
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def tearDown(self):
 | 
					 | 
				
			||||||
        self._td.cleanup()
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def test_disable_in_config(self):
 | 
					 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					 | 
				
			||||||
        with open('config.yml', 'w') as fp:
 | 
					 | 
				
			||||||
            fp.write('keystore: NONE\n')
 | 
					 | 
				
			||||||
            fp.write('keypass: mysupersecrets\n')
 | 
					 | 
				
			||||||
        os.chmod('config.yml', 0o600)
 | 
					 | 
				
			||||||
        config = fdroidserver.common.read_config()
 | 
					 | 
				
			||||||
        self.assertEqual('NONE', config['keystore'])
 | 
					 | 
				
			||||||
        self.assertEqual('mysupersecrets', config['keypass'])
 | 
					 | 
				
			||||||
        fdroidserver.init.disable_in_config('keypass', 'comment')
 | 
					 | 
				
			||||||
        with open(fp.name) as fp:
 | 
					 | 
				
			||||||
            self.assertTrue('#keypass:' in fp.read())
 | 
					 | 
				
			||||||
        fdroidserver.common.config = None
 | 
					 | 
				
			||||||
        config = fdroidserver.common.read_config()
 | 
					 | 
				
			||||||
        self.assertIsNone(config.get('keypass'))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @unittest.skipIf(os.name == 'nt', "calling main() like this hangs on Windows")
 | 
					 | 
				
			||||||
    def test_main_in_empty_dir(self):
 | 
					 | 
				
			||||||
        """Test that `fdroid init` will find apksigner and add it to the config"""
 | 
					 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        bindir = os.path.join(os.getcwd(), 'bin')
 | 
					 | 
				
			||||||
        os.mkdir(bindir)
 | 
					 | 
				
			||||||
        apksigner = os.path.join(bindir, 'apksigner')
 | 
					 | 
				
			||||||
        open(apksigner, 'w').close()
 | 
					 | 
				
			||||||
        os.chmod(apksigner, 0o755)
 | 
					 | 
				
			||||||
        os.environ['PATH'] = bindir
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        sys.argv = ['fdroid init', '--keystore', 'keystore.jks', '--repo-keyalias=sova']
 | 
					 | 
				
			||||||
        fdroidserver.init.main()
 | 
					 | 
				
			||||||
        self.assertEqual(apksigner, fdroidserver.init.config.get('apksigner'))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    fdroidserver.init.options = parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(InitTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -170,15 +170,7 @@ test -x ./hooks/pre-commit && ./hooks/pre-commit
 | 
				
			||||||
#------------------------------------------------------------------------------#
 | 
					#------------------------------------------------------------------------------#
 | 
				
			||||||
echo_header "run unit tests"
 | 
					echo_header "run unit tests"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cd $WORKSPACE/tests
 | 
					python3 -m unittest -v
 | 
				
			||||||
for testcase in $WORKSPACE/tests/*.TestCase; do
 | 
					 | 
				
			||||||
    if [ $(uname) != "Linux" ] && [ $testcase == $WORKSPACE/tests/nightly.TestCase ]; then
 | 
					 | 
				
			||||||
        echo "skipping nightly.TestCase, it currently only works GNU/Linux"
 | 
					 | 
				
			||||||
        continue
 | 
					 | 
				
			||||||
    fi
 | 
					 | 
				
			||||||
    $testcase
 | 
					 | 
				
			||||||
done
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#------------------------------------------------------------------------------#
 | 
					#------------------------------------------------------------------------------#
 | 
				
			||||||
echo_header "print fdroid version"
 | 
					echo_header "print fdroid version"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,22 +1,17 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
 | 
					from pathlib import Path
 | 
				
			||||||
from unittest import mock
 | 
					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
 | 
					import fdroidserver
 | 
				
			||||||
from fdroidserver import common, signindex
 | 
					from fdroidserver import common, signindex
 | 
				
			||||||
from testcommon import GP_FINGERPRINT, mkdtemp
 | 
					from .testcommon import GP_FINGERPRINT, mkdtemp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ApiTest(unittest.TestCase):
 | 
					class ApiTest(unittest.TestCase):
 | 
				
			||||||
| 
						 | 
					@ -29,8 +24,7 @@ class ApiTest(unittest.TestCase):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        self.basedir = os.path.join(localmodule, 'tests')
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self._td = mkdtemp()
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
        self.testdir = self._td.name
 | 
					        self.testdir = self._td.name
 | 
				
			||||||
| 
						 | 
					@ -89,10 +83,10 @@ class ApiTest(unittest.TestCase):
 | 
				
			||||||
            self.testdir, 'repo', os.path.basename(mirrors[0]['url'])
 | 
					            self.testdir, 'repo', os.path.basename(mirrors[0]['url'])
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks')
 | 
					        signindex.config['keystore'] = os.path.join(basedir, 'keystore.jks')
 | 
				
			||||||
        os.mkdir('repo')
 | 
					        os.mkdir('repo')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo')
 | 
					        shutil.copy(basedir / 'repo' / 'entry.json', 'repo')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo')
 | 
					        shutil.copy(basedir / 'repo' / 'index-v2.json', 'repo')
 | 
				
			||||||
        signindex.sign_index('repo', 'entry.json')
 | 
					        signindex.sign_index('repo', 'entry.json')
 | 
				
			||||||
        repo_url = 'https://fake.url/fdroid/repo'
 | 
					        repo_url = 'https://fake.url/fdroid/repo'
 | 
				
			||||||
        entry_url = 'https://fake.url/fdroid/repo/entry.jar'
 | 
					        entry_url = 'https://fake.url/fdroid/repo/entry.jar'
 | 
				
			||||||
| 
						 | 
					@ -107,9 +101,3 @@ class ApiTest(unittest.TestCase):
 | 
				
			||||||
            self.assertEqual(
 | 
					            self.assertEqual(
 | 
				
			||||||
                'My First F-Droid Repo Demo', data['repo']['name']['en-US']
 | 
					                'My First F-Droid Repo Demo', data['repo']['name']['en-US']
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(ApiTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,7 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import textwrap
 | 
					import textwrap
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
| 
						 | 
					@ -14,21 +9,10 @@ import yaml
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from unittest import mock
 | 
					from unittest import mock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
localmodule = os.path.realpath(
 | 
					from .testcommon import TmpCwd, mkdtemp
 | 
				
			||||||
    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 testcommon import TmpCwd
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import fdroidserver.build
 | 
					import fdroidserver.build
 | 
				
			||||||
import fdroidserver.common
 | 
					import fdroidserver.common
 | 
				
			||||||
import fdroidserver.metadata
 | 
					 | 
				
			||||||
import fdroidserver.scanner
 | 
					 | 
				
			||||||
import fdroidserver.vmtools
 | 
					 | 
				
			||||||
from testcommon import mkdtemp, parse_args_for_test
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class FakeProcess:
 | 
					class FakeProcess:
 | 
				
			||||||
| 
						 | 
					@ -47,8 +31,7 @@ class BuildTest(unittest.TestCase):
 | 
				
			||||||
    '''fdroidserver/build.py'''
 | 
					    '''fdroidserver/build.py'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					        self.basedir = str(Path(__file__).parent)
 | 
				
			||||||
        self.basedir = os.path.join(localmodule, 'tests')
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					        os.chdir(self.basedir)
 | 
				
			||||||
        fdroidserver.common.config = None
 | 
					        fdroidserver.common.config = None
 | 
				
			||||||
        fdroidserver.build.config = None
 | 
					        fdroidserver.build.config = None
 | 
				
			||||||
| 
						 | 
					@ -937,7 +920,7 @@ class BuildTest(unittest.TestCase):
 | 
				
			||||||
        subprocess_check_output,
 | 
					        subprocess_check_output,
 | 
				
			||||||
        paramiko_SSHClient,
 | 
					        paramiko_SSHClient,
 | 
				
			||||||
        fdroidserver_vmtools_get_clean_builder,
 | 
					        fdroidserver_vmtools_get_clean_builder,
 | 
				
			||||||
        fdroidserver_vmtools_get_build_vm,
 | 
					        fdroidserver_vmtools_get_build_vm,  # pylint: disable=unused-argument
 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
        """srclibs Prepare: should only be executed in the buildserver"""
 | 
					        """srclibs Prepare: should only be executed in the buildserver"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -954,6 +937,7 @@ class BuildTest(unittest.TestCase):
 | 
				
			||||||
            refresh=True,
 | 
					            refresh=True,
 | 
				
			||||||
            build=None,
 | 
					            build=None,
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
 | 
					            # pylint: disable=unused-argument
 | 
				
			||||||
            name, ref = spec.split('@')
 | 
					            name, ref = spec.split('@')
 | 
				
			||||||
            libdir = os.path.join(srclib_dir, name)
 | 
					            libdir = os.path.join(srclib_dir, name)
 | 
				
			||||||
            os.mkdir(libdir)
 | 
					            os.mkdir(libdir)
 | 
				
			||||||
| 
						 | 
					@ -1098,23 +1082,3 @@ class BuildTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.build.options.keep_when_not_allowed = False
 | 
					        fdroidserver.build.options.keep_when_not_allowed = False
 | 
				
			||||||
        fdroidserver.build.config = {'keep_when_not_allowed': False}
 | 
					        fdroidserver.build.config = {'keep_when_not_allowed': False}
 | 
				
			||||||
        self.assertFalse(fdroidserver.build.keep_when_not_allowed())
 | 
					        self.assertFalse(fdroidserver.build.keep_when_not_allowed())
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(BuildTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,36 +1,26 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import git
 | 
					import git
 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
from unittest import mock
 | 
					from unittest import mock
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import fdroidserver
 | 
				
			||||||
localmodule = Path(__file__).resolve().parent.parent
 | 
					 | 
				
			||||||
print('localmodule: ' + str(localmodule))
 | 
					 | 
				
			||||||
if localmodule not in sys.path:
 | 
					 | 
				
			||||||
    sys.path.insert(0, str(localmodule))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import fdroidserver.checkupdates
 | 
					import fdroidserver.checkupdates
 | 
				
			||||||
import fdroidserver.metadata
 | 
					
 | 
				
			||||||
from fdroidserver.exception import FDroidException
 | 
					
 | 
				
			||||||
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CheckupdatesTest(unittest.TestCase):
 | 
					class CheckupdatesTest(unittest.TestCase):
 | 
				
			||||||
    '''fdroidserver/checkupdates.py'''
 | 
					    '''fdroidserver/checkupdates.py'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self.basedir = localmodule / 'tests'
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        self.testdir = tempfile.TemporaryDirectory(
 | 
					        self.testdir = tempfile.TemporaryDirectory(
 | 
				
			||||||
            str(time.time()), self._testMethodName + '_'
 | 
					            str(time.time()), self._testMethodName + '_'
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
| 
						 | 
					@ -70,7 +60,7 @@ class CheckupdatesTest(unittest.TestCase):
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()):
 | 
					            with mock.patch('fdroidserver.metadata.write_metadata', mock.Mock()):
 | 
				
			||||||
                with mock.patch('subprocess.call', lambda cmd: 0):
 | 
					                with mock.patch('subprocess.call', lambda cmd: 0):
 | 
				
			||||||
                    with self.assertRaises(FDroidException):
 | 
					                    with self.assertRaises(fdroidserver.exception.FDroidException):
 | 
				
			||||||
                        fdroidserver.checkupdates.checkupdates_app(app, auto=True)
 | 
					                        fdroidserver.checkupdates.checkupdates_app(app, auto=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        build = app['Builds'][-1]
 | 
					        build = app['Builds'][-1]
 | 
				
			||||||
| 
						 | 
					@ -165,7 +155,7 @@ class CheckupdatesTest(unittest.TestCase):
 | 
				
			||||||
        with mock.patch(
 | 
					        with mock.patch(
 | 
				
			||||||
            'fdroidserver.checkupdates.check_http', lambda app: (None, 'bla')
 | 
					            'fdroidserver.checkupdates.check_http', lambda app: (None, 'bla')
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            with self.assertRaises(FDroidException):
 | 
					            with self.assertRaises(fdroidserver.exception.FDroidException):
 | 
				
			||||||
                fdroidserver.checkupdates.checkupdates_app(app, auto=True)
 | 
					                fdroidserver.checkupdates.checkupdates_app(app, auto=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with mock.patch(
 | 
					        with mock.patch(
 | 
				
			||||||
| 
						 | 
					@ -198,7 +188,7 @@ class CheckupdatesTest(unittest.TestCase):
 | 
				
			||||||
            'fdroidserver.checkupdates.check_tags',
 | 
					            'fdroidserver.checkupdates.check_tags',
 | 
				
			||||||
            lambda app, pattern: (None, 'bla', None),
 | 
					            lambda app, pattern: (None, 'bla', None),
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            with self.assertRaises(FDroidException):
 | 
					            with self.assertRaises(fdroidserver.exception.FDroidException):
 | 
				
			||||||
                fdroidserver.checkupdates.checkupdates_app(app, auto=True)
 | 
					                fdroidserver.checkupdates.checkupdates_app(app, auto=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with mock.patch(
 | 
					        with mock.patch(
 | 
				
			||||||
| 
						 | 
					@ -236,7 +226,7 @@ class CheckupdatesTest(unittest.TestCase):
 | 
				
			||||||
            faked = scheme + '://fake.url/for/testing/scheme'
 | 
					            faked = scheme + '://fake.url/for/testing/scheme'
 | 
				
			||||||
            app.UpdateCheckData = faked + '|ignored|' + faked + '|ignored'
 | 
					            app.UpdateCheckData = faked + '|ignored|' + faked + '|ignored'
 | 
				
			||||||
            app.metadatapath = 'metadata/' + app.id + '.yml'
 | 
					            app.metadatapath = 'metadata/' + app.id + '.yml'
 | 
				
			||||||
            with self.assertRaises(FDroidException):
 | 
					            with self.assertRaises(fdroidserver.exception.FDroidException):
 | 
				
			||||||
                fdroidserver.checkupdates.check_http(app)
 | 
					                fdroidserver.checkupdates.check_http(app)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_check_http_ignore(self):
 | 
					    def test_check_http_ignore(self):
 | 
				
			||||||
| 
						 | 
					@ -331,7 +321,7 @@ class CheckupdatesTest(unittest.TestCase):
 | 
				
			||||||
        testdir = self.testdir.name
 | 
					        testdir = self.testdir.name
 | 
				
			||||||
        os.chdir(testdir)
 | 
					        os.chdir(testdir)
 | 
				
			||||||
        os.mkdir('metadata')
 | 
					        os.mkdir('metadata')
 | 
				
			||||||
        for f in (self.basedir / 'metadata').glob('*.yml'):
 | 
					        for f in (basedir / 'metadata').glob('*.yml'):
 | 
				
			||||||
            shutil.copy(f, 'metadata')
 | 
					            shutil.copy(f, 'metadata')
 | 
				
			||||||
        git_repo = git.Repo.init(testdir)
 | 
					        git_repo = git.Repo.init(testdir)
 | 
				
			||||||
        git_repo.git.add(all=True)
 | 
					        git_repo.git.add(all=True)
 | 
				
			||||||
| 
						 | 
					@ -434,7 +424,7 @@ class CheckupdatesTest(unittest.TestCase):
 | 
				
			||||||
    @mock.patch('fdroidserver.metadata.read_metadata')
 | 
					    @mock.patch('fdroidserver.metadata.read_metadata')
 | 
				
			||||||
    def test_merge_requests_flag(self, read_metadata, sys_exit):
 | 
					    def test_merge_requests_flag(self, read_metadata, sys_exit):
 | 
				
			||||||
        def _sys_exit(return_code=0):
 | 
					        def _sys_exit(return_code=0):
 | 
				
			||||||
            assert return_code != 0
 | 
					            self.assertNotEqual(return_code, 0)
 | 
				
			||||||
            raise fdroidserver.exception.FDroidException('sys.exit() ran')
 | 
					            raise fdroidserver.exception.FDroidException('sys.exit() ran')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def _read_metadata(a=None, b=None):
 | 
					        def _read_metadata(a=None, b=None):
 | 
				
			||||||
| 
						 | 
					@ -479,7 +469,7 @@ class CheckupdatesTest(unittest.TestCase):
 | 
				
			||||||
    @mock.patch('fdroidserver.checkupdates.checkupdates_app')
 | 
					    @mock.patch('fdroidserver.checkupdates.checkupdates_app')
 | 
				
			||||||
    def test_merge_requests_branch(self, checkupdates_app, read_app_args, sys_exit):
 | 
					    def test_merge_requests_branch(self, checkupdates_app, read_app_args, sys_exit):
 | 
				
			||||||
        def _sys_exit(return_code=0):
 | 
					        def _sys_exit(return_code=0):
 | 
				
			||||||
            assert return_code == 0
 | 
					            self.assertEqual(return_code, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def _checkupdates_app(app, auto, commit):  # pylint: disable=unused-argument
 | 
					        def _checkupdates_app(app, auto, commit):  # pylint: disable=unused-argument
 | 
				
			||||||
            os.mkdir('metadata')
 | 
					            os.mkdir('metadata')
 | 
				
			||||||
| 
						 | 
					@ -506,27 +496,8 @@ class CheckupdatesTest(unittest.TestCase):
 | 
				
			||||||
        git_repo.create_remote('origin', os.getcwd()).fetch()
 | 
					        git_repo.create_remote('origin', os.getcwd()).fetch()
 | 
				
			||||||
        git_repo.create_remote('upstream', os.getcwd()).fetch()
 | 
					        git_repo.create_remote('upstream', os.getcwd()).fetch()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        assert appid not in git_repo.heads
 | 
					        self.assertNotIn(appid, git_repo.heads)
 | 
				
			||||||
        with mock.patch('sys.argv', ['fdroid checkupdates', '--merge-request', appid]):
 | 
					        with mock.patch('sys.argv', ['fdroid checkupdates', '--merge-request', appid]):
 | 
				
			||||||
            fdroidserver.checkupdates.main()
 | 
					            fdroidserver.checkupdates.main()
 | 
				
			||||||
        sys_exit.assert_called_once()
 | 
					        sys_exit.assert_called_once()
 | 
				
			||||||
        assert appid in git_repo.heads
 | 
					        self.assertIn(appid, git_repo.heads)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
    from testcommon import parse_args_for_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(CheckupdatesTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,5 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import difflib
 | 
					import difflib
 | 
				
			||||||
import git
 | 
					import git
 | 
				
			||||||
import glob
 | 
					import glob
 | 
				
			||||||
| 
						 | 
					@ -28,25 +26,20 @@ from unittest import mock
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
localmodule = os.path.realpath(
 | 
					import fdroidserver
 | 
				
			||||||
    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.index
 | 
					 | 
				
			||||||
import fdroidserver.install
 | 
					 | 
				
			||||||
import fdroidserver.signindex
 | 
					import fdroidserver.signindex
 | 
				
			||||||
import fdroidserver.common
 | 
					import fdroidserver.common
 | 
				
			||||||
import fdroidserver.metadata
 | 
					import fdroidserver.metadata
 | 
				
			||||||
from testcommon import TmpCwd, mkdtemp, parse_args_for_test
 | 
					from .testcommon import TmpCwd, mkdtemp
 | 
				
			||||||
from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME
 | 
					from fdroidserver.common import ANTIFEATURES_CONFIG_NAME, CATEGORIES_CONFIG_NAME
 | 
				
			||||||
from fdroidserver.exception import FDroidException, VCSException,\
 | 
					from fdroidserver.exception import FDroidException, VCSException,\
 | 
				
			||||||
    MetaDataException, VerificationException
 | 
					    MetaDataException, VerificationException
 | 
				
			||||||
from fdroidserver.looseversion import LooseVersion
 | 
					from fdroidserver.looseversion import LooseVersion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def _mock_common_module_options_instance():
 | 
					def _mock_common_module_options_instance():
 | 
				
			||||||
    """Helper method to deal with difficult visibility of the module-level options."""
 | 
					    """Helper method to deal with difficult visibility of the module-level options."""
 | 
				
			||||||
    fdroidserver.common.options = mock.Mock()
 | 
					    fdroidserver.common.options = mock.Mock()
 | 
				
			||||||
| 
						 | 
					@ -60,11 +53,10 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					        logging.basicConfig(level=logging.DEBUG)
 | 
				
			||||||
        logger = logging.getLogger('androguard.axml')
 | 
					        logger = logging.getLogger('androguard.axml')
 | 
				
			||||||
        logger.setLevel(logging.INFO)  # tame the axml debug messages
 | 
					        logger.setLevel(logging.INFO)  # tame the axml debug messages
 | 
				
			||||||
        self.basedir = os.path.join(localmodule, 'tests')
 | 
					        self.tmpdir = os.path.abspath(os.path.join(basedir, '..', '.testfiles'))
 | 
				
			||||||
        self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles'))
 | 
					 | 
				
			||||||
        if not os.path.exists(self.tmpdir):
 | 
					        if not os.path.exists(self.tmpdir):
 | 
				
			||||||
            os.makedirs(self.tmpdir)
 | 
					            os.makedirs(self.tmpdir)
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # these are declared as None at the top of the module file
 | 
					        # these are declared as None at the top of the module file
 | 
				
			||||||
        fdroidserver.common.config = None
 | 
					        fdroidserver.common.config = None
 | 
				
			||||||
| 
						 | 
					@ -77,7 +69,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
    def tearDown(self):
 | 
					    def tearDown(self):
 | 
				
			||||||
        fdroidserver.common.config = None
 | 
					        fdroidserver.common.config = None
 | 
				
			||||||
        fdroidserver.common.options = None
 | 
					        fdroidserver.common.options = None
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self._td.cleanup()
 | 
					        self._td.cleanup()
 | 
				
			||||||
        if os.path.exists(self.tmpdir):
 | 
					        if os.path.exists(self.tmpdir):
 | 
				
			||||||
            shutil.rmtree(self.tmpdir)
 | 
					            shutil.rmtree(self.tmpdir)
 | 
				
			||||||
| 
						 | 
					@ -187,11 +179,11 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
            # create test file used in common._add_java_paths_to_config()
 | 
					            # create test file used in common._add_java_paths_to_config()
 | 
				
			||||||
            for p in pathlist:
 | 
					            for p in pathlist:
 | 
				
			||||||
                if p.startswith('/System') or p.startswith('/Library'):
 | 
					                if p.startswith('/System') or p.startswith('/Library'):
 | 
				
			||||||
                    basedir = os.path.join(p, 'Contents', 'Home', 'bin')
 | 
					                    _dir = os.path.join(p, 'Contents', 'Home', 'bin')
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    basedir = os.path.join(p, 'bin')
 | 
					                    _dir = os.path.join(p, 'bin')
 | 
				
			||||||
                os.makedirs(basedir)
 | 
					                os.makedirs(_dir)
 | 
				
			||||||
                open(os.path.join(basedir, 'javac'), 'w').close()
 | 
					                open(os.path.join(_dir, 'javac'), 'w').close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            config = dict()
 | 
					            config = dict()
 | 
				
			||||||
            config['java_paths'] = dict()
 | 
					            config['java_paths'] = dict()
 | 
				
			||||||
| 
						 | 
					@ -204,21 +196,14 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # these are set debuggable
 | 
					        # these are set debuggable
 | 
				
			||||||
        testfiles = []
 | 
					        for apkfile in ('urzip.apk', 'urzip-badsig.apk', 'urzip-badcert.apk'):
 | 
				
			||||||
        testfiles.append(os.path.join(self.basedir, 'urzip.apk'))
 | 
					 | 
				
			||||||
        testfiles.append(os.path.join(self.basedir, 'urzip-badsig.apk'))
 | 
					 | 
				
			||||||
        testfiles.append(os.path.join(self.basedir, 'urzip-badcert.apk'))
 | 
					 | 
				
			||||||
        for apkfile in testfiles:
 | 
					 | 
				
			||||||
            self.assertTrue(
 | 
					            self.assertTrue(
 | 
				
			||||||
                fdroidserver.common.is_debuggable_or_testOnly(apkfile),
 | 
					                fdroidserver.common.is_debuggable_or_testOnly(str(basedir / apkfile)),
 | 
				
			||||||
                "debuggable APK state was not properly parsed!",
 | 
					                "debuggable APK state was not properly parsed!",
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # these are set NOT debuggable
 | 
					        # these are set NOT debuggable
 | 
				
			||||||
        testfiles = []
 | 
					        testfiles = 'urzip-release.apk', 'urzip-release-unsigned.apk', 'v2.only.sig_2.apk'
 | 
				
			||||||
        testfiles.append(os.path.join(self.basedir, 'urzip-release.apk'))
 | 
					 | 
				
			||||||
        testfiles.append(os.path.join(self.basedir, 'urzip-release-unsigned.apk'))
 | 
					 | 
				
			||||||
        testfiles.append(os.path.join(self.basedir, 'v2.only.sig_2.apk'))
 | 
					 | 
				
			||||||
        for apkfile in testfiles:
 | 
					        for apkfile in testfiles:
 | 
				
			||||||
            self.assertFalse(
 | 
					            self.assertFalse(
 | 
				
			||||||
                fdroidserver.common.is_debuggable_or_testOnly(apkfile),
 | 
					                fdroidserver.common.is_debuggable_or_testOnly(apkfile),
 | 
				
			||||||
| 
						 | 
					@ -297,7 +282,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        teststr = 'FAKE_STR_FOR_TESTING'
 | 
					        teststr = 'FAKE_STR_FOR_TESTING'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        shutil.copytree(
 | 
					        shutil.copytree(
 | 
				
			||||||
            os.path.join(self.basedir, 'source-files'),
 | 
					            os.path.join(basedir, 'source-files'),
 | 
				
			||||||
            os.path.join(self.tmpdir, 'source-files'),
 | 
					            os.path.join(self.tmpdir, 'source-files'),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -356,7 +341,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
    def test_prepare_sources_with_prebuild_subdir(self):
 | 
					    def test_prepare_sources_with_prebuild_subdir(self):
 | 
				
			||||||
        app_build_dir = os.path.join(self.testdir, 'build', 'com.example')
 | 
					        app_build_dir = os.path.join(self.testdir, 'build', 'com.example')
 | 
				
			||||||
        shutil.copytree(
 | 
					        shutil.copytree(
 | 
				
			||||||
            os.path.join(self.basedir, 'source-files', 'fdroid', 'fdroidclient'),
 | 
					            basedir / 'source-files' / 'fdroid' / 'fdroidclient',
 | 
				
			||||||
            app_build_dir,
 | 
					            app_build_dir,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -418,7 +403,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        os.mkdir('metadata')
 | 
					        os.mkdir('metadata')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # use a local copy if available to avoid hitting the network
 | 
					        # use a local copy if available to avoid hitting the network
 | 
				
			||||||
        tmprepo = os.path.join(self.basedir, 'tmp', 'importer')
 | 
					        tmprepo = os.path.join(basedir, 'tmp', 'importer')
 | 
				
			||||||
        if os.path.exists(tmprepo):
 | 
					        if os.path.exists(tmprepo):
 | 
				
			||||||
            git_url = tmprepo
 | 
					            git_url = tmprepo
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
| 
						 | 
					@ -499,7 +484,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        fdroidserver.signindex.config = config
 | 
					        fdroidserver.signindex.config = config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        sourcedir = os.path.join(self.basedir, 'signindex')
 | 
					        sourcedir = os.path.join(basedir, 'signindex')
 | 
				
			||||||
        with tempfile.TemporaryDirectory(
 | 
					        with tempfile.TemporaryDirectory(
 | 
				
			||||||
            prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir
 | 
					            prefix=inspect.currentframe().f_code.co_name, dir=self.tmpdir
 | 
				
			||||||
        ) as testsdir:
 | 
					        ) as testsdir:
 | 
				
			||||||
| 
						 | 
					@ -561,7 +546,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        """Sign entry.jar and make sure it validates"""
 | 
					        """Sign entry.jar and make sure it validates"""
 | 
				
			||||||
        config = fdroidserver.common.read_config()
 | 
					        config = fdroidserver.common.read_config()
 | 
				
			||||||
        config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner')
 | 
					        config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner')
 | 
				
			||||||
        config['keystore'] = os.path.join(self.basedir, 'keystore.jks')
 | 
					        config['keystore'] = os.path.join(basedir, 'keystore.jks')
 | 
				
			||||||
        config['repo_keyalias'] = 'sova'
 | 
					        config['repo_keyalias'] = 'sova'
 | 
				
			||||||
        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
| 
						 | 
					@ -580,7 +565,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        config = fdroidserver.common.read_config()
 | 
					        config = fdroidserver.common.read_config()
 | 
				
			||||||
        config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner')
 | 
					        config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner')
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        source_dir = os.path.join(self.basedir, 'signindex')
 | 
					        source_dir = os.path.join(basedir, 'signindex')
 | 
				
			||||||
        for f in ('unsigned.jar', 'testy.jar', 'guardianproject.jar', 'guardianproject-v1.jar'):
 | 
					        for f in ('unsigned.jar', 'testy.jar', 'guardianproject.jar', 'guardianproject-v1.jar'):
 | 
				
			||||||
            testfile = os.path.join(source_dir, f)
 | 
					            testfile = os.path.join(source_dir, f)
 | 
				
			||||||
            with self.assertRaises(fdroidserver.index.VerificationException):
 | 
					            with self.assertRaises(fdroidserver.index.VerificationException):
 | 
				
			||||||
| 
						 | 
					@ -590,7 +575,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        config = fdroidserver.common.read_config()
 | 
					        config = fdroidserver.common.read_config()
 | 
				
			||||||
        config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner')
 | 
					        config['jarsigner'] = fdroidserver.common.find_sdk_tools_cmd('jarsigner')
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        source_dir = os.path.join(self.basedir, 'signindex')
 | 
					        source_dir = os.path.join(basedir, 'signindex')
 | 
				
			||||||
        for f in ('testy.jar', 'guardianproject.jar'):
 | 
					        for f in ('testy.jar', 'guardianproject.jar'):
 | 
				
			||||||
            testfile = os.path.join(source_dir, f)
 | 
					            testfile = os.path.join(source_dir, f)
 | 
				
			||||||
            fdroidserver.common.verify_deprecated_jar_signature(testfile)
 | 
					            fdroidserver.common.verify_deprecated_jar_signature(testfile)
 | 
				
			||||||
| 
						 | 
					@ -604,7 +589,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        _mock_common_module_options_instance()
 | 
					        _mock_common_module_options_instance()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        sourceapk = os.path.join(self.basedir, 'urzip.apk')
 | 
					        sourceapk = os.path.join(basedir, 'urzip.apk')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        copyapk = os.path.join(self.testdir, 'urzip-copy.apk')
 | 
					        copyapk = os.path.join(self.testdir, 'urzip-copy.apk')
 | 
				
			||||||
        shutil.copy(sourceapk, copyapk)
 | 
					        shutil.copy(sourceapk, copyapk)
 | 
				
			||||||
| 
						 | 
					@ -624,7 +609,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        twosigapk = os.path.join(self.testdir, 'urzip-twosig.apk')
 | 
					        twosigapk = os.path.join(self.testdir, 'urzip-twosig.apk')
 | 
				
			||||||
        otherapk = ZipFile(os.path.join(self.basedir, 'urzip-release.apk'), 'r')
 | 
					        otherapk = ZipFile(os.path.join(basedir, 'urzip-release.apk'), 'r')
 | 
				
			||||||
        with ZipFile(sourceapk, 'r') as apk:
 | 
					        with ZipFile(sourceapk, 'r') as apk:
 | 
				
			||||||
            with ZipFile(twosigapk, 'w') as testapk:
 | 
					            with ZipFile(twosigapk, 'w') as testapk:
 | 
				
			||||||
                for info in apk.infolist():
 | 
					                for info in apk.infolist():
 | 
				
			||||||
| 
						 | 
					@ -825,7 +810,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        os.makedirs(os.path.dirname(do_not_use))
 | 
					        os.makedirs(os.path.dirname(do_not_use))
 | 
				
			||||||
        with open(do_not_use, 'w') as fp:
 | 
					        with open(do_not_use, 'w') as fp:
 | 
				
			||||||
            fp.write('#!/bin/sh\ndate\n')
 | 
					            fp.write('#!/bin/sh\ndate\n')
 | 
				
			||||||
        os.chmod(do_not_use, 0o0755)
 | 
					        os.chmod(do_not_use, 0o0755)  # nosec B103
 | 
				
			||||||
        apksigner = os.path.join(self.tmpdir, 'apksigner')
 | 
					        apksigner = os.path.join(self.tmpdir, 'apksigner')
 | 
				
			||||||
        config = {'apksigner': apksigner}
 | 
					        config = {'apksigner': apksigner}
 | 
				
			||||||
        with mock.patch.dict(os.environ, clear=True):
 | 
					        with mock.patch.dict(os.environ, clear=True):
 | 
				
			||||||
| 
						 | 
					@ -840,14 +825,14 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        apksigner = os.path.join(self.tmpdir, 'apksigner')
 | 
					        apksigner = os.path.join(self.tmpdir, 'apksigner')
 | 
				
			||||||
        with open(apksigner, 'w') as fp:
 | 
					        with open(apksigner, 'w') as fp:
 | 
				
			||||||
            fp.write('#!/bin/sh\ndate\n')
 | 
					            fp.write('#!/bin/sh\ndate\n')
 | 
				
			||||||
        os.chmod(apksigner, 0o0755)
 | 
					        os.chmod(apksigner, 0o0755)  # nosec B103
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        android_home = os.path.join(self.tmpdir, 'ANDROID_HOME')
 | 
					        android_home = os.path.join(self.tmpdir, 'ANDROID_HOME')
 | 
				
			||||||
        do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner')
 | 
					        do_not_use = os.path.join(android_home, 'build-tools', '30.0.3', 'apksigner')
 | 
				
			||||||
        os.makedirs(os.path.dirname(do_not_use))
 | 
					        os.makedirs(os.path.dirname(do_not_use))
 | 
				
			||||||
        with open(do_not_use, 'w') as fp:
 | 
					        with open(do_not_use, 'w') as fp:
 | 
				
			||||||
            fp.write('#!/bin/sh\ndate\n')
 | 
					            fp.write('#!/bin/sh\ndate\n')
 | 
				
			||||||
        os.chmod(do_not_use, 0o0755)
 | 
					        os.chmod(do_not_use, 0o0755)  # nosec B103
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        config = {'sdk_path': android_home}
 | 
					        config = {'sdk_path': android_home}
 | 
				
			||||||
        with mock.patch.dict(os.environ, clear=True):
 | 
					        with mock.patch.dict(os.environ, clear=True):
 | 
				
			||||||
| 
						 | 
					@ -865,13 +850,13 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        os.makedirs(os.path.dirname(apksigner))
 | 
					        os.makedirs(os.path.dirname(apksigner))
 | 
				
			||||||
        with open(apksigner, 'w') as fp:
 | 
					        with open(apksigner, 'w') as fp:
 | 
				
			||||||
            fp.write('#!/bin/sh\necho 30.0.3\n')
 | 
					            fp.write('#!/bin/sh\necho 30.0.3\n')
 | 
				
			||||||
        os.chmod(apksigner, 0o0755)
 | 
					        os.chmod(apksigner, 0o0755)  # nosec B103
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        do_not_use = os.path.join(android_home, 'build-tools', '29.0.3', 'apksigner')
 | 
					        do_not_use = os.path.join(android_home, 'build-tools', '29.0.3', 'apksigner')
 | 
				
			||||||
        os.makedirs(os.path.dirname(do_not_use))
 | 
					        os.makedirs(os.path.dirname(do_not_use))
 | 
				
			||||||
        with open(do_not_use, 'w') as fp:
 | 
					        with open(do_not_use, 'w') as fp:
 | 
				
			||||||
            fp.write('#!/bin/sh\necho 29.0.3\n')
 | 
					            fp.write('#!/bin/sh\necho 29.0.3\n')
 | 
				
			||||||
        os.chmod(do_not_use, 0o0755)
 | 
					        os.chmod(do_not_use, 0o0755)  # nosec B103
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        config = {'sdk_path': android_home}
 | 
					        config = {'sdk_path': android_home}
 | 
				
			||||||
        with mock.patch.dict(os.environ, clear=True):
 | 
					        with mock.patch.dict(os.environ, clear=True):
 | 
				
			||||||
| 
						 | 
					@ -917,13 +902,13 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        config['keyalias'] = 'sova'
 | 
					        config['keyalias'] = 'sova'
 | 
				
			||||||
        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keystore'] = os.path.join(self.basedir, 'keystore.jks')
 | 
					        config['keystore'] = os.path.join(basedir, 'keystore.jks')
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        fdroidserver.signindex.config = config
 | 
					        fdroidserver.signindex.config = config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk')
 | 
					        unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk')
 | 
				
			||||||
        signed = os.path.join(self.testdir, 'urzip-release.apk')
 | 
					        signed = os.path.join(self.testdir, 'urzip-release.apk')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'urzip-release-unsigned.apk'), self.testdir)
 | 
					        shutil.copy(os.path.join(basedir, 'urzip-release-unsigned.apk'), self.testdir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertFalse(fdroidserver.common.verify_apk_signature(unsigned))
 | 
					        self.assertFalse(fdroidserver.common.verify_apk_signature(unsigned))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -936,7 +921,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        unsigned = os.path.join(self.testdir, 'duplicate.permisssions_9999999-unsigned.apk')
 | 
					        unsigned = os.path.join(self.testdir, 'duplicate.permisssions_9999999-unsigned.apk')
 | 
				
			||||||
        signed = os.path.join(self.testdir, 'duplicate.permisssions_9999999.apk')
 | 
					        signed = os.path.join(self.testdir, 'duplicate.permisssions_9999999.apk')
 | 
				
			||||||
        shutil.copy(
 | 
					        shutil.copy(
 | 
				
			||||||
            os.path.join(self.basedir, 'repo', 'duplicate.permisssions_9999999.apk'),
 | 
					            os.path.join(basedir, 'repo', 'duplicate.permisssions_9999999.apk'),
 | 
				
			||||||
            os.path.join(unsigned),
 | 
					            os.path.join(unsigned),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        fdroidserver.common.apk_strip_v1_signatures(unsigned, strip_manifest=True)
 | 
					        fdroidserver.common.apk_strip_v1_signatures(unsigned, strip_manifest=True)
 | 
				
			||||||
| 
						 | 
					@ -946,7 +931,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        self.assertTrue(fdroidserver.common.verify_apk_signature(signed))
 | 
					        self.assertTrue(fdroidserver.common.verify_apk_signature(signed))
 | 
				
			||||||
        self.assertEqual('18', fdroidserver.common.get_androguard_APK(signed).get_min_sdk_version())
 | 
					        self.assertEqual('18', fdroidserver.common.get_androguard_APK(signed).get_min_sdk_version())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'minimal_targetsdk_30_unsigned.apk'), self.testdir)
 | 
					        shutil.copy(os.path.join(basedir, 'minimal_targetsdk_30_unsigned.apk'), self.testdir)
 | 
				
			||||||
        unsigned = os.path.join(self.testdir, 'minimal_targetsdk_30_unsigned.apk')
 | 
					        unsigned = os.path.join(self.testdir, 'minimal_targetsdk_30_unsigned.apk')
 | 
				
			||||||
        signed = os.path.join(self.testdir, 'minimal_targetsdk_30.apk')
 | 
					        signed = os.path.join(self.testdir, 'minimal_targetsdk_30.apk')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -959,7 +944,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        # verify it has a v2 signature
 | 
					        # verify it has a v2 signature
 | 
				
			||||||
        self.assertTrue(fdroidserver.common.get_androguard_APK(signed).is_signed_v2())
 | 
					        self.assertTrue(fdroidserver.common.get_androguard_APK(signed).is_signed_v2())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk30_unsigned.apk'), self.testdir)
 | 
					        shutil.copy(os.path.join(basedir, 'no_targetsdk_minsdk30_unsigned.apk'), self.testdir)
 | 
				
			||||||
        unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk30_unsigned.apk')
 | 
					        unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk30_unsigned.apk')
 | 
				
			||||||
        signed = os.path.join(self.testdir, 'no_targetsdk_minsdk30_signed.apk')
 | 
					        signed = os.path.join(self.testdir, 'no_targetsdk_minsdk30_signed.apk')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -967,7 +952,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        self.assertTrue(fdroidserver.common.verify_apk_signature(signed))
 | 
					        self.assertTrue(fdroidserver.common.verify_apk_signature(signed))
 | 
				
			||||||
        self.assertTrue(fdroidserver.common.get_androguard_APK(signed).is_signed_v2())
 | 
					        self.assertTrue(fdroidserver.common.get_androguard_APK(signed).is_signed_v2())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk'), self.testdir)
 | 
					        shutil.copy(os.path.join(basedir, 'no_targetsdk_minsdk1_unsigned.apk'), self.testdir)
 | 
				
			||||||
        unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk1_unsigned.apk')
 | 
					        unsigned = os.path.join(self.testdir, 'no_targetsdk_minsdk1_unsigned.apk')
 | 
				
			||||||
        signed = os.path.join(self.testdir, 'no_targetsdk_minsdk1_signed.apk')
 | 
					        signed = os.path.join(self.testdir, 'no_targetsdk_minsdk1_signed.apk')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -988,18 +973,18 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        config['keyalias'] = 'sova'
 | 
					        config['keyalias'] = 'sova'
 | 
				
			||||||
        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keystore'] = os.path.join(self.basedir, 'keystore.jks')
 | 
					        config['keystore'] = os.path.join(basedir, 'keystore.jks')
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        fdroidserver.signindex.config = config
 | 
					        fdroidserver.signindex.config = config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk')
 | 
					        unsigned = os.path.join(self.testdir, 'urzip-release-unsigned.apk')
 | 
				
			||||||
        signed = os.path.join(self.testdir, 'urzip-release.apk')
 | 
					        signed = os.path.join(self.testdir, 'urzip-release.apk')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'urzip-release-unsigned.apk'), self.testdir)
 | 
					        shutil.copy(os.path.join(basedir, 'urzip-release-unsigned.apk'), self.testdir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        os.chmod(unsigned, 0o000)
 | 
					        os.chmod(unsigned, 0o000)
 | 
				
			||||||
        with self.assertRaises(fdroidserver.exception.BuildException):
 | 
					        with self.assertRaises(fdroidserver.exception.BuildException):
 | 
				
			||||||
            fdroidserver.common.sign_apk(unsigned, signed, config['keyalias'])
 | 
					            fdroidserver.common.sign_apk(unsigned, signed, config['keyalias'])
 | 
				
			||||||
        os.chmod(unsigned, 0o777)
 | 
					        os.chmod(unsigned, 0o777)  # nosec B103
 | 
				
			||||||
        self.assertTrue(os.path.isfile(unsigned))
 | 
					        self.assertTrue(os.path.isfile(unsigned))
 | 
				
			||||||
        self.assertFalse(os.path.isfile(signed))
 | 
					        self.assertFalse(os.path.isfile(signed))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1012,7 +997,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        config['keyalias'] = 'sova'
 | 
					        config['keyalias'] = 'sova'
 | 
				
			||||||
        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keystore'] = os.path.join(self.basedir, 'keystore.jks')
 | 
					        config['keystore'] = os.path.join(basedir, 'keystore.jks')
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        fdroidserver.signindex.config = config
 | 
					        fdroidserver.signindex.config = config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1039,7 +1024,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        config['keyalias'] = 'sova'
 | 
					        config['keyalias'] = 'sova'
 | 
				
			||||||
        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keystore'] = os.path.join(self.basedir, 'keystore.jks')
 | 
					        config['keystore'] = os.path.join(basedir, 'keystore.jks')
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        fdroidserver.signindex.config = config
 | 
					        fdroidserver.signindex.config = config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1052,7 +1037,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
            'v2.only.sig_2.apk',
 | 
					            'v2.only.sig_2.apk',
 | 
				
			||||||
            'SystemWebView-repack.apk',
 | 
					            'SystemWebView-repack.apk',
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            original = os.path.join(self.basedir, apk)
 | 
					            original = os.path.join(basedir, apk)
 | 
				
			||||||
            unsigned = os.path.join('unsigned', apk)
 | 
					            unsigned = os.path.join('unsigned', apk)
 | 
				
			||||||
            resign = os.path.join('repo', apk)
 | 
					            resign = os.path.join('repo', apk)
 | 
				
			||||||
            shutil.copy(original, unsigned)
 | 
					            shutil.copy(original, unsigned)
 | 
				
			||||||
| 
						 | 
					@ -1149,7 +1134,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
            fdroidserver.common.get_apk_id(badzip)
 | 
					            fdroidserver.common.get_apk_id(badzip)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_get_apk_id_aapt_regex(self):
 | 
					    def test_get_apk_id_aapt_regex(self):
 | 
				
			||||||
        files = glob.glob(os.path.join(self.basedir, 'build-tools', '[1-9]*.*', '*.txt'))
 | 
					        files = glob.glob(os.path.join(basedir, 'build-tools', '[1-9]*.*', '*.txt'))
 | 
				
			||||||
        self.assertNotEqual(0, len(files))
 | 
					        self.assertNotEqual(0, len(files))
 | 
				
			||||||
        for f in files:
 | 
					        for f in files:
 | 
				
			||||||
            appid, versionCode = os.path.splitext(os.path.basename(f))[0][12:].split('_')
 | 
					            appid, versionCode = os.path.splitext(os.path.basename(f))[0][12:].split('_')
 | 
				
			||||||
| 
						 | 
					@ -1556,7 +1541,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_remove_signing_keys(self):
 | 
					    def test_remove_signing_keys(self):
 | 
				
			||||||
        shutil.copytree(
 | 
					        shutil.copytree(
 | 
				
			||||||
            os.path.join(self.basedir, 'source-files'),
 | 
					            os.path.join(basedir, 'source-files'),
 | 
				
			||||||
            os.path.join(self.tmpdir, 'source-files'),
 | 
					            os.path.join(self.tmpdir, 'source-files'),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        os.chdir(self.tmpdir)
 | 
					        os.chdir(self.tmpdir)
 | 
				
			||||||
| 
						 | 
					@ -1575,7 +1560,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
            if not os.path.isdir(build_dir):
 | 
					            if not os.path.isdir(build_dir):
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            fdroidserver.common.remove_signing_keys(build_dir)
 | 
					            fdroidserver.common.remove_signing_keys(build_dir)
 | 
				
			||||||
            fromfile = os.path.join(self.basedir, f)
 | 
					            fromfile = os.path.join(basedir, f)
 | 
				
			||||||
            with open(f) as fp:
 | 
					            with open(f) as fp:
 | 
				
			||||||
                content = fp.read()
 | 
					                content = fp.read()
 | 
				
			||||||
            if 'signingConfig' in content:
 | 
					            if 'signingConfig' in content:
 | 
				
			||||||
| 
						 | 
					@ -1605,7 +1590,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
            if not os.path.isdir(build_dir):
 | 
					            if not os.path.isdir(build_dir):
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            fdroidserver.common.remove_signing_keys(build_dir)
 | 
					            fdroidserver.common.remove_signing_keys(build_dir)
 | 
				
			||||||
            fromfile = os.path.join(self.basedir, f)
 | 
					            fromfile = os.path.join(basedir, f)
 | 
				
			||||||
            with open(fromfile) as fp:
 | 
					            with open(fromfile) as fp:
 | 
				
			||||||
                a = fp.readlines()
 | 
					                a = fp.readlines()
 | 
				
			||||||
            with open(f) as fp:
 | 
					            with open(f) as fp:
 | 
				
			||||||
| 
						 | 
					@ -1947,7 +1932,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        """Make sure it is possible to use config.yml alone."""
 | 
					        """Make sure it is possible to use config.yml alone."""
 | 
				
			||||||
        os.chdir(self.tmpdir)
 | 
					        os.chdir(self.tmpdir)
 | 
				
			||||||
        with mock.patch.dict(os.environ):
 | 
					        with mock.patch.dict(os.environ):
 | 
				
			||||||
            os.environ['SECRET'] = 'mysecretpassword'
 | 
					            os.environ['SECRET'] = 'mysecretpassword'  # nosec B105
 | 
				
			||||||
            with open('config.yml', 'w') as fp:
 | 
					            with open('config.yml', 'w') as fp:
 | 
				
			||||||
                fp.write("""keypass: {'env': 'SECRET'}""")
 | 
					                fp.write("""keypass: {'env': 'SECRET'}""")
 | 
				
			||||||
            self.assertTrue(os.path.exists('config.yml'))
 | 
					            self.assertTrue(os.path.exists('config.yml'))
 | 
				
			||||||
| 
						 | 
					@ -1983,7 +1968,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        with open('config.yml', 'w') as fp:
 | 
					        with open('config.yml', 'w') as fp:
 | 
				
			||||||
            fp.write('keystore: foo.jks')
 | 
					            fp.write('keystore: foo.jks')
 | 
				
			||||||
        self.assertTrue(os.path.exists(fp.name))
 | 
					        self.assertTrue(os.path.exists(fp.name))
 | 
				
			||||||
        os.chmod(fp.name, 0o666)
 | 
					        os.chmod(fp.name, 0o666)  # nosec B103
 | 
				
			||||||
        fdroidserver.common.read_config()
 | 
					        fdroidserver.common.read_config()
 | 
				
			||||||
        os.remove(fp.name)
 | 
					        os.remove(fp.name)
 | 
				
			||||||
        fdroidserver.common.config = None
 | 
					        fdroidserver.common.config = None
 | 
				
			||||||
| 
						 | 
					@ -1991,7 +1976,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        with open('config.py', 'w') as fp:
 | 
					        with open('config.py', 'w') as fp:
 | 
				
			||||||
            fp.write('keystore = "foo.jks"')
 | 
					            fp.write('keystore = "foo.jks"')
 | 
				
			||||||
        self.assertTrue(os.path.exists(fp.name))
 | 
					        self.assertTrue(os.path.exists(fp.name))
 | 
				
			||||||
        os.chmod(fp.name, 0o666)
 | 
					        os.chmod(fp.name, 0o666)  # nosec B103
 | 
				
			||||||
        fdroidserver.common.read_config()
 | 
					        fdroidserver.common.read_config()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_with_both_config_yml_py(self):
 | 
					    def test_with_both_config_yml_py(self):
 | 
				
			||||||
| 
						 | 
					@ -2119,7 +2104,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        os.makedirs(os.path.dirname(apksigner))
 | 
					        os.makedirs(os.path.dirname(apksigner))
 | 
				
			||||||
        with open(apksigner, 'w') as fp:
 | 
					        with open(apksigner, 'w') as fp:
 | 
				
			||||||
            fp.write('#!/bin/sh\ndate\n')
 | 
					            fp.write('#!/bin/sh\ndate\n')
 | 
				
			||||||
        os.chmod(apksigner, 0o0755)
 | 
					        os.chmod(apksigner, 0o0755)  # nosec B103
 | 
				
			||||||
        config = {'apksigner': apksigner}
 | 
					        config = {'apksigner': apksigner}
 | 
				
			||||||
        self.assertTrue(fdroidserver.common.test_sdk_exists(config))
 | 
					        self.assertTrue(fdroidserver.common.test_sdk_exists(config))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2129,7 +2114,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        os.makedirs(os.path.dirname(apksigner))
 | 
					        os.makedirs(os.path.dirname(apksigner))
 | 
				
			||||||
        with open(apksigner, 'w') as fp:
 | 
					        with open(apksigner, 'w') as fp:
 | 
				
			||||||
            fp.write('#!/bin/sh\ndate\n')
 | 
					            fp.write('#!/bin/sh\ndate\n')
 | 
				
			||||||
        os.chmod(apksigner, 0o0755)
 | 
					        os.chmod(apksigner, 0o0755)  # nosec B103
 | 
				
			||||||
        config = {'apksigner': apksigner}
 | 
					        config = {'apksigner': apksigner}
 | 
				
			||||||
        self.assertFalse(fdroidserver.common.test_sdk_exists(config))
 | 
					        self.assertFalse(fdroidserver.common.test_sdk_exists(config))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2159,7 +2144,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
    def test_loading_config_buildserver_yml(self):
 | 
					    def test_loading_config_buildserver_yml(self):
 | 
				
			||||||
        """Smoke check to make sure this file is properly parsed"""
 | 
					        """Smoke check to make sure this file is properly parsed"""
 | 
				
			||||||
        os.chdir(self.tmpdir)
 | 
					        os.chdir(self.tmpdir)
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, '..', 'buildserver', 'config.buildserver.yml'),
 | 
					        shutil.copy(os.path.join(basedir, '..', 'buildserver', 'config.buildserver.yml'),
 | 
				
			||||||
                    'config.yml')
 | 
					                    'config.yml')
 | 
				
			||||||
        self.assertFalse(os.path.exists('config.py'))
 | 
					        self.assertFalse(os.path.exists('config.py'))
 | 
				
			||||||
        fdroidserver.common.read_config()
 | 
					        fdroidserver.common.read_config()
 | 
				
			||||||
| 
						 | 
					@ -2238,7 +2223,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True)
 | 
					    @mock.patch.dict(os.environ, {'PATH': os.getenv('PATH')}, clear=True)
 | 
				
			||||||
    def test_get_android_tools_versions(self):
 | 
					    def test_get_android_tools_versions(self):
 | 
				
			||||||
        sdk_path = os.path.join(self.basedir, 'get_android_tools_versions/android-sdk')
 | 
					        sdk_path = os.path.join(basedir, 'get_android_tools_versions/android-sdk')
 | 
				
			||||||
        config = {
 | 
					        config = {
 | 
				
			||||||
            'ndk_paths': {'r10e': os.path.join(sdk_path, '..', 'android-ndk-r10e')},
 | 
					            'ndk_paths': {'r10e': os.path.join(sdk_path, '..', 'android-ndk-r10e')},
 | 
				
			||||||
            'sdk_path': sdk_path,
 | 
					            'sdk_path': sdk_path,
 | 
				
			||||||
| 
						 | 
					@ -2264,7 +2249,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir:
 | 
					        with tempfile.TemporaryDirectory() as tmpdir:
 | 
				
			||||||
            sdk_path = Path(tmpdir) / 'get_android_tools_versions'
 | 
					            sdk_path = Path(tmpdir) / 'get_android_tools_versions'
 | 
				
			||||||
            shutil.copytree(
 | 
					            shutil.copytree(
 | 
				
			||||||
                os.path.join(self.basedir, 'get_android_tools_versions'), sdk_path
 | 
					                os.path.join(basedir, 'get_android_tools_versions'), sdk_path
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            shutil.rmtree(sdk_path / 'android-ndk-r10e')
 | 
					            shutil.rmtree(sdk_path / 'android-ndk-r10e')
 | 
				
			||||||
            shutil.rmtree(sdk_path / 'android-sdk/ndk')
 | 
					            shutil.rmtree(sdk_path / 'android-sdk/ndk')
 | 
				
			||||||
| 
						 | 
					@ -2329,7 +2314,7 @@ class CommonTest(unittest.TestCase):
 | 
				
			||||||
            fdroidserver.common.read_pkg_args(['org.fdroid.fdroid:foo'], allow_vercodes),
 | 
					            fdroidserver.common.read_pkg_args(['org.fdroid.fdroid:foo'], allow_vercodes),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_apk_strip_v1_signatures(self):
 | 
					    def test_apk_strip_v1_signatures(self):
 | 
				
			||||||
        before = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk')
 | 
					        before = os.path.join(basedir, 'no_targetsdk_minsdk1_unsigned.apk')
 | 
				
			||||||
        after = os.path.join(self.testdir, 'after.apk')
 | 
					        after = os.path.join(self.testdir, 'after.apk')
 | 
				
			||||||
        shutil.copy(before, after)
 | 
					        shutil.copy(before, after)
 | 
				
			||||||
        fdroidserver.common.apk_strip_v1_signatures(after, strip_manifest=False)
 | 
					        fdroidserver.common.apk_strip_v1_signatures(after, strip_manifest=False)
 | 
				
			||||||
| 
						 | 
					@ -3156,7 +3141,7 @@ class SignerExtractionTest(unittest.TestCase):
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        os.chdir(os.path.join(localmodule, 'tests'))
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self._td = mkdtemp()
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
        self.testdir = self._td.name
 | 
					        self.testdir = self._td.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3184,7 +3169,8 @@ class SignerExtractionTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @unittest.skip("slow and only needed when adding to APKS_WITH_JAR_SIGNATURES")
 | 
					    @unittest.skip("slow and only needed when adding to APKS_WITH_JAR_SIGNATURES")
 | 
				
			||||||
    def test_vs_keytool(self):
 | 
					    def test_vs_keytool(self):
 | 
				
			||||||
        unittest.skipUnless(self.keytool, 'requires keytool to run')
 | 
					        if not self.keytool:
 | 
				
			||||||
 | 
					            self.skipTest('requires keytool to run')
 | 
				
			||||||
        pat = re.compile(r'[0-9A-F:]{95}')
 | 
					        pat = re.compile(r'[0-9A-F:]{95}')
 | 
				
			||||||
        cmd = [self.keytool, '-printcert', '-jarfile']
 | 
					        cmd = [self.keytool, '-printcert', '-jarfile']
 | 
				
			||||||
        for apk, fingerprint in APKS_WITH_JAR_SIGNATURES:
 | 
					        for apk, fingerprint in APKS_WITH_JAR_SIGNATURES:
 | 
				
			||||||
| 
						 | 
					@ -3199,7 +3185,8 @@ class SignerExtractionTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @unittest.skip("slow and only needed when adding to APKS_WITH_JAR_SIGNATURES")
 | 
					    @unittest.skip("slow and only needed when adding to APKS_WITH_JAR_SIGNATURES")
 | 
				
			||||||
    def test_vs_apksigner(self):
 | 
					    def test_vs_apksigner(self):
 | 
				
			||||||
        unittest.skipUnless(self.apksigner, 'requires apksigner to run')
 | 
					        if not self.apksigner:
 | 
				
			||||||
 | 
					            self.skipTest('requires apksigner to run')
 | 
				
			||||||
        pat = re.compile(r'\s[0-9a-f]{64}\s')
 | 
					        pat = re.compile(r'\s[0-9a-f]{64}\s')
 | 
				
			||||||
        cmd = [self.apksigner, 'verify', '--print-certs']
 | 
					        cmd = [self.apksigner, 'verify', '--print-certs']
 | 
				
			||||||
        for apk, fingerprint in APKS_WITH_JAR_SIGNATURES + APKS_WITHOUT_JAR_SIGNATURES:
 | 
					        for apk, fingerprint in APKS_WITH_JAR_SIGNATURES + APKS_WITHOUT_JAR_SIGNATURES:
 | 
				
			||||||
| 
						 | 
					@ -3353,21 +3340,3 @@ class ConfigOptionsScopeTest(unittest.TestCase):
 | 
				
			||||||
            'config' not in vars() and 'config' not in globals(),
 | 
					            'config' not in vars() and 'config' not in globals(),
 | 
				
			||||||
            "The config should not be set in the global context, only module-level.",
 | 
					            "The config should not be set in the global context, only module-level.",
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(CommonTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,11 +1,8 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import configparser
 | 
					import configparser
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
| 
						 | 
					@ -13,16 +10,10 @@ from unittest import mock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import git
 | 
					import git
 | 
				
			||||||
 | 
					
 | 
				
			||||||
localmodule = os.path.realpath(
 | 
					import fdroidserver
 | 
				
			||||||
    os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')
 | 
					from .testcommon import TmpCwd, mkdtemp
 | 
				
			||||||
)
 | 
					 | 
				
			||||||
if localmodule not in sys.path:
 | 
					 | 
				
			||||||
    sys.path.insert(0, localmodule)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import fdroidserver.common
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
import fdroidserver.deploy
 | 
					 | 
				
			||||||
from fdroidserver.exception import FDroidException
 | 
					 | 
				
			||||||
from testcommon import TmpCwd, mkdtemp, parse_args_for_test
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Options:
 | 
					class Options:
 | 
				
			||||||
| 
						 | 
					@ -34,9 +25,7 @@ class DeployTest(unittest.TestCase):
 | 
				
			||||||
    '''fdroidserver/deploy.py'''
 | 
					    '''fdroidserver/deploy.py'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self.basedir = os.path.join(localmodule, 'tests')
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        self._td = mkdtemp()
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
        self.testdir = self._td.name
 | 
					        self.testdir = self._td.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -281,7 +270,7 @@ class DeployTest(unittest.TestCase):
 | 
				
			||||||
    def test_update_serverwebroot_no_rsync_error(self):
 | 
					    def test_update_serverwebroot_no_rsync_error(self):
 | 
				
			||||||
        os.environ['PATH'] = self.testdir
 | 
					        os.environ['PATH'] = self.testdir
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        with self.assertRaises(FDroidException):
 | 
					        with self.assertRaises(fdroidserver.exception.FDroidException):
 | 
				
			||||||
            fdroidserver.deploy.update_serverwebroot('serverwebroot', 'repo')
 | 
					            fdroidserver.deploy.update_serverwebroot('serverwebroot', 'repo')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_update_serverwebroot_make_cur_version_link(self):
 | 
					    def test_update_serverwebroot_make_cur_version_link(self):
 | 
				
			||||||
| 
						 | 
					@ -981,7 +970,7 @@ class DeployTest(unittest.TestCase):
 | 
				
			||||||
                for file in files_to_upload
 | 
					                for file in files_to_upload
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
            mock_driver.upload_object_via_stream.assert_has_calls(calls, any_order=True)
 | 
					            mock_driver.upload_object_via_stream.assert_has_calls(calls, any_order=True)
 | 
				
			||||||
            assert mock_driver.upload_object_via_stream.call_count == 2
 | 
					            self.assertEqual(mock_driver.upload_object_via_stream.call_count, 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_update_awsbucket_libcloud_in_index_only_mode(self):
 | 
					    def test_update_awsbucket_libcloud_in_index_only_mode(self):
 | 
				
			||||||
        from libcloud.storage.base import Container
 | 
					        from libcloud.storage.base import Container
 | 
				
			||||||
| 
						 | 
					@ -1047,7 +1036,7 @@ class DeployTest(unittest.TestCase):
 | 
				
			||||||
                calls,
 | 
					                calls,
 | 
				
			||||||
                any_order=False,
 | 
					                any_order=False,
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            assert mock_driver.upload_object_via_stream.call_count == 1
 | 
					            self.assertEqual(mock_driver.upload_object_via_stream.call_count, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_update_servergitmirrors(self):
 | 
					    def test_update_servergitmirrors(self):
 | 
				
			||||||
        # setup parameters for this test run
 | 
					        # setup parameters for this test run
 | 
				
			||||||
| 
						 | 
					@ -1461,7 +1450,7 @@ class Test_UploadToGithubReleasesRepo(unittest.TestCase):
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_local_token(self):
 | 
					    def test_local_token(self):
 | 
				
			||||||
        self.repo_conf["token"] = "local_token"
 | 
					        self.repo_conf["token"] = "local_token"  # nosec B105
 | 
				
			||||||
        with unittest.mock.patch("fdroidserver.github.GithubApi", self.api_constructor):
 | 
					        with unittest.mock.patch("fdroidserver.github.GithubApi", self.api_constructor):
 | 
				
			||||||
            fdroidserver.deploy.upload_to_github_releases_repo(
 | 
					            fdroidserver.deploy.upload_to_github_releases_repo(
 | 
				
			||||||
                self.repo_conf,
 | 
					                self.repo_conf,
 | 
				
			||||||
| 
						 | 
					@ -1488,25 +1477,3 @@ class Test_UploadToGithubReleasesRepo(unittest.TestCase):
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(DeployTest))
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(GitHubReleasesTest))
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(Test_UploadToGithubReleasesRepo))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,21 +1,7 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import os
 | 
					 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
 | 
					import fdroidserver
 | 
				
			||||||
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.common
 | 
					 | 
				
			||||||
import fdroidserver.exception
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ExceptionTest(unittest.TestCase):
 | 
					class ExceptionTest(unittest.TestCase):
 | 
				
			||||||
| 
						 | 
					@ -51,24 +37,3 @@ class ExceptionTest(unittest.TestCase):
 | 
				
			||||||
            raise fdroidserver.exception.FDroidException(('one', 'two', 'three'))
 | 
					            raise fdroidserver.exception.FDroidException(('one', 'two', 'three'))
 | 
				
			||||||
        except fdroidserver.exception.FDroidException as e:
 | 
					        except fdroidserver.exception.FDroidException as e:
 | 
				
			||||||
            str(e)
 | 
					            str(e)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
    from testcommon import parse_args_for_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(ExceptionTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,21 +1,10 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import inspect
 | 
					import unittest
 | 
				
			||||||
import optparse
 | 
					 | 
				
			||||||
import os
 | 
					 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import unittest.mock
 | 
					import unittest.mock
 | 
				
			||||||
import testcommon
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
localmodule = os.path.realpath(
 | 
					from .testcommon import mock_urlopen
 | 
				
			||||||
    os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..')
 | 
					import fdroidserver
 | 
				
			||||||
)
 | 
					 | 
				
			||||||
print('localmodule: ' + localmodule)
 | 
					 | 
				
			||||||
if localmodule not in sys.path:
 | 
					 | 
				
			||||||
    sys.path.insert(0, localmodule)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import fdroidserver.github
 | 
					 | 
				
			||||||
import fdroidserver.common
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class GithubApiTest(unittest.TestCase):
 | 
					class GithubApiTest(unittest.TestCase):
 | 
				
			||||||
| 
						 | 
					@ -40,7 +29,7 @@ class GithubApiTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_list_released_tags(self):
 | 
					    def test_list_released_tags(self):
 | 
				
			||||||
        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
					        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
				
			||||||
        uomock = testcommon.mock_urlopen(
 | 
					        uomock = mock_urlopen(
 | 
				
			||||||
            body='[{"tag_name": "fake"}, {"tag_name": "double_fake"}]'
 | 
					            body='[{"tag_name": "fake"}, {"tag_name": "double_fake"}]'
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        with unittest.mock.patch("urllib.request.urlopen", uomock):
 | 
					        with unittest.mock.patch("urllib.request.urlopen", uomock):
 | 
				
			||||||
| 
						 | 
					@ -59,7 +48,7 @@ class GithubApiTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_tag_exists(self):
 | 
					    def test_tag_exists(self):
 | 
				
			||||||
        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
					        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
				
			||||||
        uomock = testcommon.mock_urlopen(body='[{"ref": "refs/tags/fake_tag"}]')
 | 
					        uomock = mock_urlopen(body='[{"ref": "refs/tags/fake_tag"}]')
 | 
				
			||||||
        with unittest.mock.patch("urllib.request.urlopen", uomock):
 | 
					        with unittest.mock.patch("urllib.request.urlopen", uomock):
 | 
				
			||||||
            result = api.tag_exists('fake_tag')
 | 
					            result = api.tag_exists('fake_tag')
 | 
				
			||||||
        self.assertTrue(result)
 | 
					        self.assertTrue(result)
 | 
				
			||||||
| 
						 | 
					@ -67,7 +56,7 @@ class GithubApiTest(unittest.TestCase):
 | 
				
			||||||
    def test_tag_exists_failure(self):
 | 
					    def test_tag_exists_failure(self):
 | 
				
			||||||
        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
					        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        uomock = testcommon.mock_urlopen(body='[{"error": "failure"}]')
 | 
					        uomock = mock_urlopen(body='[{"error": "failure"}]')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with unittest.mock.patch("urllib.request.urlopen", uomock):
 | 
					        with unittest.mock.patch("urllib.request.urlopen", uomock):
 | 
				
			||||||
            success = api.tag_exists('fake_tag')
 | 
					            success = api.tag_exists('fake_tag')
 | 
				
			||||||
| 
						 | 
					@ -77,7 +66,7 @@ class GithubApiTest(unittest.TestCase):
 | 
				
			||||||
    def test_list_all_tags(self):
 | 
					    def test_list_all_tags(self):
 | 
				
			||||||
        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
					        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        uomock = testcommon.mock_urlopen(
 | 
					        uomock = mock_urlopen(
 | 
				
			||||||
            body='[{"ref": "refs/tags/fake"}, {"ref": "refs/tags/double_fake"}]'
 | 
					            body='[{"ref": "refs/tags/fake"}, {"ref": "refs/tags/double_fake"}]'
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,7 +78,7 @@ class GithubApiTest(unittest.TestCase):
 | 
				
			||||||
    def test_create_release(self):
 | 
					    def test_create_release(self):
 | 
				
			||||||
        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
					        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        uomock = testcommon.mock_urlopen(body='{"id": "fakeid"}')
 | 
					        uomock = mock_urlopen(body='{"id": "fakeid"}')
 | 
				
			||||||
        api.tag_exists = lambda x: True
 | 
					        api.tag_exists = lambda x: True
 | 
				
			||||||
        api._create_release_asset = unittest.mock.Mock()
 | 
					        api._create_release_asset = unittest.mock.Mock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -116,7 +105,7 @@ class GithubApiTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test__create_release_asset(self):
 | 
					    def test__create_release_asset(self):
 | 
				
			||||||
        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
					        api = fdroidserver.github.GithubApi('faketoken', 'fakerepopath')
 | 
				
			||||||
        uomock = testcommon.mock_urlopen()
 | 
					        uomock = mock_urlopen()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with unittest.mock.patch(
 | 
					        with unittest.mock.patch(
 | 
				
			||||||
            'fdroidserver.github.open',
 | 
					            'fdroidserver.github.open',
 | 
				
			||||||
| 
						 | 
					@ -144,21 +133,3 @@ class GithubApiTest(unittest.TestCase):
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        self.assertEqual(req.data, b'fake_content')
 | 
					        self.assertEqual(req.data, b'fake_content')
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
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(GithubApiTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,31 +1,20 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import unittest
 | 
					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 fdroidserver import common, gpgsign
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from unittest.mock import MagicMock, patch
 | 
					from unittest.mock import MagicMock, patch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class GpgsignTest(unittest.TestCase):
 | 
					class GpgsignTest(unittest.TestCase):
 | 
				
			||||||
    basedir = Path(__file__).resolve().parent
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					 | 
				
			||||||
        self.tempdir = tempfile.TemporaryDirectory()
 | 
					        self.tempdir = tempfile.TemporaryDirectory()
 | 
				
			||||||
        os.chdir(self.tempdir.name)
 | 
					        os.chdir(self.tempdir.name)
 | 
				
			||||||
        self.repodir = Path('repo')
 | 
					        self.repodir = Path('repo')
 | 
				
			||||||
| 
						 | 
					@ -34,7 +23,7 @@ class GpgsignTest(unittest.TestCase):
 | 
				
			||||||
        gpgsign.config = None
 | 
					        gpgsign.config = None
 | 
				
			||||||
        config = common.read_config()
 | 
					        config = common.read_config()
 | 
				
			||||||
        config['verbose'] = True
 | 
					        config['verbose'] = True
 | 
				
			||||||
        config['gpghome'] = str((self.basedir / 'gnupghome').resolve())
 | 
					        config['gpghome'] = str((basedir / 'gnupghome').resolve())
 | 
				
			||||||
        config['gpgkey'] = '1DBA2E89'
 | 
					        config['gpgkey'] = '1DBA2E89'
 | 
				
			||||||
        gpgsign.config = config
 | 
					        gpgsign.config = config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,8 +35,8 @@ class GpgsignTest(unittest.TestCase):
 | 
				
			||||||
    def test_sign_index(self, FDroidPopen):
 | 
					    def test_sign_index(self, FDroidPopen):
 | 
				
			||||||
        """This skips running gpg because its hard to setup in a test env"""
 | 
					        """This skips running gpg because its hard to setup in a test env"""
 | 
				
			||||||
        index_v1_json = 'repo/index-v1.json'
 | 
					        index_v1_json = 'repo/index-v1.json'
 | 
				
			||||||
        shutil.copy(str(self.basedir / index_v1_json), 'repo')
 | 
					        shutil.copy(basedir / index_v1_json, 'repo')
 | 
				
			||||||
        shutil.copy(str(self.basedir / 'SpeedoMeterApp.main_1.apk'), 'repo')
 | 
					        shutil.copy(basedir / 'SpeedoMeterApp.main_1.apk', 'repo')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        def _side_effect(gpg):
 | 
					        def _side_effect(gpg):
 | 
				
			||||||
            f = gpg[-1]
 | 
					            f = gpg[-1]
 | 
				
			||||||
| 
						 | 
					@ -68,24 +57,4 @@ class GpgsignTest(unittest.TestCase):
 | 
				
			||||||
        # smoke check status JSON
 | 
					        # smoke check status JSON
 | 
				
			||||||
        with (self.repodir / 'status/gpgsign.json').open() as fp:
 | 
					        with (self.repodir / 'status/gpgsign.json').open() as fp:
 | 
				
			||||||
            data = json.load(fp)
 | 
					            data = json.load(fp)
 | 
				
			||||||
        self.assertTrue('index-v1.json' in data['signed'])
 | 
					        self.assertIn('index-v1.json', data['signed'])
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    common.parse_args(parser)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(GpgsignTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,5 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
| 
						 | 
					@ -15,31 +13,25 @@ import git
 | 
				
			||||||
import requests
 | 
					import requests
 | 
				
			||||||
import yaml
 | 
					import yaml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
localmodule = Path(__file__).resolve().parent.parent
 | 
					from .testcommon import TmpCwd, mkdtemp
 | 
				
			||||||
print('localmodule: ' + str(localmodule))
 | 
					 | 
				
			||||||
if localmodule not in sys.path:
 | 
					 | 
				
			||||||
    sys.path.insert(0, str(localmodule))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from testcommon import TmpCwd, mkdtemp, parse_args_for_test
 | 
					import fdroidserver
 | 
				
			||||||
 | 
					 | 
				
			||||||
import fdroidserver.common
 | 
					 | 
				
			||||||
import fdroidserver.import_subcommand
 | 
					import fdroidserver.import_subcommand
 | 
				
			||||||
import fdroidserver.metadata
 | 
					
 | 
				
			||||||
from fdroidserver.exception import FDroidException
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
 | 
					logging.basicConfig(level=logging.DEBUG)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ImportTest(unittest.TestCase):
 | 
					class ImportTest(unittest.TestCase):
 | 
				
			||||||
    '''fdroid import'''
 | 
					    '''fdroid import'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self.basedir = localmodule / 'tests'
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        self._td = mkdtemp()
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
        self.testdir = self._td.name
 | 
					        self.testdir = self._td.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def tearDown(self):
 | 
					    def tearDown(self):
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self._td.cleanup()
 | 
					        self._td.cleanup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_get_all_gradle_and_manifests(self):
 | 
					    def test_get_all_gradle_and_manifests(self):
 | 
				
			||||||
| 
						 | 
					@ -63,7 +55,7 @@ class ImportTest(unittest.TestCase):
 | 
				
			||||||
        paths = [Path('source-files/cn.wildfirechat.chat') / path for path in paths]
 | 
					        paths = [Path('source-files/cn.wildfirechat.chat') / path for path in paths]
 | 
				
			||||||
        self.assertEqual(sorted(paths), sorted(a))
 | 
					        self.assertEqual(sorted(paths), sorted(a))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        abspath = Path(self.basedir) / 'source-files/realm'
 | 
					        abspath = basedir / 'source-files/realm'
 | 
				
			||||||
        p = fdroidserver.import_subcommand.get_all_gradle_and_manifests(abspath)
 | 
					        p = fdroidserver.import_subcommand.get_all_gradle_and_manifests(abspath)
 | 
				
			||||||
        self.assertEqual(1, len(p))
 | 
					        self.assertEqual(1, len(p))
 | 
				
			||||||
        self.assertTrue(p[0].is_relative_to(abspath))
 | 
					        self.assertTrue(p[0].is_relative_to(abspath))
 | 
				
			||||||
| 
						 | 
					@ -99,6 +91,7 @@ class ImportTest(unittest.TestCase):
 | 
				
			||||||
                print('Skipping ImportTest!')
 | 
					                print('Skipping ImportTest!')
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            fdroidserver.common.options = type('Options', (), {'verbose': False})
 | 
				
			||||||
            app = fdroidserver.import_subcommand.get_app_from_url(url)
 | 
					            app = fdroidserver.import_subcommand.get_app_from_url(url)
 | 
				
			||||||
            fdroidserver.import_subcommand.clone_to_tmp_dir(app)
 | 
					            fdroidserver.import_subcommand.clone_to_tmp_dir(app)
 | 
				
			||||||
            self.assertEqual(app.RepoType, 'git')
 | 
					            self.assertEqual(app.RepoType, 'git')
 | 
				
			||||||
| 
						 | 
					@ -134,7 +127,7 @@ class ImportTest(unittest.TestCase):
 | 
				
			||||||
                    tmp_importer,
 | 
					                    tmp_importer,
 | 
				
			||||||
                    onerror=fdroidserver.import_subcommand.handle_retree_error_on_windows,
 | 
					                    onerror=fdroidserver.import_subcommand.handle_retree_error_on_windows,
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
                shutil.copytree(self.basedir / 'source-files' / appid, tmp_importer)
 | 
					                shutil.copytree(basedir / 'source-files' / appid, tmp_importer)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                app = fdroidserver.import_subcommand.get_app_from_url(url)
 | 
					                app = fdroidserver.import_subcommand.get_app_from_url(url)
 | 
				
			||||||
                with mock.patch(
 | 
					                with mock.patch(
 | 
				
			||||||
| 
						 | 
					@ -185,7 +178,7 @@ class ImportTest(unittest.TestCase):
 | 
				
			||||||
        the network, if it gets past the code that throws the error.
 | 
					        the network, if it gets past the code that throws the error.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        with self.assertRaises(FDroidException):
 | 
					        with self.assertRaises(fdroidserver.exception.FDroidException):
 | 
				
			||||||
            fdroidserver.import_subcommand.main()
 | 
					            fdroidserver.import_subcommand.main()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @mock.patch('sys.argv', ['fdroid import', '-u', 'https://fake/git/url.git'])
 | 
					    @mock.patch('sys.argv', ['fdroid import', '-u', 'https://fake/git/url.git'])
 | 
				
			||||||
| 
						 | 
					@ -195,29 +188,12 @@ class ImportTest(unittest.TestCase):
 | 
				
			||||||
    def test_main_local_git(self):
 | 
					    def test_main_local_git(self):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        git.Repo.init('td')
 | 
					        git.Repo.init('td')
 | 
				
			||||||
        with Path('td/build.gradle').open('w') as fp:
 | 
					        Path('td/build.gradle').write_text(
 | 
				
			||||||
            fp.write('android { defaultConfig { applicationId "com.example" } }')
 | 
					            'android { defaultConfig { applicationId "com.example" } }'
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
        fdroidserver.import_subcommand.main()
 | 
					        fdroidserver.import_subcommand.main()
 | 
				
			||||||
        with open('metadata/com.example.yml') as fp:
 | 
					        with open('metadata/com.example.yml') as fp:
 | 
				
			||||||
            data = yaml.safe_load(fp)
 | 
					            data = yaml.safe_load(fp)
 | 
				
			||||||
        self.assertEqual(data['Repo'], sys.argv[2])
 | 
					        self.assertEqual(data['Repo'], sys.argv[2])
 | 
				
			||||||
        self.assertEqual(data['RepoType'], 'git')
 | 
					        self.assertEqual(data['RepoType'], 'git')
 | 
				
			||||||
        self.assertEqual(1, len(data['Builds']))
 | 
					        self.assertEqual(1, len(data['Builds']))
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(ImportTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -3,11 +3,9 @@
 | 
				
			||||||
import copy
 | 
					import copy
 | 
				
			||||||
import datetime
 | 
					import datetime
 | 
				
			||||||
import glob
 | 
					import glob
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
 | 
					from pathlib import Path
 | 
				
			||||||
import yaml
 | 
					import yaml
 | 
				
			||||||
import zipfile
 | 
					import zipfile
 | 
				
			||||||
from unittest.mock import patch
 | 
					from unittest.mock import patch
 | 
				
			||||||
| 
						 | 
					@ -16,17 +14,12 @@ import tempfile
 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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
 | 
					import fdroidserver
 | 
				
			||||||
from fdroidserver import common, index, publish, signindex, update
 | 
					from fdroidserver import common, index, publish, signindex, update
 | 
				
			||||||
from testcommon import GP_FINGERPRINT, TmpCwd, mkdtemp, parse_args_for_test
 | 
					from .testcommon import GP_FINGERPRINT, TmpCwd, mkdtemp
 | 
				
			||||||
from pathlib import Path
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Options:
 | 
					class Options:
 | 
				
			||||||
| 
						 | 
					@ -38,17 +31,15 @@ class Options:
 | 
				
			||||||
class IndexTest(unittest.TestCase):
 | 
					class IndexTest(unittest.TestCase):
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def setUpClass(cls):
 | 
					    def setUpClass(cls):
 | 
				
			||||||
        cls.basedir = os.path.join(localmodule, 'tests')
 | 
					 | 
				
			||||||
        # TODO something should remove cls.index_v1_jar, but it was
 | 
					        # TODO something should remove cls.index_v1_jar, but it was
 | 
				
			||||||
        # causing the tests to be flaky.  There seems to be something
 | 
					        # causing the tests to be flaky.  There seems to be something
 | 
				
			||||||
        # that is running the background somehow, maybe sign_index()
 | 
					        # that is running the background somehow, maybe sign_index()
 | 
				
			||||||
        # exits before jarsigner actually finishes?
 | 
					        # exits before jarsigner actually finishes?
 | 
				
			||||||
        cls.index_v1_jar = os.path.join(cls.basedir, 'repo', 'index-v1.jar')
 | 
					        cls.index_v1_jar = basedir / 'repo' / 'index-v1.jar'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.ERROR)
 | 
					        (basedir / 'config.py').chmod(0o600)
 | 
				
			||||||
        os.chmod(os.path.join(self.basedir, 'config.py'), 0o600)
 | 
					        os.chdir(basedir)  # so read_config() can find config.py
 | 
				
			||||||
        os.chdir(self.basedir)  # so read_config() can find config.py
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        common.config = None
 | 
					        common.config = None
 | 
				
			||||||
        common.options = Options
 | 
					        common.options = Options
 | 
				
			||||||
| 
						 | 
					@ -65,11 +56,11 @@ class IndexTest(unittest.TestCase):
 | 
				
			||||||
        self._td.cleanup()
 | 
					        self._td.cleanup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _sign_test_index_v1_jar(self):
 | 
					    def _sign_test_index_v1_jar(self):
 | 
				
			||||||
        if not os.path.exists(self.index_v1_jar):
 | 
					        if not self.index_v1_jar.exists():
 | 
				
			||||||
            signindex.sign_index(os.path.dirname(self.index_v1_jar), 'index-v1.json')
 | 
					            signindex.sign_index(self.index_v1_jar.parent, 'index-v1.json')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_get_public_key_from_jar_succeeds(self):
 | 
					    def test_get_public_key_from_jar_succeeds(self):
 | 
				
			||||||
        source_dir = os.path.join(self.basedir, 'signindex')
 | 
					        source_dir = basedir / 'signindex'
 | 
				
			||||||
        for f in ('testy.jar', 'guardianproject.jar'):
 | 
					        for f in ('testy.jar', 'guardianproject.jar'):
 | 
				
			||||||
            testfile = os.path.join(source_dir, f)
 | 
					            testfile = os.path.join(source_dir, f)
 | 
				
			||||||
            jar = zipfile.ZipFile(testfile)
 | 
					            jar = zipfile.ZipFile(testfile)
 | 
				
			||||||
| 
						 | 
					@ -85,7 +76,7 @@ class IndexTest(unittest.TestCase):
 | 
				
			||||||
                self.assertTrue(fingerprint == GP_FINGERPRINT)
 | 
					                self.assertTrue(fingerprint == GP_FINGERPRINT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_get_public_key_from_jar_fails(self):
 | 
					    def test_get_public_key_from_jar_fails(self):
 | 
				
			||||||
        source_dir = os.path.join(self.basedir, 'signindex')
 | 
					        source_dir = basedir / 'signindex'
 | 
				
			||||||
        testfile = os.path.join(source_dir, 'unsigned.jar')
 | 
					        testfile = os.path.join(source_dir, 'unsigned.jar')
 | 
				
			||||||
        jar = zipfile.ZipFile(testfile)
 | 
					        jar = zipfile.ZipFile(testfile)
 | 
				
			||||||
        with self.assertRaises(index.VerificationException):
 | 
					        with self.assertRaises(index.VerificationException):
 | 
				
			||||||
| 
						 | 
					@ -186,10 +177,10 @@ class IndexTest(unittest.TestCase):
 | 
				
			||||||
            self.testdir, 'repo', os.path.basename(mirrors[0]['url'])
 | 
					            self.testdir, 'repo', os.path.basename(mirrors[0]['url'])
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks')
 | 
					        signindex.config['keystore'] = os.path.join(basedir, 'keystore.jks')
 | 
				
			||||||
        os.mkdir('repo')
 | 
					        os.mkdir('repo')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo')
 | 
					        shutil.copy(basedir / 'repo' / 'entry.json', 'repo')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo')
 | 
					        shutil.copy(basedir / 'repo' / 'index-v2.json', 'repo')
 | 
				
			||||||
        signindex.sign_index('repo', 'entry.json')
 | 
					        signindex.sign_index('repo', 'entry.json')
 | 
				
			||||||
        repo_url = 'https://fake.url/fdroid/repo'
 | 
					        repo_url = 'https://fake.url/fdroid/repo'
 | 
				
			||||||
        entry_url = 'https://fake.url/fdroid/repo/entry.jar'
 | 
					        entry_url = 'https://fake.url/fdroid/repo/entry.jar'
 | 
				
			||||||
| 
						 | 
					@ -209,10 +200,10 @@ class IndexTest(unittest.TestCase):
 | 
				
			||||||
            self.testdir, 'repo', os.path.basename(mirrors[0]['url'])
 | 
					            self.testdir, 'repo', os.path.basename(mirrors[0]['url'])
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks')
 | 
					        signindex.config['keystore'] = os.path.join(basedir, 'keystore.jks')
 | 
				
			||||||
        os.mkdir('repo')
 | 
					        os.mkdir('repo')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo')
 | 
					        shutil.copy(basedir / 'repo' / 'entry.json', 'repo')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo')
 | 
					        shutil.copy(basedir / 'repo' / 'index-v2.json', 'repo')
 | 
				
			||||||
        signindex.sign_index('repo', 'entry.json')
 | 
					        signindex.sign_index('repo', 'entry.json')
 | 
				
			||||||
        bad_fp = '0123456789001234567890012345678900123456789001234567890012345678'
 | 
					        bad_fp = '0123456789001234567890012345678900123456789001234567890012345678'
 | 
				
			||||||
        bad_fp_url = 'https://fake.url/fdroid/repo?fingerprint=' + bad_fp
 | 
					        bad_fp_url = 'https://fake.url/fdroid/repo?fingerprint=' + bad_fp
 | 
				
			||||||
| 
						 | 
					@ -240,10 +231,10 @@ class IndexTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mock_download_using_mirrors.side_effect = download_using_mirrors_def
 | 
					        mock_download_using_mirrors.side_effect = download_using_mirrors_def
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        signindex.config['keystore'] = os.path.join(self.basedir, 'keystore.jks')
 | 
					        signindex.config['keystore'] = os.path.join(basedir, 'keystore.jks')
 | 
				
			||||||
        os.mkdir('repo')
 | 
					        os.mkdir('repo')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'repo', 'entry.json'), 'repo')
 | 
					        shutil.copy(basedir / 'repo' / 'entry.json', 'repo')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'repo', 'index-v2.json'), 'repo')
 | 
					        shutil.copy(basedir / 'repo' / 'index-v2.json', 'repo')
 | 
				
			||||||
        signindex.sign_index('repo', 'entry.json')
 | 
					        signindex.sign_index('repo', 'entry.json')
 | 
				
			||||||
        url = 'https://fake.url/fdroid/repo?fingerprint=' + GP_FINGERPRINT
 | 
					        url = 'https://fake.url/fdroid/repo?fingerprint=' + GP_FINGERPRINT
 | 
				
			||||||
        with self.assertRaises(fdroidserver.exception.VerificationException):
 | 
					        with self.assertRaises(fdroidserver.exception.VerificationException):
 | 
				
			||||||
| 
						 | 
					@ -438,7 +429,7 @@ class IndexTest(unittest.TestCase):
 | 
				
			||||||
        os.mkdir('metadata')
 | 
					        os.mkdir('metadata')
 | 
				
			||||||
        os.mkdir('repo')
 | 
					        os.mkdir('repo')
 | 
				
			||||||
        metadatafile = 'metadata/info.zwanenburg.caffeinetile.yml'
 | 
					        metadatafile = 'metadata/info.zwanenburg.caffeinetile.yml'
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile)
 | 
					        shutil.copy(os.path.join(basedir, metadatafile), metadatafile)
 | 
				
			||||||
        repo_icons_dir = os.path.join('repo', 'icons')
 | 
					        repo_icons_dir = os.path.join('repo', 'icons')
 | 
				
			||||||
        self.assertFalse(os.path.isdir(repo_icons_dir))
 | 
					        self.assertFalse(os.path.isdir(repo_icons_dir))
 | 
				
			||||||
        repodict = {
 | 
					        repodict = {
 | 
				
			||||||
| 
						 | 
					@ -648,13 +639,13 @@ class IndexTest(unittest.TestCase):
 | 
				
			||||||
            html = f.read()
 | 
					            html = f.read()
 | 
				
			||||||
            pretty_html = HTMLBeautifier.beautify(html)
 | 
					            pretty_html = HTMLBeautifier.beautify(html)
 | 
				
			||||||
            self.maxDiff = None
 | 
					            self.maxDiff = None
 | 
				
			||||||
            self.assertEquals(html, pretty_html)
 | 
					            self.assertEqual(html, pretty_html)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with open(os.path.join("repo", "index.css")) as f:
 | 
					        with open(os.path.join("repo", "index.css")) as f:
 | 
				
			||||||
            css = f.read()
 | 
					            css = f.read()
 | 
				
			||||||
            pretty_css = CSSBeautifier.beautify(css)
 | 
					            pretty_css = CSSBeautifier.beautify(css)
 | 
				
			||||||
            self.maxDiff = None
 | 
					            self.maxDiff = None
 | 
				
			||||||
            self.assertEquals(css, pretty_css)
 | 
					            self.assertEqual(css, pretty_css)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_v1_sort_packages_with_invalid(self):
 | 
					    def test_v1_sort_packages_with_invalid(self):
 | 
				
			||||||
        i = [
 | 
					        i = [
 | 
				
			||||||
| 
						 | 
					@ -729,7 +720,6 @@ class IndexTest(unittest.TestCase):
 | 
				
			||||||
        c = {'repo_url': repo_url, 'mirrors': ['http://one/fdroid']}
 | 
					        c = {'repo_url': repo_url, 'mirrors': ['http://one/fdroid']}
 | 
				
			||||||
        with open('config.yml', 'w') as fp:
 | 
					        with open('config.yml', 'w') as fp:
 | 
				
			||||||
            yaml.dump(c, fp)
 | 
					            yaml.dump(c, fp)
 | 
				
			||||||
        os.system('cat config.yml')
 | 
					 | 
				
			||||||
        common.config = None
 | 
					        common.config = None
 | 
				
			||||||
        common.read_config()
 | 
					        common.read_config()
 | 
				
			||||||
        repodict = {'address': common.config['repo_url']}
 | 
					        repodict = {'address': common.config['repo_url']}
 | 
				
			||||||
| 
						 | 
					@ -866,8 +856,7 @@ class AltstoreIndexTest(unittest.TestCase):
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
					        with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
				
			||||||
            repodir = Path(tmpdir) / 'repo'
 | 
					            repodir = Path(tmpdir) / 'repo'
 | 
				
			||||||
            repodir.mkdir()
 | 
					            repodir.mkdir()
 | 
				
			||||||
            with open(repodir / "fake.ipa", "w") as f:
 | 
					            (repodir / "fake.ipa").touch()
 | 
				
			||||||
                f.write("")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            fdroidserver.index.make_altstore(
 | 
					            fdroidserver.index.make_altstore(
 | 
				
			||||||
                apps,
 | 
					                apps,
 | 
				
			||||||
| 
						 | 
					@ -916,24 +905,3 @@ class AltstoreIndexTest(unittest.TestCase):
 | 
				
			||||||
                    },
 | 
					                    },
 | 
				
			||||||
                    json.load(f),
 | 
					                    json.load(f),
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(IndexTest))
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(AltstoreIndexTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
							
								
								
									
										58
									
								
								tests/test_init.py
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										58
									
								
								tests/test_init.py
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,58 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import pathlib
 | 
				
			||||||
 | 
					import shutil
 | 
				
			||||||
 | 
					import sys
 | 
				
			||||||
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import fdroidserver.common
 | 
				
			||||||
 | 
					import fdroidserver.init
 | 
				
			||||||
 | 
					from . import testcommon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basedir = pathlib.Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class InitTest(unittest.TestCase):
 | 
				
			||||||
 | 
					    '''fdroidserver/init.py'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setUp(self):
 | 
				
			||||||
 | 
					        fdroidserver.common.config = None
 | 
				
			||||||
 | 
					        fdroidserver.init.config = None
 | 
				
			||||||
 | 
					        self._td = testcommon.mkdtemp()
 | 
				
			||||||
 | 
					        self.testdir = self._td.name
 | 
				
			||||||
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def tearDown(self):
 | 
				
			||||||
 | 
					        os.chdir(basedir)
 | 
				
			||||||
 | 
					        self._td.cleanup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_disable_in_config(self):
 | 
				
			||||||
 | 
					        configfile = pathlib.Path('config.yml')
 | 
				
			||||||
 | 
					        configfile.write_text('keystore: NONE\nkeypass: mysupersecrets\n')
 | 
				
			||||||
 | 
					        configfile.chmod(0o600)
 | 
				
			||||||
 | 
					        config = fdroidserver.common.read_config()
 | 
				
			||||||
 | 
					        self.assertEqual('NONE', config['keystore'])
 | 
				
			||||||
 | 
					        self.assertEqual('mysupersecrets', config['keypass'])
 | 
				
			||||||
 | 
					        fdroidserver.init.disable_in_config('keypass', 'comment')
 | 
				
			||||||
 | 
					        self.assertIn('#keypass:', configfile.read_text())
 | 
				
			||||||
 | 
					        fdroidserver.common.config = None
 | 
				
			||||||
 | 
					        config = fdroidserver.common.read_config()
 | 
				
			||||||
 | 
					        self.assertIsNone(config.get('keypass'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @unittest.skipIf(os.name == 'nt', "calling main() like this hangs on Windows")
 | 
				
			||||||
 | 
					    def test_main_in_empty_dir(self):
 | 
				
			||||||
 | 
					        """Test that `fdroid init` will find apksigner and add it to the config"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        shutil.copy(basedir / 'keystore.jks', self.testdir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        bindir = os.path.join(os.getcwd(), 'bin')
 | 
				
			||||||
 | 
					        os.mkdir(bindir)
 | 
				
			||||||
 | 
					        apksigner = os.path.join(bindir, 'apksigner')
 | 
				
			||||||
 | 
					        open(apksigner, 'w').close()
 | 
				
			||||||
 | 
					        os.chmod(apksigner, 0o755)  # nosec B103
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        sys.argv = ['fdroid init', '--keystore', 'keystore.jks', '--repo-keyalias=sova']
 | 
				
			||||||
 | 
					        with unittest.mock.patch.dict(os.environ, {'PATH': bindir}):
 | 
				
			||||||
 | 
					            fdroidserver.init.main()
 | 
				
			||||||
 | 
					        self.assertEqual(apksigner, fdroidserver.init.config.get('apksigner'))
 | 
				
			||||||
| 
						 | 
					@ -1,23 +1,12 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import textwrap
 | 
					import textwrap
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from unittest.mock import Mock, patch
 | 
					from unittest.mock import Mock, patch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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
 | 
					import fdroidserver
 | 
				
			||||||
from fdroidserver import common, install
 | 
					from fdroidserver import common, install
 | 
				
			||||||
from fdroidserver.exception import BuildException, FDroidException
 | 
					from fdroidserver.exception import BuildException, FDroidException
 | 
				
			||||||
| 
						 | 
					@ -265,24 +254,3 @@ class InstallTest(unittest.TestCase):
 | 
				
			||||||
    def test_download_fdroid_apk_from_github(self):
 | 
					    def test_download_fdroid_apk_from_github(self):
 | 
				
			||||||
        f = install.download_fdroid_apk_from_github()
 | 
					        f = install.download_fdroid_apk_from_github()
 | 
				
			||||||
        self.assertTrue(Path(f).exists())
 | 
					        self.assertTrue(Path(f).exists())
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
    from testcommon import parse_args_for_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    fdroidserver.install.options = parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(InstallTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,39 +1,28 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import ruamel.yaml
 | 
					import ruamel.yaml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
localmodule = Path(__file__).resolve().parent.parent
 | 
					from .testcommon import mkdtemp
 | 
				
			||||||
print('localmodule: ' + str(localmodule))
 | 
					 | 
				
			||||||
if localmodule not in sys.path:
 | 
					 | 
				
			||||||
    sys.path.insert(0, str(localmodule))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from testcommon import mkdtemp, parse_args_for_test
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import fdroidserver.common
 | 
					import fdroidserver.common
 | 
				
			||||||
import fdroidserver.lint
 | 
					import fdroidserver.lint
 | 
				
			||||||
import fdroidserver.metadata
 | 
					import fdroidserver.metadata
 | 
				
			||||||
from fdroidserver.common import CATEGORIES_CONFIG_NAME
 | 
					
 | 
				
			||||||
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class LintTest(unittest.TestCase):
 | 
					class LintTest(unittest.TestCase):
 | 
				
			||||||
    '''fdroidserver/lint.py'''
 | 
					    '''fdroidserver/lint.py'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self.basedir = localmodule / 'tests'
 | 
					 | 
				
			||||||
        self.tmpdir = localmodule / '.testfiles'
 | 
					 | 
				
			||||||
        self.tmpdir.mkdir(exist_ok=True)
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        fdroidserver.common.config = None
 | 
					        fdroidserver.common.config = None
 | 
				
			||||||
        fdroidserver.lint.config = None
 | 
					        fdroidserver.lint.config = None
 | 
				
			||||||
        fdroidserver.lint.CATEGORIES_KEYS = None
 | 
					        fdroidserver.lint.CATEGORIES_KEYS = None
 | 
				
			||||||
| 
						 | 
					@ -46,13 +35,13 @@ class LintTest(unittest.TestCase):
 | 
				
			||||||
    def test_check_for_unsupported_metadata_files(self):
 | 
					    def test_check_for_unsupported_metadata_files(self):
 | 
				
			||||||
        self.assertTrue(fdroidserver.lint.check_for_unsupported_metadata_files())
 | 
					        self.assertTrue(fdroidserver.lint.check_for_unsupported_metadata_files())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with tempfile.TemporaryDirectory(dir=str(self.tmpdir)) as testdir:
 | 
					        with tempfile.TemporaryDirectory() as testdir:
 | 
				
			||||||
            testdir = Path(testdir)
 | 
					            testdir = Path(testdir)
 | 
				
			||||||
            self.assertFalse(
 | 
					            self.assertFalse(
 | 
				
			||||||
                fdroidserver.lint.check_for_unsupported_metadata_files(testdir)
 | 
					                fdroidserver.lint.check_for_unsupported_metadata_files(testdir)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            shutil.copytree(
 | 
					            shutil.copytree(
 | 
				
			||||||
                self.basedir / 'metadata',
 | 
					                basedir / 'metadata',
 | 
				
			||||||
                testdir / 'metadata',
 | 
					                testdir / 'metadata',
 | 
				
			||||||
                ignore=shutil.ignore_patterns('apk', 'dump', '*.json'),
 | 
					                ignore=shutil.ignore_patterns('apk', 'dump', '*.json'),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
| 
						 | 
					@ -326,7 +315,9 @@ class LintTest(unittest.TestCase):
 | 
				
			||||||
        self.assertFalse(anywarns)
 | 
					        self.assertFalse(anywarns)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_check_categories_in_config(self):
 | 
					    def test_check_categories_in_config(self):
 | 
				
			||||||
        fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: ['InConfig']}
 | 
					        fdroidserver.lint.config = {
 | 
				
			||||||
 | 
					            fdroidserver.common.CATEGORIES_CONFIG_NAME: ['InConfig']
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        fdroidserver.lint.load_categories_config()
 | 
					        fdroidserver.lint.load_categories_config()
 | 
				
			||||||
        app = fdroidserver.metadata.App({'Categories': ['InConfig']})
 | 
					        app = fdroidserver.metadata.App({'Categories': ['InConfig']})
 | 
				
			||||||
        self.assertEqual(0, len(list(fdroidserver.lint.check_categories(app))))
 | 
					        self.assertEqual(0, len(list(fdroidserver.lint.check_categories(app))))
 | 
				
			||||||
| 
						 | 
					@ -338,13 +329,15 @@ class LintTest(unittest.TestCase):
 | 
				
			||||||
        self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app))))
 | 
					        self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_check_categories_empty_is_error(self):
 | 
					    def test_check_categories_empty_is_error(self):
 | 
				
			||||||
        fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: []}
 | 
					        fdroidserver.lint.config = {fdroidserver.common.CATEGORIES_CONFIG_NAME: []}
 | 
				
			||||||
        fdroidserver.lint.load_categories_config()
 | 
					        fdroidserver.lint.load_categories_config()
 | 
				
			||||||
        app = fdroidserver.metadata.App({'Categories': ['something']})
 | 
					        app = fdroidserver.metadata.App({'Categories': ['something']})
 | 
				
			||||||
        self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app))))
 | 
					        self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_check_categories_old_hardcoded_not_defined(self):
 | 
					    def test_check_categories_old_hardcoded_not_defined(self):
 | 
				
			||||||
        fdroidserver.lint.config = {CATEGORIES_CONFIG_NAME: ['foo', 'bar']}
 | 
					        fdroidserver.lint.config = {
 | 
				
			||||||
 | 
					            fdroidserver.common.CATEGORIES_CONFIG_NAME: ['foo', 'bar']
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        fdroidserver.lint.load_categories_config()
 | 
					        fdroidserver.lint.load_categories_config()
 | 
				
			||||||
        app = fdroidserver.metadata.App({'Categories': ['Writing']})
 | 
					        app = fdroidserver.metadata.App({'Categories': ['Writing']})
 | 
				
			||||||
        self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app))))
 | 
					        self.assertEqual(1, len(list(fdroidserver.lint.check_categories(app))))
 | 
				
			||||||
| 
						 | 
					@ -493,8 +486,7 @@ class LintTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class LintAntiFeaturesTest(unittest.TestCase):
 | 
					class LintAntiFeaturesTest(unittest.TestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        self.basedir = localmodule / 'tests'
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        fdroidserver.common.config = dict()
 | 
					        fdroidserver.common.config = dict()
 | 
				
			||||||
        fdroidserver.lint.ANTIFEATURES_KEYS = None
 | 
					        fdroidserver.lint.ANTIFEATURES_KEYS = None
 | 
				
			||||||
        fdroidserver.lint.load_antiFeatures_config()
 | 
					        fdroidserver.lint.load_antiFeatures_config()
 | 
				
			||||||
| 
						 | 
					@ -537,21 +529,3 @@ class LintAntiFeaturesTest(unittest.TestCase):
 | 
				
			||||||
        app = fdroidserver.metadata.App()
 | 
					        app = fdroidserver.metadata.App()
 | 
				
			||||||
        app['Builds'] = [{'antifeatures': ['Ads', 'Tracker']}]
 | 
					        app['Builds'] = [{'antifeatures': ['Ads', 'Tracker']}]
 | 
				
			||||||
        self.assertEqual(1, len(list(fdroidserver.lint.check_antiFeatures(app))))
 | 
					        self.assertEqual(1, len(list(fdroidserver.lint.check_antiFeatures(app))))
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    fdroidserver.lint.options = parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(LintTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,24 +1,14 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import pkgutil
 | 
					import pkgutil
 | 
				
			||||||
import textwrap
 | 
					import textwrap
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
from unittest import mock
 | 
					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)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from fdroidserver import common
 | 
					 | 
				
			||||||
import fdroidserver.__main__
 | 
					import fdroidserver.__main__
 | 
				
			||||||
from testcommon import TmpCwd, TmpPyPath
 | 
					from .testcommon import TmpCwd, TmpPyPath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class MainTest(unittest.TestCase):
 | 
					class MainTest(unittest.TestCase):
 | 
				
			||||||
| 
						 | 
					@ -27,7 +17,7 @@ class MainTest(unittest.TestCase):
 | 
				
			||||||
    def test_COMMANDS_check(self):
 | 
					    def test_COMMANDS_check(self):
 | 
				
			||||||
        """make sure the built in sub-command defs didn't change unintentionally"""
 | 
					        """make sure the built in sub-command defs didn't change unintentionally"""
 | 
				
			||||||
        self.assertListEqual(
 | 
					        self.assertListEqual(
 | 
				
			||||||
            [x for x in fdroidserver.__main__.COMMANDS.keys()],
 | 
					            [x for x in fdroidserver.__main__.COMMANDS],
 | 
				
			||||||
            [
 | 
					            [
 | 
				
			||||||
                'build',
 | 
					                'build',
 | 
				
			||||||
                'init',
 | 
					                'init',
 | 
				
			||||||
| 
						 | 
					@ -206,12 +196,7 @@ class MainTest(unittest.TestCase):
 | 
				
			||||||
    def test_preparse_plugin_lookup_summary_missing(self):
 | 
					    def test_preparse_plugin_lookup_summary_missing(self):
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
					        with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
				
			||||||
            with open('fdroid_testy6.py', 'w') as f:
 | 
					            with open('fdroid_testy6.py', 'w') as f:
 | 
				
			||||||
                f.write(
 | 
					                f.write("main = lambda: print('all good')")
 | 
				
			||||||
                    textwrap.dedent(
 | 
					 | 
				
			||||||
                        """\
 | 
					 | 
				
			||||||
                        main = lambda: print('all good')"""
 | 
					 | 
				
			||||||
                    )
 | 
					 | 
				
			||||||
                )
 | 
					 | 
				
			||||||
            with TmpPyPath(tmpdir):
 | 
					            with TmpPyPath(tmpdir):
 | 
				
			||||||
                p = [x for x in pkgutil.iter_modules() if x[1].startswith('fdroid_')]
 | 
					                p = [x for x in pkgutil.iter_modules() if x[1].startswith('fdroid_')]
 | 
				
			||||||
                module_dir = p[0][0].path
 | 
					                module_dir = p[0][0].path
 | 
				
			||||||
| 
						 | 
					@ -259,23 +244,3 @@ class MainTest(unittest.TestCase):
 | 
				
			||||||
                module_name = p[0][1]
 | 
					                module_name = p[0][1]
 | 
				
			||||||
                d = fdroidserver.__main__.preparse_plugin(module_name, module_path)
 | 
					                d = fdroidserver.__main__.preparse_plugin(module_name, module_path)
 | 
				
			||||||
            self.assertDictEqual(d, {'name': 'fdroid_testy8', 'summary': 'ttt'})
 | 
					            self.assertDictEqual(d, {'name': 'fdroid_testy8', 'summary': 'ttt'})
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    common.options = common.parse_args(parser)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(MainTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -2,12 +2,10 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import copy
 | 
					import copy
 | 
				
			||||||
import io
 | 
					import io
 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import random
 | 
					import random
 | 
				
			||||||
import ruamel.yaml
 | 
					import ruamel.yaml
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import textwrap
 | 
					import textwrap
 | 
				
			||||||
| 
						 | 
					@ -15,16 +13,14 @@ from collections import OrderedDict
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from unittest import mock
 | 
					from unittest import mock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
localmodule = Path(__file__).resolve().parent.parent
 | 
					 | 
				
			||||||
print('localmodule: ' + str(localmodule))
 | 
					 | 
				
			||||||
if localmodule not in sys.path:
 | 
					 | 
				
			||||||
    sys.path.insert(0, str(localmodule))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import fdroidserver
 | 
					import fdroidserver
 | 
				
			||||||
from fdroidserver import metadata
 | 
					from fdroidserver import metadata
 | 
				
			||||||
from fdroidserver.exception import MetaDataException
 | 
					from fdroidserver.exception import MetaDataException
 | 
				
			||||||
from fdroidserver.common import DEFAULT_LOCALE
 | 
					from fdroidserver.common import DEFAULT_LOCALE
 | 
				
			||||||
from testcommon import TmpCwd, mkdtemp, parse_args_for_test
 | 
					from .testcommon import TmpCwd, mkdtemp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def _get_mock_mf(s):
 | 
					def _get_mock_mf(s):
 | 
				
			||||||
| 
						 | 
					@ -37,9 +33,7 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
    '''fdroidserver/metadata.py'''
 | 
					    '''fdroidserver/metadata.py'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self.basedir = localmodule / 'tests'
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        self._td = mkdtemp()
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
        self.testdir = self._td.name
 | 
					        self.testdir = self._td.name
 | 
				
			||||||
        fdroidserver.metadata.warnings_action = 'error'
 | 
					        fdroidserver.metadata.warnings_action = 'error'
 | 
				
			||||||
| 
						 | 
					@ -57,12 +51,12 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_fieldtypes_key_exist(self):
 | 
					    def test_fieldtypes_key_exist(self):
 | 
				
			||||||
        for k in fdroidserver.metadata.fieldtypes.keys():
 | 
					        for k in fdroidserver.metadata.fieldtypes:
 | 
				
			||||||
            self.assertTrue(k in fdroidserver.metadata.yaml_app_fields)
 | 
					            self.assertIn(k, fdroidserver.metadata.yaml_app_fields)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_build_flagtypes_key_exist(self):
 | 
					    def test_build_flagtypes_key_exist(self):
 | 
				
			||||||
        for k in fdroidserver.metadata.flagtypes.keys():
 | 
					        for k in fdroidserver.metadata.flagtypes:
 | 
				
			||||||
            self.assertTrue(k in fdroidserver.metadata.build_flags)
 | 
					            self.assertIn(k, fdroidserver.metadata.build_flags)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_FieldValidator_BitcoinAddress(self):
 | 
					    def test_FieldValidator_BitcoinAddress(self):
 | 
				
			||||||
        validator = None
 | 
					        validator = None
 | 
				
			||||||
| 
						 | 
					@ -183,7 +177,7 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_valid_funding_yml_regex(self):
 | 
					    def test_valid_funding_yml_regex(self):
 | 
				
			||||||
        """Check the regex can find all the cases"""
 | 
					        """Check the regex can find all the cases"""
 | 
				
			||||||
        with (self.basedir / 'funding-usernames.yaml').open() as fp:
 | 
					        with (basedir / 'funding-usernames.yaml').open() as fp:
 | 
				
			||||||
            yaml = ruamel.yaml.YAML(typ='safe')
 | 
					            yaml = ruamel.yaml.YAML(typ='safe')
 | 
				
			||||||
            data = yaml.load(fp)
 | 
					            data = yaml.load(fp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -201,9 +195,9 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
                        m, 'this is a valid %s username: {%s}' % (k, entry)
 | 
					                        m, 'this is a valid %s username: {%s}' % (k, entry)
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @mock.patch('git.Repo')
 | 
					    @mock.patch('git.Repo', mock.Mock())
 | 
				
			||||||
    @mock.patch('logging.error')
 | 
					    @mock.patch('logging.error')
 | 
				
			||||||
    def test_read_metadata(self, logging_error, git_repo):
 | 
					    def test_read_metadata(self, logging_error):
 | 
				
			||||||
        """Read specified metadata files included in tests/, compare to stored output"""
 | 
					        """Read specified metadata files included in tests/, compare to stored output"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.maxDiff = None
 | 
					        self.maxDiff = None
 | 
				
			||||||
| 
						 | 
					@ -239,8 +233,8 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
        logging_error.assert_called()
 | 
					        logging_error.assert_called()
 | 
				
			||||||
        self.assertEqual(3, len(logging_error.call_args_list))
 | 
					        self.assertEqual(3, len(logging_error.call_args_list))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @mock.patch('git.Repo')
 | 
					    @mock.patch('git.Repo', mock.Mock())
 | 
				
			||||||
    def test_metadata_overrides_dot_fdroid_yml(self, git_Repo):
 | 
					    def test_metadata_overrides_dot_fdroid_yml(self):
 | 
				
			||||||
        """Fields in metadata files should override anything in .fdroid.yml."""
 | 
					        """Fields in metadata files should override anything in .fdroid.yml."""
 | 
				
			||||||
        app = metadata.parse_metadata('metadata/info.guardianproject.urzip.yml')
 | 
					        app = metadata.parse_metadata('metadata/info.guardianproject.urzip.yml')
 | 
				
			||||||
        self.assertEqual(app['Summary'], '一个实用工具,获取已安装在您的设备上的应用的有关信息')
 | 
					        self.assertEqual(app['Summary'], '一个实用工具,获取已安装在您的设备上的应用的有关信息')
 | 
				
			||||||
| 
						 | 
					@ -258,9 +252,9 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
            fp.write('OpenCollective: test')
 | 
					            fp.write('OpenCollective: test')
 | 
				
			||||||
        metadata.parse_metadata(yml)  # should not throw an exception
 | 
					        metadata.parse_metadata(yml)  # should not throw an exception
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @mock.patch('git.Repo')
 | 
					    @mock.patch('git.Repo', mock.Mock())
 | 
				
			||||||
    @mock.patch('logging.error')
 | 
					    @mock.patch('logging.error')
 | 
				
			||||||
    def test_rewrite_yaml_fakeotaupdate(self, logging_error, git_Repo):
 | 
					    def test_rewrite_yaml_fakeotaupdate(self, logging_error):
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as testdir:
 | 
					        with tempfile.TemporaryDirectory() as testdir:
 | 
				
			||||||
            testdir = Path(testdir)
 | 
					            testdir = Path(testdir)
 | 
				
			||||||
            fdroidserver.common.config = {'accepted_formats': ['yml']}
 | 
					            fdroidserver.common.config = {'accepted_formats': ['yml']}
 | 
				
			||||||
| 
						 | 
					@ -286,8 +280,8 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
        logging_error.assert_called()
 | 
					        logging_error.assert_called()
 | 
				
			||||||
        self.assertEqual(3, len(logging_error.call_args_list))
 | 
					        self.assertEqual(3, len(logging_error.call_args_list))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @mock.patch('git.Repo')
 | 
					    @mock.patch('git.Repo', mock.Mock())
 | 
				
			||||||
    def test_rewrite_yaml_fdroidclient(self, git_Repo):
 | 
					    def test_rewrite_yaml_fdroidclient(self):
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as testdir:
 | 
					        with tempfile.TemporaryDirectory() as testdir:
 | 
				
			||||||
            testdir = Path(testdir)
 | 
					            testdir = Path(testdir)
 | 
				
			||||||
            fdroidserver.common.config = {'accepted_formats': ['yml']}
 | 
					            fdroidserver.common.config = {'accepted_formats': ['yml']}
 | 
				
			||||||
| 
						 | 
					@ -308,14 +302,14 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
                (Path('metadata-rewrite-yml') / file_name).read_text(encoding='utf-8'),
 | 
					                (Path('metadata-rewrite-yml') / file_name).read_text(encoding='utf-8'),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @mock.patch('git.Repo')
 | 
					    @mock.patch('git.Repo', mock.Mock())
 | 
				
			||||||
    def test_rewrite_yaml_special_build_params(self, git_Repo):
 | 
					    def test_rewrite_yaml_special_build_params(self):
 | 
				
			||||||
        """Test rewriting a plain YAML metadata file without localized files."""
 | 
					        """Test rewriting a plain YAML metadata file without localized files."""
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        os.mkdir('metadata')
 | 
					        os.mkdir('metadata')
 | 
				
			||||||
        appid = 'app.with.special.build.params'
 | 
					        appid = 'app.with.special.build.params'
 | 
				
			||||||
        file_name = Path('metadata/%s.yml' % appid)
 | 
					        file_name = Path('metadata/%s.yml' % appid)
 | 
				
			||||||
        shutil.copy(self.basedir / file_name, file_name)
 | 
					        shutil.copy(basedir / file_name, file_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # rewrite metadata
 | 
					        # rewrite metadata
 | 
				
			||||||
        allapps = fdroidserver.metadata.read_metadata({appid: -1})
 | 
					        allapps = fdroidserver.metadata.read_metadata({appid: -1})
 | 
				
			||||||
| 
						 | 
					@ -326,7 +320,7 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
        self.maxDiff = None
 | 
					        self.maxDiff = None
 | 
				
			||||||
        self.assertEqual(
 | 
					        self.assertEqual(
 | 
				
			||||||
            file_name.read_text(),
 | 
					            file_name.read_text(),
 | 
				
			||||||
            (self.basedir / 'metadata-rewrite-yml' / file_name.name).read_text(),
 | 
					            (basedir / 'metadata-rewrite-yml' / file_name.name).read_text(),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_normalize_type_string(self):
 | 
					    def test_normalize_type_string(self):
 | 
				
			||||||
| 
						 | 
					@ -508,7 +502,7 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
            metadatadir.mkdir()
 | 
					            metadatadir.mkdir()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            randomlist = []
 | 
					            randomlist = []
 | 
				
			||||||
            randomapps = list((self.basedir / 'metadata').glob('*.yml'))
 | 
					            randomapps = list((basedir / 'metadata').glob('*.yml'))
 | 
				
			||||||
            random.shuffle(randomapps)
 | 
					            random.shuffle(randomapps)
 | 
				
			||||||
            i = 1
 | 
					            i = 1
 | 
				
			||||||
            for f in randomapps:
 | 
					            for f in randomapps:
 | 
				
			||||||
| 
						 | 
					@ -911,7 +905,7 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        'versionCode': 1,
 | 
					                        'versionCode': 1,
 | 
				
			||||||
                        'versionName': 'v0.1.0',
 | 
					                        'versionName': 'v0.1.0',
 | 
				
			||||||
                        'prebuild': ["a && b && " "sed -i 's,a,b,'"],
 | 
					                        'prebuild': ["a && b && sed -i 's,a,b,'"],
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                ],
 | 
					                ],
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
| 
						 | 
					@ -1553,7 +1547,7 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
            with self.assertRaisesRegex(
 | 
					            with self.assertRaisesRegex(
 | 
				
			||||||
                MetaDataException,
 | 
					                MetaDataException,
 | 
				
			||||||
                "Invalid srclib metadata: " "unknown key 'Evil' in " "'test.yml'",
 | 
					                "Invalid srclib metadata: unknown key 'Evil' in 'test.yml'",
 | 
				
			||||||
            ):
 | 
					            ):
 | 
				
			||||||
                fdroidserver.metadata.parse_yaml_srclib(Path('test.yml'))
 | 
					                fdroidserver.metadata.parse_yaml_srclib(Path('test.yml'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1788,7 +1782,6 @@ class MetadataTest(unittest.TestCase):
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_build_ndk_path(self):
 | 
					    def test_build_ndk_path(self):
 | 
				
			||||||
        """"""
 | 
					 | 
				
			||||||
        with tempfile.TemporaryDirectory(prefix='android-sdk-') as sdk_path:
 | 
					        with tempfile.TemporaryDirectory(prefix='android-sdk-') as sdk_path:
 | 
				
			||||||
            config = {'ndk_paths': {}, 'sdk_path': sdk_path}
 | 
					            config = {'ndk_paths': {}, 'sdk_path': sdk_path}
 | 
				
			||||||
            fdroidserver.common.config = config
 | 
					            fdroidserver.common.config = config
 | 
				
			||||||
| 
						 | 
					@ -2442,21 +2435,3 @@ class PostMetadataParseTest(unittest.TestCase):
 | 
				
			||||||
        self.assertEqual(*self._post_metadata_parse_build_list(True, ['true']))
 | 
					        self.assertEqual(*self._post_metadata_parse_build_list(True, ['true']))
 | 
				
			||||||
        self.assertEqual(*self._post_metadata_parse_build_script(True, ['true']))
 | 
					        self.assertEqual(*self._post_metadata_parse_build_script(True, ['true']))
 | 
				
			||||||
        self.assertEqual(*self._post_metadata_parse_build_string(True, 'true'))
 | 
					        self.assertEqual(*self._post_metadata_parse_build_string(True, 'true'))
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(MetadataTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,26 +1,16 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import random
 | 
					import random
 | 
				
			||||||
import requests
 | 
					import requests
 | 
				
			||||||
import socket
 | 
					import socket
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import threading
 | 
					import threading
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
from unittest.mock import MagicMock, patch
 | 
					from unittest.mock import MagicMock, patch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
localmodule = os.path.realpath(
 | 
					from fdroidserver import net
 | 
				
			||||||
    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, net
 | 
					 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,7 +28,7 @@ class RetryServer:
 | 
				
			||||||
    def __init__(self, port=None, failures=3):
 | 
					    def __init__(self, port=None, failures=3):
 | 
				
			||||||
        self.port = port
 | 
					        self.port = port
 | 
				
			||||||
        if self.port is None:
 | 
					        if self.port is None:
 | 
				
			||||||
            self.port = random.randint(1024, 65535)
 | 
					            self.port = random.randint(1024, 65535)  # nosec B311
 | 
				
			||||||
        self.failures = failures
 | 
					        self.failures = failures
 | 
				
			||||||
        self.stop_event = threading.Event()
 | 
					        self.stop_event = threading.Event()
 | 
				
			||||||
        threading.Thread(target=self.run_fake_server).start()
 | 
					        threading.Thread(target=self.run_fake_server).start()
 | 
				
			||||||
| 
						 | 
					@ -84,10 +74,7 @@ class RetryServer:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class NetTest(unittest.TestCase):
 | 
					class NetTest(unittest.TestCase):
 | 
				
			||||||
    basedir = Path(__file__).resolve().parent
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					 | 
				
			||||||
        self.tempdir = tempfile.TemporaryDirectory()
 | 
					        self.tempdir = tempfile.TemporaryDirectory()
 | 
				
			||||||
        os.chdir(self.tempdir.name)
 | 
					        os.chdir(self.tempdir.name)
 | 
				
			||||||
        Path('tmp').mkdir()
 | 
					        Path('tmp').mkdir()
 | 
				
			||||||
| 
						 | 
					@ -155,23 +142,3 @@ class NetTest(unittest.TestCase):
 | 
				
			||||||
        with self.assertRaises(requests.exceptions.ConnectionError):
 | 
					        with self.assertRaises(requests.exceptions.ConnectionError):
 | 
				
			||||||
            net.download_using_mirrors(['http://localhost:%d/' % server.port])
 | 
					            net.download_using_mirrors(['http://localhost:%d/' % server.port])
 | 
				
			||||||
        server.stop()
 | 
					        server.stop()
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    common.options = common.parse_args(parser)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(NetTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,10 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
 | 
					import platform
 | 
				
			||||||
import requests
 | 
					import requests
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import subprocess
 | 
					import subprocess
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
| 
						 | 
					@ -15,13 +13,6 @@ import yaml
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from unittest.mock import patch
 | 
					from unittest.mock import patch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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, exception, index, nightly
 | 
					from fdroidserver import common, exception, index, nightly
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +26,9 @@ AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME = (
 | 
				
			||||||
    'debug_keystore_k47SVrA85+oMZAexHc62PkgvIgO8TJBYN00U82xSlxc_id_rsa'
 | 
					    'debug_keystore_k47SVrA85+oMZAexHc62PkgvIgO8TJBYN00U82xSlxc_id_rsa'
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
 | 
					testroot = basedir.with_name('.testfiles')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Options:
 | 
					class Options:
 | 
				
			||||||
    allow_disabled_algorithms = False
 | 
					    allow_disabled_algorithms = False
 | 
				
			||||||
| 
						 | 
					@ -46,20 +40,20 @@ class Options:
 | 
				
			||||||
    verbose = False
 | 
					    verbose = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@unittest.skipUnless(
 | 
				
			||||||
 | 
					    platform.system() == 'Linux',
 | 
				
			||||||
 | 
					    'skipping test_nightly, it currently only works GNU/Linux',
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
class NightlyTest(unittest.TestCase):
 | 
					class NightlyTest(unittest.TestCase):
 | 
				
			||||||
    basedir = Path(__file__).resolve().parent
 | 
					 | 
				
			||||||
    path = os.environ['PATH']
 | 
					    path = os.environ['PATH']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        common.config = None
 | 
					        common.config = None
 | 
				
			||||||
        nightly.config = None
 | 
					        nightly.config = None
 | 
				
			||||||
        logging.basicConfig(level=logging.WARNING)
 | 
					        testroot.mkdir(exist_ok=True)
 | 
				
			||||||
        self.basedir = Path(localmodule) / 'tests'
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self.testroot = Path(localmodule) / '.testfiles'
 | 
					 | 
				
			||||||
        self.testroot.mkdir(exist_ok=True)
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        self.tempdir = tempfile.TemporaryDirectory(
 | 
					        self.tempdir = tempfile.TemporaryDirectory(
 | 
				
			||||||
            str(time.time()), self._testMethodName + '_', self.testroot
 | 
					            str(time.time()), self._testMethodName + '_', testroot
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        self.testdir = Path(self.tempdir.name)
 | 
					        self.testdir = Path(self.tempdir.name)
 | 
				
			||||||
        self.home = self.testdir / 'home'
 | 
					        self.home = self.testdir / 'home'
 | 
				
			||||||
| 
						 | 
					@ -70,21 +64,21 @@ class NightlyTest(unittest.TestCase):
 | 
				
			||||||
    def tearDown(self):
 | 
					    def tearDown(self):
 | 
				
			||||||
        self.tempdir.cleanup()
 | 
					        self.tempdir.cleanup()
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            os.rmdir(self.testroot)
 | 
					            os.rmdir(testroot)
 | 
				
			||||||
        except OSError:  # other test modules might have left stuff around
 | 
					        except OSError:  # other test modules might have left stuff around
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _copy_test_debug_keystore(self):
 | 
					    def _copy_test_debug_keystore(self):
 | 
				
			||||||
        self.dot_android.mkdir()
 | 
					        self.dot_android.mkdir()
 | 
				
			||||||
        shutil.copy(
 | 
					        shutil.copy(
 | 
				
			||||||
            self.basedir / 'aosp_testkey_debug.keystore',
 | 
					            basedir / 'aosp_testkey_debug.keystore',
 | 
				
			||||||
            self.dot_android / 'debug.keystore',
 | 
					            self.dot_android / 'debug.keystore',
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _copy_debug_apk(self):
 | 
					    def _copy_debug_apk(self):
 | 
				
			||||||
        outputdir = Path('app/build/output/apk/debug')
 | 
					        outputdir = Path('app/build/output/apk/debug')
 | 
				
			||||||
        outputdir.mkdir(parents=True)
 | 
					        outputdir.mkdir(parents=True)
 | 
				
			||||||
        shutil.copy(self.basedir / 'urzip.apk', outputdir / 'urzip-debug.apk')
 | 
					        shutil.copy(basedir / 'urzip.apk', outputdir / 'urzip-debug.apk')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_get_repo_base_url(self):
 | 
					    def test_get_repo_base_url(self):
 | 
				
			||||||
        for clone_url, repo_git_base, result in [
 | 
					        for clone_url, repo_git_base, result in [
 | 
				
			||||||
| 
						 | 
					@ -108,9 +102,7 @@ class NightlyTest(unittest.TestCase):
 | 
				
			||||||
    def test_get_keystore_secret_var(self):
 | 
					    def test_get_keystore_secret_var(self):
 | 
				
			||||||
        self.assertEqual(
 | 
					        self.assertEqual(
 | 
				
			||||||
            AOSP_TESTKEY_DEBUG_KEYSTORE,
 | 
					            AOSP_TESTKEY_DEBUG_KEYSTORE,
 | 
				
			||||||
            nightly._get_keystore_secret_var(
 | 
					            nightly._get_keystore_secret_var(basedir / 'aosp_testkey_debug.keystore'),
 | 
				
			||||||
                self.basedir / 'aosp_testkey_debug.keystore'
 | 
					 | 
				
			||||||
            ),
 | 
					 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @patch.dict(os.environ, clear=True)
 | 
					    @patch.dict(os.environ, clear=True)
 | 
				
			||||||
| 
						 | 
					@ -118,12 +110,12 @@ class NightlyTest(unittest.TestCase):
 | 
				
			||||||
        os.environ['HOME'] = str(self.home)
 | 
					        os.environ['HOME'] = str(self.home)
 | 
				
			||||||
        os.environ['PATH'] = self.path
 | 
					        os.environ['PATH'] = self.path
 | 
				
			||||||
        ssh_private_key_file = nightly._ssh_key_from_debug_keystore(
 | 
					        ssh_private_key_file = nightly._ssh_key_from_debug_keystore(
 | 
				
			||||||
            self.basedir / 'aosp_testkey_debug.keystore'
 | 
					            basedir / 'aosp_testkey_debug.keystore'
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        with open(ssh_private_key_file) as fp:
 | 
					        with open(ssh_private_key_file) as fp:
 | 
				
			||||||
            assert '-----BEGIN RSA PRIVATE KEY-----' in fp.read()
 | 
					            self.assertIn('-----BEGIN RSA PRIVATE KEY-----', fp.read())
 | 
				
			||||||
        with open(ssh_private_key_file + '.pub') as fp:
 | 
					        with open(ssh_private_key_file + '.pub') as fp:
 | 
				
			||||||
            assert fp.read(8) == 'ssh-rsa '
 | 
					            self.assertEqual(fp.read(8), 'ssh-rsa ')
 | 
				
			||||||
        shutil.rmtree(os.path.dirname(ssh_private_key_file))
 | 
					        shutil.rmtree(os.path.dirname(ssh_private_key_file))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @patch.dict(os.environ, clear=True)
 | 
					    @patch.dict(os.environ, clear=True)
 | 
				
			||||||
| 
						 | 
					@ -149,9 +141,9 @@ class NightlyTest(unittest.TestCase):
 | 
				
			||||||
        self._copy_test_debug_keystore()
 | 
					        self._copy_test_debug_keystore()
 | 
				
			||||||
        os.environ['HOME'] = str(self.home)
 | 
					        os.environ['HOME'] = str(self.home)
 | 
				
			||||||
        os.environ['PATH'] = self.path
 | 
					        os.environ['PATH'] = self.path
 | 
				
			||||||
        assert not dot_ssh.exists()
 | 
					        self.assertFalse(dot_ssh.exists())
 | 
				
			||||||
        nightly.main()
 | 
					        nightly.main()
 | 
				
			||||||
        assert not dot_ssh.exists()
 | 
					        self.assertFalse(dot_ssh.exists())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @patch.dict(os.environ, clear=True)
 | 
					    @patch.dict(os.environ, clear=True)
 | 
				
			||||||
    @patch('sys.argv', ['fdroid nightly', '--verbose'])
 | 
					    @patch('sys.argv', ['fdroid nightly', '--verbose'])
 | 
				
			||||||
| 
						 | 
					@ -168,8 +160,10 @@ class NightlyTest(unittest.TestCase):
 | 
				
			||||||
        os.environ['HOME'] = str(self.home)
 | 
					        os.environ['HOME'] = str(self.home)
 | 
				
			||||||
        os.environ['PATH'] = self.path
 | 
					        os.environ['PATH'] = self.path
 | 
				
			||||||
        nightly.main()
 | 
					        nightly.main()
 | 
				
			||||||
        assert (dot_ssh / AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME).exists()
 | 
					        self.assertTrue((dot_ssh / AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME).exists())
 | 
				
			||||||
        assert (dot_ssh / (AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME + '.pub')).exists()
 | 
					        self.assertTrue(
 | 
				
			||||||
 | 
					            (dot_ssh / (AOSP_TESTKEY_DEBUG_KEYSTORE_KEY_FILE_NAME + '.pub')).exists()
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @patch('fdroidserver.common.vcs_git.git', lambda args, e: common.PopenResult(1))
 | 
					    @patch('fdroidserver.common.vcs_git.git', lambda args, e: common.PopenResult(1))
 | 
				
			||||||
    @patch('sys.argv', ['fdroid nightly', '--verbose'])
 | 
					    @patch('sys.argv', ['fdroid nightly', '--verbose'])
 | 
				
			||||||
| 
						 | 
					@ -200,7 +194,7 @@ class NightlyTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _put_fdroid_in_args(self, args):
 | 
					    def _put_fdroid_in_args(self, args):
 | 
				
			||||||
        """Find fdroid command that belongs to this source code tree"""
 | 
					        """Find fdroid command that belongs to this source code tree"""
 | 
				
			||||||
        fdroid = os.path.join(localmodule, 'fdroid')
 | 
					        fdroid = os.path.join(basedir.parent, 'fdroid')
 | 
				
			||||||
        if not os.path.exists(fdroid):
 | 
					        if not os.path.exists(fdroid):
 | 
				
			||||||
            fdroid = os.getenv('fdroid')
 | 
					            fdroid = os.getenv('fdroid')
 | 
				
			||||||
        return [fdroid] + args[1:]
 | 
					        return [fdroid] + args[1:]
 | 
				
			||||||
| 
						 | 
					@ -245,7 +239,7 @@ class NightlyTest(unittest.TestCase):
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            clear=True,
 | 
					            clear=True,
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            self.assertTrue(self.testroot == Path.home().parent)
 | 
					            self.assertTrue(testroot == Path.home().parent)
 | 
				
			||||||
            with patch('subprocess.check_call', _subprocess_check_call):
 | 
					            with patch('subprocess.check_call', _subprocess_check_call):
 | 
				
			||||||
                try:
 | 
					                try:
 | 
				
			||||||
                    nightly.main()
 | 
					                    nightly.main()
 | 
				
			||||||
| 
						 | 
					@ -319,7 +313,7 @@ class NightlyTest(unittest.TestCase):
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
            clear=True,
 | 
					            clear=True,
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            self.assertTrue(self.testroot == Path.home().parent)
 | 
					            self.assertTrue(testroot == Path.home().parent)
 | 
				
			||||||
            with patch('subprocess.check_call', _subprocess_check_call):
 | 
					            with patch('subprocess.check_call', _subprocess_check_call):
 | 
				
			||||||
                try:
 | 
					                try:
 | 
				
			||||||
                    nightly.main()
 | 
					                    nightly.main()
 | 
				
			||||||
| 
						 | 
					@ -356,23 +350,3 @@ class NightlyTest(unittest.TestCase):
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            del config['identity_file']
 | 
					            del config['identity_file']
 | 
				
			||||||
            self.assertEqual(expected, config)
 | 
					            self.assertEqual(expected, config)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    common.options = common.parse_args(parser)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(NightlyTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -10,45 +10,36 @@
 | 
				
			||||||
#        -keypass 123456 -dname 'CN=test, OU=F-Droid'; done
 | 
					#        -keypass 123456 -dname 'CN=test, OU=F-Droid'; done
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
 | 
					import pathlib
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import textwrap
 | 
					 | 
				
			||||||
from unittest import mock
 | 
					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)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from fdroidserver import publish
 | 
					from fdroidserver import publish
 | 
				
			||||||
from fdroidserver import common
 | 
					from fdroidserver import common
 | 
				
			||||||
from fdroidserver import metadata
 | 
					from fdroidserver import metadata
 | 
				
			||||||
from fdroidserver import signatures
 | 
					from fdroidserver import signatures
 | 
				
			||||||
from fdroidserver.exception import FDroidException
 | 
					from fdroidserver.exception import FDroidException
 | 
				
			||||||
from testcommon import mkdtemp, parse_args_for_test
 | 
					from .testcommon import mkdtemp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basedir = pathlib.Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PublishTest(unittest.TestCase):
 | 
					class PublishTest(unittest.TestCase):
 | 
				
			||||||
    '''fdroidserver/publish.py'''
 | 
					    '''fdroidserver/publish.py'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self.basedir = os.path.join(localmodule, 'tests')
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        self._td = mkdtemp()
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
        self.testdir = self._td.name
 | 
					        self.testdir = self._td.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def tearDown(self):
 | 
					    def tearDown(self):
 | 
				
			||||||
        self._td.cleanup()
 | 
					        self._td.cleanup()
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_key_alias(self):
 | 
					    def test_key_alias(self):
 | 
				
			||||||
        publish.config = {}
 | 
					        publish.config = {}
 | 
				
			||||||
| 
						 | 
					@ -91,7 +82,7 @@ class PublishTest(unittest.TestCase):
 | 
				
			||||||
        publish.config = common.config
 | 
					        publish.config = common.config
 | 
				
			||||||
        publish.config['keystorepass'] = '123456'
 | 
					        publish.config['keystorepass'] = '123456'
 | 
				
			||||||
        publish.config['keypass'] = '123456'
 | 
					        publish.config['keypass'] = '123456'
 | 
				
			||||||
        publish.config['keystore'] = os.path.join(self.basedir, 'dummy-keystore.jks')
 | 
					        publish.config['keystore'] = os.path.join(basedir, 'dummy-keystore.jks')
 | 
				
			||||||
        publish.config['repo_keyalias'] = 'repokey'
 | 
					        publish.config['repo_keyalias'] = 'repokey'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        appids = [
 | 
					        appids = [
 | 
				
			||||||
| 
						 | 
					@ -127,12 +118,7 @@ class PublishTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with open('config.py', 'r') as f:
 | 
					        with open('config.py', 'r') as f:
 | 
				
			||||||
            self.assertEqual(
 | 
					            self.assertEqual(
 | 
				
			||||||
                textwrap.dedent(
 | 
					                '\nrepo_key_sha256 = "c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41"\n',
 | 
				
			||||||
                    '''\
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                repo_key_sha256 = "c58460800c7b250a619c30c13b07b7359a43e5af71a4352d86c58ae18c9f6d41"
 | 
					 | 
				
			||||||
                '''
 | 
					 | 
				
			||||||
                ),
 | 
					 | 
				
			||||||
                f.read(),
 | 
					                f.read(),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -142,7 +128,7 @@ class PublishTest(unittest.TestCase):
 | 
				
			||||||
        publish.config = common.config
 | 
					        publish.config = common.config
 | 
				
			||||||
        publish.config['keystorepass'] = '123456'
 | 
					        publish.config['keystorepass'] = '123456'
 | 
				
			||||||
        publish.config['keypass'] = '123456'
 | 
					        publish.config['keypass'] = '123456'
 | 
				
			||||||
        publish.config['keystore'] = os.path.join(self.basedir, 'dummy-keystore.jks')
 | 
					        publish.config['keystore'] = os.path.join(basedir, 'dummy-keystore.jks')
 | 
				
			||||||
        publish.config['repo_keyalias'] = 'repokey'
 | 
					        publish.config['repo_keyalias'] = 'repokey'
 | 
				
			||||||
        publish.config['repo_key_sha256'] = 'bad bad bad bad bad bad bad bad bad bad bad bad'
 | 
					        publish.config['repo_key_sha256'] = 'bad bad bad bad bad bad bad bad bad bad bad bad'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -273,7 +259,7 @@ class PublishTest(unittest.TestCase):
 | 
				
			||||||
        config['repo_keyalias'] = 'sova'
 | 
					        config['repo_keyalias'] = 'sova'
 | 
				
			||||||
        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir)
 | 
					        shutil.copy(basedir / 'keystore.jks', self.testdir)
 | 
				
			||||||
        config['keystore'] = 'keystore.jks'
 | 
					        config['keystore'] = 'keystore.jks'
 | 
				
			||||||
        config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US'
 | 
					        config['keydname'] = 'CN=Birdman, OU=Cell, O=Alcatraz, L=Alcatraz, S=California, C=US'
 | 
				
			||||||
        publish.config = config
 | 
					        publish.config = config
 | 
				
			||||||
| 
						 | 
					@ -293,7 +279,7 @@ class PublishTest(unittest.TestCase):
 | 
				
			||||||
        metadata.write_metadata(os.path.join('metadata', '%s.yml' % app.id), app)
 | 
					        metadata.write_metadata(os.path.join('metadata', '%s.yml' % app.id), app)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        os.mkdir('unsigned')
 | 
					        os.mkdir('unsigned')
 | 
				
			||||||
        testapk = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk')
 | 
					        testapk = basedir / 'no_targetsdk_minsdk1_unsigned.apk'
 | 
				
			||||||
        unsigned = os.path.join('unsigned', common.get_release_filename(app, build))
 | 
					        unsigned = os.path.join('unsigned', common.get_release_filename(app, build))
 | 
				
			||||||
        signed = os.path.join('repo', common.get_release_filename(app, build))
 | 
					        signed = os.path.join('repo', common.get_release_filename(app, build))
 | 
				
			||||||
        shutil.copy(testapk, unsigned)
 | 
					        shutil.copy(testapk, unsigned)
 | 
				
			||||||
| 
						 | 
					@ -348,7 +334,7 @@ class PublishTest(unittest.TestCase):
 | 
				
			||||||
        config['repo_keyalias'] = 'sova'
 | 
					        config['repo_keyalias'] = 'sova'
 | 
				
			||||||
        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, 'keystore.jks'), self.testdir)
 | 
					        shutil.copy(basedir / 'keystore.jks', self.testdir)
 | 
				
			||||||
        config['keystore'] = 'keystore.jks'
 | 
					        config['keystore'] = 'keystore.jks'
 | 
				
			||||||
        config[
 | 
					        config[
 | 
				
			||||||
            'keydname'
 | 
					            'keydname'
 | 
				
			||||||
| 
						 | 
					@ -370,7 +356,7 @@ class PublishTest(unittest.TestCase):
 | 
				
			||||||
        metadata.write_metadata(os.path.join('metadata', '%s.yml' % app.id), app)
 | 
					        metadata.write_metadata(os.path.join('metadata', '%s.yml' % app.id), app)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        os.mkdir('unsigned')
 | 
					        os.mkdir('unsigned')
 | 
				
			||||||
        testapk = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk')
 | 
					        testapk = basedir / 'no_targetsdk_minsdk1_unsigned.apk'
 | 
				
			||||||
        unsigned = os.path.join('unsigned', common.get_release_filename(app, build))
 | 
					        unsigned = os.path.join('unsigned', common.get_release_filename(app, build))
 | 
				
			||||||
        signed = os.path.join('repo', common.get_release_filename(app, build))
 | 
					        signed = os.path.join('repo', common.get_release_filename(app, build))
 | 
				
			||||||
        shutil.copy(testapk, unsigned)
 | 
					        shutil.copy(testapk, unsigned)
 | 
				
			||||||
| 
						 | 
					@ -409,23 +395,3 @@ class PublishTest(unittest.TestCase):
 | 
				
			||||||
            with self.assertRaises(SystemExit) as e:
 | 
					            with self.assertRaises(SystemExit) as e:
 | 
				
			||||||
                publish.main()
 | 
					                publish.main()
 | 
				
			||||||
            self.assertEqual(e.exception.code, 1)
 | 
					            self.assertEqual(e.exception.code, 1)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(PublishTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,29 +1,23 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import textwrap
 | 
					import textwrap
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					from unittest import mock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
localmodule = Path(__file__).resolve().parent.parent
 | 
					from fdroidserver import metadata, rewritemeta
 | 
				
			||||||
print('localmodule: ' + str(localmodule))
 | 
					from .testcommon import TmpCwd, mkdtemp
 | 
				
			||||||
if localmodule not in sys.path:
 | 
					 | 
				
			||||||
    sys.path.insert(0, str(localmodule))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from fdroidserver import common, metadata, rewritemeta
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
from testcommon import TmpCwd, mkdtemp
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class RewriteMetaTest(unittest.TestCase):
 | 
					class RewriteMetaTest(unittest.TestCase):
 | 
				
			||||||
    '''fdroidserver/publish.py'''
 | 
					    '''fdroidserver/publish.py'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self.basedir = localmodule / 'tests'
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        metadata.warnings_action = 'error'
 | 
					        metadata.warnings_action = 'error'
 | 
				
			||||||
        self._td = mkdtemp()
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
        self.testdir = self._td.name
 | 
					        self.testdir = self._td.name
 | 
				
			||||||
| 
						 | 
					@ -132,6 +126,7 @@ class RewriteMetaTest(unittest.TestCase):
 | 
				
			||||||
            [{'versionCode': 0}, {'versionCode': 1}, {'versionCode': 2}],
 | 
					            [{'versionCode': 0}, {'versionCode': 1}, {'versionCode': 2}],
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @mock.patch('sys.argv', ['fdroid rewritemeta', 'a'])
 | 
				
			||||||
    def test_rewrite_no_builds(self):
 | 
					    def test_rewrite_no_builds(self):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        Path('metadata').mkdir()
 | 
					        Path('metadata').mkdir()
 | 
				
			||||||
| 
						 | 
					@ -152,6 +147,7 @@ class RewriteMetaTest(unittest.TestCase):
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @mock.patch('sys.argv', ['fdroid rewritemeta', 'a'])
 | 
				
			||||||
    def test_rewrite_empty_build_field(self):
 | 
					    def test_rewrite_empty_build_field(self):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        Path('metadata').mkdir()
 | 
					        Path('metadata').mkdir()
 | 
				
			||||||
| 
						 | 
					@ -221,9 +217,8 @@ class RewriteMetaTest(unittest.TestCase):
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @mock.patch('sys.argv', ['fdroid rewritemeta', 'a', 'b'])
 | 
				
			||||||
    def test_rewrite_scenario_trivial(self):
 | 
					    def test_rewrite_scenario_trivial(self):
 | 
				
			||||||
        sys.argv = ['rewritemeta', 'a', 'b']
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
					        with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
				
			||||||
            Path('metadata').mkdir()
 | 
					            Path('metadata').mkdir()
 | 
				
			||||||
            with Path('metadata/a.yml').open('w') as f:
 | 
					            with Path('metadata/a.yml').open('w') as f:
 | 
				
			||||||
| 
						 | 
					@ -260,21 +255,3 @@ class RewriteMetaTest(unittest.TestCase):
 | 
				
			||||||
                    '''
 | 
					                    '''
 | 
				
			||||||
                ),
 | 
					                ),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    common.options = common.parse_args(parser)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(RewriteMetaTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,5 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import glob
 | 
					 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import pathlib
 | 
					import pathlib
 | 
				
			||||||
import re
 | 
					import re
 | 
				
			||||||
| 
						 | 
					@ -23,19 +20,13 @@ else:
 | 
				
			||||||
    import tomli as tomllib
 | 
					    import tomli as tomllib
 | 
				
			||||||
import yaml
 | 
					import yaml
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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 testcommon import TmpCwd, mkdtemp, mock_open_to_str, parse_args_for_test
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import fdroidserver.build
 | 
					import fdroidserver.build
 | 
				
			||||||
import fdroidserver.common
 | 
					import fdroidserver.common
 | 
				
			||||||
import fdroidserver.metadata
 | 
					import fdroidserver.metadata
 | 
				
			||||||
import fdroidserver.scanner
 | 
					import fdroidserver.scanner
 | 
				
			||||||
 | 
					from .testcommon import TmpCwd, mkdtemp, mock_open_to_str
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basedir = pathlib.Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Always use built-in default rules so changes in downloaded rules don't break tests.
 | 
					# Always use built-in default rules so changes in downloaded rules don't break tests.
 | 
				
			||||||
| 
						 | 
					@ -45,21 +36,18 @@ import fdroidserver.scanner
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
class ScannerTest(unittest.TestCase):
 | 
					class ScannerTest(unittest.TestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.INFO)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self.basedir = os.path.join(localmodule, 'tests')
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        self._td = mkdtemp()
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
        self.testdir = self._td.name
 | 
					        self.testdir = self._td.name
 | 
				
			||||||
        fdroidserver.scanner.ScannerTool.refresh_allowed = False
 | 
					        fdroidserver.scanner.ScannerTool.refresh_allowed = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def tearDown(self):
 | 
					    def tearDown(self):
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self._td.cleanup()
 | 
					        self._td.cleanup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_scan_source_files(self):
 | 
					    def test_scan_source_files(self):
 | 
				
			||||||
        fdroidserver.common.options = mock.Mock()
 | 
					        fdroidserver.common.options = mock.Mock()
 | 
				
			||||||
        fdroidserver.common.options.json = False
 | 
					        fdroidserver.common.options.json = False
 | 
				
			||||||
        source_files = os.path.join(self.basedir, 'source-files')
 | 
					 | 
				
			||||||
        projects = {
 | 
					        projects = {
 | 
				
			||||||
            'OtakuWorld': 2,
 | 
					            'OtakuWorld': 2,
 | 
				
			||||||
            'Zillode': 1,
 | 
					            'Zillode': 1,
 | 
				
			||||||
| 
						 | 
					@ -76,12 +64,12 @@ class ScannerTest(unittest.TestCase):
 | 
				
			||||||
            'com.lolo.io.onelist': 6,
 | 
					            'com.lolo.io.onelist': 6,
 | 
				
			||||||
            'catalog.test': 22,
 | 
					            'catalog.test': 22,
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        for d in glob.glob(os.path.join(source_files, '*')):
 | 
					        for d in (basedir / 'source-files').iterdir():
 | 
				
			||||||
            build = fdroidserver.metadata.Build()
 | 
					            build = fdroidserver.metadata.Build()
 | 
				
			||||||
            fatal_problems = fdroidserver.scanner.scan_source(d, build)
 | 
					            fatal_problems = fdroidserver.scanner.scan_source(d, build)
 | 
				
			||||||
            should = projects.get(os.path.basename(d), 0)
 | 
					            should = projects.get(d.name, 0)
 | 
				
			||||||
            self.assertEqual(
 | 
					            self.assertEqual(
 | 
				
			||||||
                should, fatal_problems, "%s should have %d errors!" % (d, should)
 | 
					                should, fatal_problems, f'{d} should have {should} errors!'
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_get_gradle_compile_commands_without_catalog(self):
 | 
					    def test_get_gradle_compile_commands_without_catalog(self):
 | 
				
			||||||
| 
						 | 
					@ -225,8 +213,7 @@ class ScannerTest(unittest.TestCase):
 | 
				
			||||||
            fp.write(b'\x00\x00')
 | 
					            fp.write(b'\x00\x00')
 | 
				
			||||||
            fp.write(uuid.uuid4().bytes)
 | 
					            fp.write(uuid.uuid4().bytes)
 | 
				
			||||||
        shutil.copyfile('binary.out', 'fake.png')
 | 
					        shutil.copyfile('binary.out', 'fake.png')
 | 
				
			||||||
        os.chmod('fake.png', 0o755)
 | 
					        os.chmod('fake.png', 0o755)  # nosec B103
 | 
				
			||||||
        os.system('ls -l binary.out')
 | 
					 | 
				
			||||||
        with open('snippet.png', 'wb') as fp:
 | 
					        with open('snippet.png', 'wb') as fp:
 | 
				
			||||||
            fp.write(
 | 
					            fp.write(
 | 
				
			||||||
                b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x000\x00\x00'
 | 
					                b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x000\x00\x00'
 | 
				
			||||||
| 
						 | 
					@ -234,8 +221,7 @@ class ScannerTest(unittest.TestCase):
 | 
				
			||||||
                b'IT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\tpHYs\x00\x00\n'
 | 
					                b'IT\x08\x08\x08\x08|\x08d\x88\x00\x00\x00\tpHYs\x00\x00\n'
 | 
				
			||||||
                b'a\x00\x00\na\x01\xfc\xccJ%\x00\x00\x00\x19tEXtSoftware'
 | 
					                b'a\x00\x00\na\x01\xfc\xccJ%\x00\x00\x00\x19tEXtSoftware'
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        os.chmod('snippet.png', 0o755)
 | 
					        os.chmod('snippet.png', 0o755)  # nosec B103
 | 
				
			||||||
        os.system('ls -l fake.png')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # run scanner as if from `fdroid build`
 | 
					        # run scanner as if from `fdroid build`
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
| 
						 | 
					@ -365,7 +351,7 @@ class ScannerTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_gradle_maven_url_regex(self):
 | 
					    def test_gradle_maven_url_regex(self):
 | 
				
			||||||
        """Check the regex can find all the cases"""
 | 
					        """Check the regex can find all the cases"""
 | 
				
			||||||
        with open(os.path.join(self.basedir, 'gradle-maven-blocks.yaml')) as fp:
 | 
					        with open(basedir / 'gradle-maven-blocks.yaml') as fp:
 | 
				
			||||||
            data = yaml.safe_load(fp)
 | 
					            data = yaml.safe_load(fp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        urls = []
 | 
					        urls = []
 | 
				
			||||||
| 
						 | 
					@ -472,7 +458,7 @@ class ScannerTest(unittest.TestCase):
 | 
				
			||||||
        apk = 'urzip.apk'
 | 
					        apk = 'urzip.apk'
 | 
				
			||||||
        mapzip = 'Norway_bouvet_europe_2.obf.zip'
 | 
					        mapzip = 'Norway_bouvet_europe_2.obf.zip'
 | 
				
			||||||
        secretfile = os.path.join(
 | 
					        secretfile = os.path.join(
 | 
				
			||||||
            self.basedir, 'org.bitbucket.tickytacky.mirrormirror_1.apk'
 | 
					            basedir, 'org.bitbucket.tickytacky.mirrormirror_1.apk'
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir:
 | 
					        with tempfile.TemporaryDirectory() as tmpdir:
 | 
				
			||||||
            shutil.copy(apk, tmpdir)
 | 
					            shutil.copy(apk, tmpdir)
 | 
				
			||||||
| 
						 | 
					@ -503,7 +489,6 @@ class ScannerTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Test_scan_binary(unittest.TestCase):
 | 
					class Test_scan_binary(unittest.TestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        self.basedir = os.path.join(localmodule, 'tests')
 | 
					 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
| 
						 | 
					@ -519,7 +504,7 @@ class Test_scan_binary(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.scanner._SCANNER_TOOL.regexs['warn_code_signatures'] = {}
 | 
					        fdroidserver.scanner._SCANNER_TOOL.regexs['warn_code_signatures'] = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_code_signature_match(self):
 | 
					    def test_code_signature_match(self):
 | 
				
			||||||
        apkfile = os.path.join(self.basedir, 'no_targetsdk_minsdk1_unsigned.apk')
 | 
					        apkfile = os.path.join(basedir, 'no_targetsdk_minsdk1_unsigned.apk')
 | 
				
			||||||
        self.assertEqual(
 | 
					        self.assertEqual(
 | 
				
			||||||
            1,
 | 
					            1,
 | 
				
			||||||
            fdroidserver.scanner.scan_binary(apkfile),
 | 
					            fdroidserver.scanner.scan_binary(apkfile),
 | 
				
			||||||
| 
						 | 
					@ -538,7 +523,7 @@ class Test_scan_binary(unittest.TestCase):
 | 
				
			||||||
        "https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1110#note_932026766",
 | 
					        "https://gitlab.com/fdroid/fdroidserver/-/merge_requests/1110#note_932026766",
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    def test_bottom_level_embedded_apk_code_signature(self):
 | 
					    def test_bottom_level_embedded_apk_code_signature(self):
 | 
				
			||||||
        apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk')
 | 
					        apkfile = os.path.join(basedir, 'apk.embedded_1.apk')
 | 
				
			||||||
        fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = {
 | 
					        fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = {
 | 
				
			||||||
            "org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile(
 | 
					            "org/bitbucket/tickytacky/mirrormirror/MainActivity": re.compile(
 | 
				
			||||||
                r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity',
 | 
					                r'.*org/bitbucket/tickytacky/mirrormirror/MainActivity',
 | 
				
			||||||
| 
						 | 
					@ -558,7 +543,7 @@ class Test_scan_binary(unittest.TestCase):
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_top_level_signature_embedded_apk_present(self):
 | 
					    def test_top_level_signature_embedded_apk_present(self):
 | 
				
			||||||
        apkfile = os.path.join(self.basedir, 'apk.embedded_1.apk')
 | 
					        apkfile = os.path.join(basedir, 'apk.embedded_1.apk')
 | 
				
			||||||
        fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = {
 | 
					        fdroidserver.scanner._SCANNER_TOOL.regexs['err_code_signatures'] = {
 | 
				
			||||||
            "org/fdroid/ci/BuildConfig": re.compile(
 | 
					            "org/fdroid/ci/BuildConfig": re.compile(
 | 
				
			||||||
                r'.*org/fdroid/ci/BuildConfig', re.IGNORECASE | re.UNICODE
 | 
					                r'.*org/fdroid/ci/BuildConfig', re.IGNORECASE | re.UNICODE
 | 
				
			||||||
| 
						 | 
					@ -577,7 +562,6 @@ class Test_scan_binary(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Test_SignatureDataController(unittest.TestCase):
 | 
					class Test_SignatureDataController(unittest.TestCase):
 | 
				
			||||||
    # __init__
 | 
					 | 
				
			||||||
    def test_init(self):
 | 
					    def test_init(self):
 | 
				
			||||||
        sdc = fdroidserver.scanner.SignatureDataController(
 | 
					        sdc = fdroidserver.scanner.SignatureDataController(
 | 
				
			||||||
            'nnn', 'fff.yml', 'https://example.com/test.json'
 | 
					            'nnn', 'fff.yml', 'https://example.com/test.json'
 | 
				
			||||||
| 
						 | 
					@ -776,8 +760,7 @@ class Test_ScannerTool(unittest.TestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        fdroidserver.common.options = None
 | 
					        fdroidserver.common.options = None
 | 
				
			||||||
        fdroidserver.common.config = None
 | 
					        fdroidserver.common.config = None
 | 
				
			||||||
        self.basedir = os.path.join(localmodule, 'tests')
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        self._td = mkdtemp()
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
        self.testdir = self._td.name
 | 
					        self.testdir = self._td.name
 | 
				
			||||||
        fdroidserver.scanner.ScannerTool.refresh_allowed = True
 | 
					        fdroidserver.scanner.ScannerTool.refresh_allowed = True
 | 
				
			||||||
| 
						 | 
					@ -785,7 +768,7 @@ class Test_ScannerTool(unittest.TestCase):
 | 
				
			||||||
    def tearDown(self):
 | 
					    def tearDown(self):
 | 
				
			||||||
        fdroidserver.common.options = None
 | 
					        fdroidserver.common.options = None
 | 
				
			||||||
        fdroidserver.common.config = None
 | 
					        fdroidserver.common.config = None
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self._td.cleanup()
 | 
					        self._td.cleanup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_load(self):
 | 
					    def test_load(self):
 | 
				
			||||||
| 
						 | 
					@ -879,30 +862,3 @@ class Test_main(unittest.TestCase):
 | 
				
			||||||
            self.exit_func.assert_not_called()
 | 
					            self.exit_func.assert_not_called()
 | 
				
			||||||
            self.read_app_args_func.assert_not_called()
 | 
					            self.read_app_args_func.assert_not_called()
 | 
				
			||||||
            self.scan_binary_func.assert_called_once_with('local.application.apk')
 | 
					            self.scan_binary_func.assert_called_once_with('local.application.apk')
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTests(
 | 
					 | 
				
			||||||
        [
 | 
					 | 
				
			||||||
            unittest.makeSuite(ScannerTest),
 | 
					 | 
				
			||||||
            unittest.makeSuite(Test_scan_binary),
 | 
					 | 
				
			||||||
            unittest.makeSuite(Test_SignatureDataController),
 | 
					 | 
				
			||||||
            unittest.makeSuite(Test_main),
 | 
					 | 
				
			||||||
        ]
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,27 +1,18 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import os
 | 
					 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import unittest
 | 
					 | 
				
			||||||
import hashlib
 | 
					import hashlib
 | 
				
			||||||
import logging
 | 
					import os
 | 
				
			||||||
 | 
					import unittest
 | 
				
			||||||
from tempfile import TemporaryDirectory
 | 
					from tempfile import TemporaryDirectory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
localmodule = os.path.realpath(
 | 
					from .testcommon import TmpCwd
 | 
				
			||||||
    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 testcommon import TmpCwd
 | 
					 | 
				
			||||||
from fdroidserver import common, signatures
 | 
					from fdroidserver import common, signatures
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basedir = os.path.dirname(__file__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class SignaturesTest(unittest.TestCase):
 | 
					class SignaturesTest(unittest.TestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					 | 
				
			||||||
        common.config = None
 | 
					        common.config = None
 | 
				
			||||||
        config = common.read_config()
 | 
					        config = common.read_config()
 | 
				
			||||||
        config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner')
 | 
					        config['jarsigner'] = common.find_sdk_tools_cmd('jarsigner')
 | 
				
			||||||
| 
						 | 
					@ -30,12 +21,11 @@ class SignaturesTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_main(self):
 | 
					    def test_main(self):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # option fixture class:
 | 
					 | 
				
			||||||
        class OptionsFixture:
 | 
					        class OptionsFixture:
 | 
				
			||||||
            APK = [os.path.abspath(os.path.join('repo', 'com.politedroid_3.apk'))]
 | 
					            APK = [os.path.join(basedir, 'repo', 'com.politedroid_3.apk')]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
					        with TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
				
			||||||
            signatures.extract(OptionsFixture())
 | 
					            signatures.extract(OptionsFixture)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # check if extracted signatures are where they are supposed to be
 | 
					            # check if extracted signatures are where they are supposed to be
 | 
				
			||||||
            # also verify weather if extracted file contian what they should
 | 
					            # also verify weather if extracted file contian what they should
 | 
				
			||||||
| 
						 | 
					@ -49,27 +39,6 @@ class SignaturesTest(unittest.TestCase):
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            for path, checksum in filesAndHashes:
 | 
					            for path, checksum in filesAndHashes:
 | 
				
			||||||
                self.assertTrue(os.path.isfile(path),
 | 
					                self.assertTrue(os.path.isfile(path),
 | 
				
			||||||
                                msg="check whether '{path}' was extracted "
 | 
					                                f'check whether {path!r} was extracted correctly.')
 | 
				
			||||||
                                    "correctly.".format(path=path))
 | 
					 | 
				
			||||||
                with open(path, 'rb') as f:
 | 
					                with open(path, 'rb') as f:
 | 
				
			||||||
                    self.assertEqual(hashlib.sha256(f.read()).hexdigest(), checksum)
 | 
					                    self.assertEqual(hashlib.sha256(f.read()).hexdigest(), checksum)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    common.options = common.parse_args(parser)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(SignaturesTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,22 +1,12 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import subprocess
 | 
					import subprocess
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import unittest
 | 
					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 apksigcopier, common, exception, signindex, update
 | 
					from fdroidserver import apksigcopier, common, exception, signindex, update
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from unittest.mock import patch
 | 
					from unittest.mock import patch
 | 
				
			||||||
| 
						 | 
					@ -46,7 +36,6 @@ class SignindexTest(unittest.TestCase):
 | 
				
			||||||
        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        signindex.config = config
 | 
					        signindex.config = config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					 | 
				
			||||||
        self.tempdir = tempfile.TemporaryDirectory()
 | 
					        self.tempdir = tempfile.TemporaryDirectory()
 | 
				
			||||||
        os.chdir(self.tempdir.name)
 | 
					        os.chdir(self.tempdir.name)
 | 
				
			||||||
        self.repodir = Path('repo')
 | 
					        self.repodir = Path('repo')
 | 
				
			||||||
| 
						 | 
					@ -187,23 +176,3 @@ class SignindexTest(unittest.TestCase):
 | 
				
			||||||
            ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE
 | 
					            ['jarsigner', '-verify', '-verbose', f], stdout=subprocess.PIPE
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        self.assertFalse(b'SHA1withRSA' in cp.stdout)
 | 
					        self.assertFalse(b'SHA1withRSA' in cp.stdout)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    common.options = common.parse_args(parser)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(SignindexTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,9 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import copy
 | 
					import copy
 | 
				
			||||||
import git
 | 
					import git
 | 
				
			||||||
import glob
 | 
					import glob
 | 
				
			||||||
import hashlib
 | 
					import hashlib
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
| 
						 | 
					@ -14,8 +11,6 @@ import random
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import string
 | 
					import string
 | 
				
			||||||
import subprocess
 | 
					import subprocess
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import tempfile
 | 
					 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
import yaml
 | 
					import yaml
 | 
				
			||||||
import zipfile
 | 
					import zipfile
 | 
				
			||||||
| 
						 | 
					@ -47,24 +42,21 @@ except ImportError:
 | 
				
			||||||
    except ImportError:
 | 
					    except ImportError:
 | 
				
			||||||
        from yaml import Loader as FullLoader
 | 
					        from yaml import Loader as FullLoader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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.common
 | 
					import fdroidserver.common
 | 
				
			||||||
import fdroidserver.exception
 | 
					import fdroidserver.exception
 | 
				
			||||||
import fdroidserver.metadata
 | 
					import fdroidserver.metadata
 | 
				
			||||||
import fdroidserver.update
 | 
					import fdroidserver.update
 | 
				
			||||||
from fdroidserver.common import CATEGORIES_CONFIG_NAME
 | 
					from fdroidserver.common import CATEGORIES_CONFIG_NAME
 | 
				
			||||||
from fdroidserver.looseversion import LooseVersion
 | 
					from fdroidserver.looseversion import LooseVersion
 | 
				
			||||||
from testcommon import TmpCwd, mkdtemp, parse_args_for_test
 | 
					from .testcommon import TmpCwd, mkdtemp
 | 
				
			||||||
 | 
					from PIL import PngImagePlugin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective')
 | 
					DONATION_FIELDS = ('Donate', 'Liberapay', 'OpenCollective')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					logging.getLogger(PngImagePlugin.__name__).setLevel(logging.INFO)
 | 
				
			||||||
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Options:
 | 
					class Options:
 | 
				
			||||||
    allow_disabled_algorithms = False
 | 
					    allow_disabled_algorithms = False
 | 
				
			||||||
| 
						 | 
					@ -80,12 +72,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
    '''fdroid update'''
 | 
					    '''fdroid update'''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.INFO)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        from PIL import PngImagePlugin
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        logging.getLogger(PngImagePlugin.__name__).setLevel(logging.INFO)
 | 
					 | 
				
			||||||
        self.basedir = os.path.join(localmodule, 'tests')
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        self._td = mkdtemp()
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
        self.testdir = self._td.name
 | 
					        self.testdir = self._td.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -93,7 +80,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.common.options = None
 | 
					        fdroidserver.common.options = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def tearDown(self):
 | 
					    def tearDown(self):
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        self._td.cleanup()
 | 
					        self._td.cleanup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_insert_store_metadata(self):
 | 
					    def test_insert_store_metadata(self):
 | 
				
			||||||
| 
						 | 
					@ -103,24 +90,22 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.update.config = config
 | 
					        fdroidserver.update.config = config
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        repo_dir = os.path.join(self.basedir, 'repo')
 | 
					        repo_dir = basedir / 'repo'
 | 
				
			||||||
        os.mkdir('metadata')
 | 
					        os.mkdir('metadata')
 | 
				
			||||||
        for packageName in (
 | 
					        for packageName in (
 | 
				
			||||||
            'obb.mainpatch.current',
 | 
					            'obb.mainpatch.current',
 | 
				
			||||||
            'org.videolan.vlc',
 | 
					            'org.videolan.vlc',
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            shutil.copytree(
 | 
					            shutil.copytree(
 | 
				
			||||||
                os.path.join(repo_dir, packageName), os.path.join('repo', packageName)
 | 
					                repo_dir / packageName, os.path.join('repo', packageName)
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        for packageName in (
 | 
					        for packageName in (
 | 
				
			||||||
            'info.guardianproject.checkey',
 | 
					            'info.guardianproject.checkey',
 | 
				
			||||||
            'info.guardianproject.urzip',
 | 
					            'info.guardianproject.urzip',
 | 
				
			||||||
            'org.smssecure.smssecure',
 | 
					            'org.smssecure.smssecure',
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            if not os.path.exists('metadata'):
 | 
					 | 
				
			||||||
                os.mkdir('metadata')
 | 
					 | 
				
			||||||
            shutil.copytree(
 | 
					            shutil.copytree(
 | 
				
			||||||
                os.path.join(self.basedir, 'metadata', packageName),
 | 
					                basedir / 'metadata' / packageName,
 | 
				
			||||||
                os.path.join('metadata', packageName),
 | 
					                os.path.join('metadata', packageName),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
        for packageName in (
 | 
					        for packageName in (
 | 
				
			||||||
| 
						 | 
					@ -129,12 +114,12 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
            'eu.siacs.conversations',
 | 
					            'eu.siacs.conversations',
 | 
				
			||||||
        ):
 | 
					        ):
 | 
				
			||||||
            shutil.copytree(
 | 
					            shutil.copytree(
 | 
				
			||||||
                os.path.join(self.basedir, 'source-files', packageName),
 | 
					                basedir / 'source-files' / packageName,
 | 
				
			||||||
                os.path.join(self.testdir, 'build', packageName),
 | 
					                os.path.join(self.testdir, 'build', packageName),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        testfilename = 'icon_yAfSvPRJukZzMMfUzvbYqwaD1XmHXNtiPBtuPVHW-6s=.png'
 | 
					        testfilename = 'icon_yAfSvPRJukZzMMfUzvbYqwaD1XmHXNtiPBtuPVHW-6s=.png'
 | 
				
			||||||
        testfile = os.path.join(repo_dir, 'org.videolan.vlc', 'en-US', 'icon.png')
 | 
					        testfile = repo_dir / 'org.videolan.vlc/en-US/icon.png'
 | 
				
			||||||
        cpdir = os.path.join('metadata', 'org.videolan.vlc', 'en-US')
 | 
					        cpdir = os.path.join('metadata', 'org.videolan.vlc', 'en-US')
 | 
				
			||||||
        cpfile = os.path.join(cpdir, testfilename)
 | 
					        cpfile = os.path.join(cpdir, testfilename)
 | 
				
			||||||
        os.makedirs(cpdir, exist_ok=True)
 | 
					        os.makedirs(cpdir, exist_ok=True)
 | 
				
			||||||
| 
						 | 
					@ -171,7 +156,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.update.insert_localized_app_metadata(apps)
 | 
					        fdroidserver.update.insert_localized_app_metadata(apps)
 | 
				
			||||||
        fdroidserver.update.ingest_screenshots_from_repo_dir(apps)
 | 
					        fdroidserver.update.ingest_screenshots_from_repo_dir(apps)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        appdir = os.path.join('repo', 'info.guardianproject.urzip', 'en-US')
 | 
					        appdir = Path('repo/info.guardianproject.urzip/en-US')
 | 
				
			||||||
        self.assertTrue(
 | 
					        self.assertTrue(
 | 
				
			||||||
            os.path.isfile(
 | 
					            os.path.isfile(
 | 
				
			||||||
                os.path.join(
 | 
					                os.path.join(
 | 
				
			||||||
| 
						 | 
					@ -190,8 +175,8 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertEqual(6, len(apps))
 | 
					        self.assertEqual(6, len(apps))
 | 
				
			||||||
        for packageName, app in apps.items():
 | 
					        for packageName, app in apps.items():
 | 
				
			||||||
            self.assertTrue('localized' in app, packageName)
 | 
					            self.assertIn('localized', app, packageName)
 | 
				
			||||||
            self.assertTrue('en-US' in app['localized'])
 | 
					            self.assertIn('en-US', app['localized'])
 | 
				
			||||||
            self.assertEqual(1, len(app['localized']))
 | 
					            self.assertEqual(1, len(app['localized']))
 | 
				
			||||||
            if packageName == 'info.guardianproject.urzip':
 | 
					            if packageName == 'info.guardianproject.urzip':
 | 
				
			||||||
                self.assertEqual(7, len(app['localized']['en-US']))
 | 
					                self.assertEqual(7, len(app['localized']['en-US']))
 | 
				
			||||||
| 
						 | 
					@ -267,7 +252,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_name_title_scraping(self):
 | 
					    def test_name_title_scraping(self):
 | 
				
			||||||
        """metadata file --> fdroiddata localized files --> fastlane/triple-t in app source --> APK"""
 | 
					        """metadata file --> fdroiddata localized files --> fastlane/triple-t in app source --> APK"""
 | 
				
			||||||
        shutil.copytree(self.basedir, self.testdir, dirs_exist_ok=True)
 | 
					        shutil.copytree(basedir, self.testdir, dirs_exist_ok=True)
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
| 
						 | 
					@ -356,7 +341,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_insert_missing_app_names_from_apks_from_repo(self):
 | 
					    def test_insert_missing_app_names_from_apks_from_repo(self):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        shutil.copytree(self.basedir, self.testdir, dirs_exist_ok=True)
 | 
					        shutil.copytree(basedir, self.testdir, dirs_exist_ok=True)
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
| 
						 | 
					@ -405,10 +390,10 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
                         repoapps['info.guardianproject.urzip']['localized']['en-US']['name'])
 | 
					                         repoapps['info.guardianproject.urzip']['localized']['en-US']['name'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_insert_triple_t_metadata(self):
 | 
					    def test_insert_triple_t_metadata(self):
 | 
				
			||||||
        importer = os.path.join(self.basedir, 'tmp', 'importer')
 | 
					        importer = basedir / 'tmp/importer'
 | 
				
			||||||
        packageName = 'org.fdroid.ci.test.app'
 | 
					        packageName = 'org.fdroid.ci.test.app'
 | 
				
			||||||
        if not os.path.isdir(importer):
 | 
					        if not os.path.isdir(importer):
 | 
				
			||||||
            logging.warning('skipping test_insert_triple_t_metadata, import.TestCase must run first!')
 | 
					            logging.warning('skipping test_insert_triple_t_metadata, test_import.py must run first!')
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
        packageDir = os.path.join(self.testdir, 'build', packageName)
 | 
					        packageDir = os.path.join(self.testdir, 'build', packageName)
 | 
				
			||||||
        shutil.copytree(importer, packageDir)
 | 
					        shutil.copytree(importer, packageDir)
 | 
				
			||||||
| 
						 | 
					@ -435,7 +420,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        apps = fdroidserver.metadata.read_metadata()
 | 
					        apps = fdroidserver.metadata.read_metadata()
 | 
				
			||||||
        fdroidserver.update.copy_triple_t_store_metadata(apps)
 | 
					        fdroidserver.update.copy_triple_t_store_metadata(apps)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # TODO ideally, this would compare the whole dict like in metadata.TestCase's test_read_metadata()
 | 
					        # TODO ideally, this would compare the whole dict like in test_metadata.test_read_metadata()
 | 
				
			||||||
        correctlocales = [
 | 
					        correctlocales = [
 | 
				
			||||||
            'ar', 'ast_ES', 'az', 'ca', 'ca_ES', 'cs-CZ', 'cs_CZ', 'da',
 | 
					            'ar', 'ast_ES', 'az', 'ca', 'ca_ES', 'cs-CZ', 'cs_CZ', 'da',
 | 
				
			||||||
            'da-DK', 'de', 'de-DE', 'el', 'en-US', 'es', 'es-ES', 'es_ES', 'et',
 | 
					            'da-DK', 'de', 'de-DE', 'el', 'en-US', 'es', 'es-ES', 'es_ES', 'et',
 | 
				
			||||||
| 
						 | 
					@ -446,12 +431,12 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
            'ru_RU', 'sv-SE', 'sv_SE', 'te', 'tr', 'tr-TR', 'uk', 'uk_UA', 'vi',
 | 
					            'ru_RU', 'sv-SE', 'sv_SE', 'te', 'tr', 'tr-TR', 'uk', 'uk_UA', 'vi',
 | 
				
			||||||
            'vi_VN', 'zh-CN', 'zh_CN', 'zh_TW',
 | 
					            'vi_VN', 'zh-CN', 'zh_CN', 'zh_TW',
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
        locales = sorted(list(apps['org.fdroid.ci.test.app']['localized'].keys()))
 | 
					        locales = sorted(apps['org.fdroid.ci.test.app']['localized'])
 | 
				
			||||||
        self.assertEqual(correctlocales, locales)
 | 
					        self.assertEqual(correctlocales, locales)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_insert_triple_t_2_metadata(self):
 | 
					    def test_insert_triple_t_2_metadata(self):
 | 
				
			||||||
        packageName = 'org.piwigo.android'
 | 
					        packageName = 'org.piwigo.android'
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'triple-t-2'), self.testdir, dirs_exist_ok=True)
 | 
					        shutil.copytree(basedir / 'triple-t-2', self.testdir, dirs_exist_ok=True)
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
| 
						 | 
					@ -489,7 +474,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        packages = ('com.anysoftkeyboard.languagepack.dutch', 'com.menny.android.anysoftkeyboard')
 | 
					        packages = ('com.anysoftkeyboard.languagepack.dutch', 'com.menny.android.anysoftkeyboard')
 | 
				
			||||||
        names = ('Dutch for AnySoftKeyboard', 'AnySoftKeyboard')
 | 
					        names = ('Dutch for AnySoftKeyboard', 'AnySoftKeyboard')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'triple-t-anysoftkeyboard'), self.testdir, dirs_exist_ok=True)
 | 
					        shutil.copytree(basedir / 'triple-t-anysoftkeyboard', self.testdir, dirs_exist_ok=True)
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for packageName, name in zip(packages, names):
 | 
					        for packageName, name in zip(packages, names):
 | 
				
			||||||
| 
						 | 
					@ -510,7 +495,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        packages = ('verifier', 'wallet')
 | 
					        packages = ('verifier', 'wallet')
 | 
				
			||||||
        names = dict(verifier='COVID Certificate Check', wallet='COVID Certificate')
 | 
					        names = dict(verifier='COVID Certificate Check', wallet='COVID Certificate')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'triple-t-multiple'), self.testdir, dirs_exist_ok=True)
 | 
					        shutil.copytree(basedir / 'triple-t-multiple', self.testdir, dirs_exist_ok=True)
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for p in packages:
 | 
					        for p in packages:
 | 
				
			||||||
| 
						 | 
					@ -530,7 +515,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
    def test_insert_triple_t_flutter(self):
 | 
					    def test_insert_triple_t_flutter(self):
 | 
				
			||||||
        packageName = 'fr.emersion.goguma'
 | 
					        packageName = 'fr.emersion.goguma'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'triple-t-flutter'), self.testdir, dirs_exist_ok=True)
 | 
					        shutil.copytree(basedir / 'triple-t-flutter', self.testdir, dirs_exist_ok=True)
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
| 
						 | 
					@ -602,8 +587,8 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def testScanApksAndObbs(self):
 | 
					    def testScanApksAndObbs(self):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo')
 | 
					        shutil.copytree(basedir / 'repo', 'repo')
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata')
 | 
					        shutil.copytree(basedir / 'metadata', 'metadata')
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        config['ndk_paths'] = dict()
 | 
					        config['ndk_paths'] = dict()
 | 
				
			||||||
| 
						 | 
					@ -657,7 +642,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
    def test_apkcache_json(self):
 | 
					    def test_apkcache_json(self):
 | 
				
			||||||
        """test the migration from pickle to json"""
 | 
					        """test the migration from pickle to json"""
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo')
 | 
					        shutil.copytree(basedir / 'repo', 'repo')
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        config['ndk_paths'] = dict()
 | 
					        config['ndk_paths'] = dict()
 | 
				
			||||||
| 
						 | 
					@ -698,7 +683,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        os.mkdir('repo')
 | 
					        os.mkdir('repo')
 | 
				
			||||||
        filename = 'Norway_bouvet_europe_2.obf.zip'
 | 
					        filename = 'Norway_bouvet_europe_2.obf.zip'
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, filename), 'repo')
 | 
					        shutil.copy(basedir / filename, 'repo')
 | 
				
			||||||
        knownapks = fdroidserver.common.KnownApks()
 | 
					        knownapks = fdroidserver.common.KnownApks()
 | 
				
			||||||
        files, fcachechanged = fdroidserver.update.scan_repo_files(dict(), 'repo', knownapks, False)
 | 
					        files, fcachechanged = fdroidserver.update.scan_repo_files(dict(), 'repo', knownapks, False)
 | 
				
			||||||
        self.assertTrue(fcachechanged)
 | 
					        self.assertTrue(fcachechanged)
 | 
				
			||||||
| 
						 | 
					@ -714,7 +699,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_read_added_date_from_all_apks(self):
 | 
					    def test_read_added_date_from_all_apks(self):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo')
 | 
					        shutil.copytree(basedir / 'repo', 'repo')
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
| 
						 | 
					@ -727,7 +712,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_apply_info_from_latest_apk(self):
 | 
					    def test_apply_info_from_latest_apk(self):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo')
 | 
					        shutil.copytree(basedir / 'repo', 'repo')
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
| 
						 | 
					@ -744,7 +729,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        fdroidserver.update.config = config
 | 
					        fdroidserver.update.config = config
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if 'apksigner' in config:
 | 
					        if 'apksigner' in config:
 | 
				
			||||||
            apk_info = fdroidserver.update.scan_apk('v2.only.sig_2.apk')
 | 
					            apk_info = fdroidserver.update.scan_apk('v2.only.sig_2.apk')
 | 
				
			||||||
| 
						 | 
					@ -852,7 +837,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        fdroidserver.update.config = config
 | 
					        fdroidserver.update.config = config
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        if os.path.basename(os.getcwd()) != 'tests':
 | 
					        if os.path.basename(os.getcwd()) != 'tests':
 | 
				
			||||||
            raise Exception('This test must be run in the "tests/" subdir')
 | 
					            raise Exception('This test must be run in the "tests/" subdir')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -900,10 +885,10 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        fdroidserver.update.config = config
 | 
					        fdroidserver.update.config = config
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
					        with mkdtemp() as tmpdir, TmpCwd(tmpdir):
 | 
				
			||||||
            os.mkdir('repo')
 | 
					            os.mkdir('repo')
 | 
				
			||||||
            apkfile = 'repo/SystemWebView-repack.apk'
 | 
					            apkfile = 'repo/SystemWebView-repack.apk'
 | 
				
			||||||
            shutil.copy(os.path.join(self.basedir, os.path.basename(apkfile)), apkfile)
 | 
					            shutil.copy(basedir / os.path.basename(apkfile), apkfile)
 | 
				
			||||||
            fdroidserver.update.scan_apk(apkfile)
 | 
					            fdroidserver.update.scan_apk(apkfile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_scan_apk_bad_namespace_in_manifest(self):
 | 
					    def test_scan_apk_bad_namespace_in_manifest(self):
 | 
				
			||||||
| 
						 | 
					@ -923,10 +908,10 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
        fdroidserver.update.config = config
 | 
					        fdroidserver.update.config = config
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
					        with mkdtemp() as tmpdir, TmpCwd(tmpdir):
 | 
				
			||||||
            os.mkdir('repo')
 | 
					            os.mkdir('repo')
 | 
				
			||||||
            apkfile = 'repo/org.sajeg.fallingblocks_3.apk'
 | 
					            apkfile = 'repo/org.sajeg.fallingblocks_3.apk'
 | 
				
			||||||
            shutil.copy(os.path.join(self.basedir, os.path.basename(apkfile)), apkfile)
 | 
					            shutil.copy(basedir / os.path.basename(apkfile), apkfile)
 | 
				
			||||||
            fdroidserver.update.scan_apk(apkfile)
 | 
					            fdroidserver.update.scan_apk(apkfile)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_process_apk(self):
 | 
					    def test_process_apk(self):
 | 
				
			||||||
| 
						 | 
					@ -935,7 +920,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
            return dumper.represent_dict(data)
 | 
					            return dumper.represent_dict(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        shutil.copytree(self.basedir, 'tests')
 | 
					        shutil.copytree(basedir, 'tests')
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
| 
						 | 
					@ -989,12 +974,12 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
            TestLoader = FullLoader
 | 
					            TestLoader = FullLoader
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                testyaml = '- !!python/object/new:fdroidserver.update.UsesPermission\n  - test\n  - null'
 | 
					                testyaml = '- !!python/object/new:fdroidserver.update.UsesPermission\n  - test\n  - null'
 | 
				
			||||||
                from_yaml = yaml.load(testyaml, Loader=TestLoader)
 | 
					                from_yaml = yaml.load(testyaml, Loader=TestLoader)  # nosec B506
 | 
				
			||||||
            except yaml.constructor.ConstructorError:
 | 
					            except yaml.constructor.ConstructorError:
 | 
				
			||||||
                from yaml import UnsafeLoader as TestLoader
 | 
					                from yaml import UnsafeLoader as TestLoader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            with open(savepath, 'r') as f:
 | 
					            with open(savepath, 'r') as f:
 | 
				
			||||||
                from_yaml = yaml.load(f, Loader=TestLoader)
 | 
					                from_yaml = yaml.load(f, Loader=TestLoader)  # nosec B506
 | 
				
			||||||
            self.maxDiff = None
 | 
					            self.maxDiff = None
 | 
				
			||||||
            if not config.get('ipfs_cid'):
 | 
					            if not config.get('ipfs_cid'):
 | 
				
			||||||
                del from_yaml['ipfsCIDv1']  # handle when ipfs_cid is not installed
 | 
					                del from_yaml['ipfsCIDv1']  # handle when ipfs_cid is not installed
 | 
				
			||||||
| 
						 | 
					@ -1017,7 +1002,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        knownapks = fdroidserver.common.KnownApks()
 | 
					        knownapks = fdroidserver.common.KnownApks()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmptestsdir, TmpCwd(tmptestsdir):
 | 
					        with mkdtemp() as tmptestsdir, TmpCwd(tmptestsdir):
 | 
				
			||||||
            os.mkdir('repo')
 | 
					            os.mkdir('repo')
 | 
				
			||||||
            os.mkdir('archive')
 | 
					            os.mkdir('archive')
 | 
				
			||||||
            # setup the repo, create icons dirs, etc.
 | 
					            # setup the repo, create icons dirs, etc.
 | 
				
			||||||
| 
						 | 
					@ -1026,7 +1011,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            disabledsigs = ['org.bitbucket.tickytacky.mirrormirror_2.apk']
 | 
					            disabledsigs = ['org.bitbucket.tickytacky.mirrormirror_2.apk']
 | 
				
			||||||
            for apkName in disabledsigs:
 | 
					            for apkName in disabledsigs:
 | 
				
			||||||
                shutil.copy(os.path.join(self.basedir, apkName),
 | 
					                shutil.copy(basedir / apkName,
 | 
				
			||||||
                            os.path.join(tmptestsdir, 'repo'))
 | 
					                            os.path.join(tmptestsdir, 'repo'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo',
 | 
					                skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo',
 | 
				
			||||||
| 
						 | 
					@ -1081,7 +1066,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            badsigs = ['urzip-badcert.apk', 'urzip-badsig.apk', 'urzip-release-unsigned.apk', ]
 | 
					            badsigs = ['urzip-badcert.apk', 'urzip-badsig.apk', 'urzip-release-unsigned.apk', ]
 | 
				
			||||||
            for apkName in badsigs:
 | 
					            for apkName in badsigs:
 | 
				
			||||||
                shutil.copy(os.path.join(self.basedir, apkName),
 | 
					                shutil.copy(basedir / apkName,
 | 
				
			||||||
                            os.path.join(self.testdir, 'repo'))
 | 
					                            os.path.join(self.testdir, 'repo'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo',
 | 
					                skip, apk, cachechanged = fdroidserver.update.process_apk({}, apkName, 'repo',
 | 
				
			||||||
| 
						 | 
					@ -1093,7 +1078,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
                self.assertFalse(cachechanged)
 | 
					                self.assertFalse(cachechanged)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_process_invalid_apk(self):
 | 
					    def test_process_invalid_apk(self):
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					        os.chdir(basedir)
 | 
				
			||||||
        if os.path.basename(os.getcwd()) != 'tests':
 | 
					        if os.path.basename(os.getcwd()) != 'tests':
 | 
				
			||||||
            raise Exception('This test must be run in the "tests/" subdir')
 | 
					            raise Exception('This test must be run in the "tests/" subdir')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1117,7 +1102,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
    def test_get_apks_without_allowed_signatures(self):
 | 
					    def test_get_apks_without_allowed_signatures(self):
 | 
				
			||||||
        """Test when no AllowedAPKSigningKeys is specified"""
 | 
					        """Test when no AllowedAPKSigningKeys is specified"""
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo')
 | 
					        shutil.copytree(basedir / 'repo', 'repo')
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
| 
						 | 
					@ -1128,6 +1113,11 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        knownapks = fdroidserver.common.KnownApks()
 | 
					        knownapks = fdroidserver.common.KnownApks()
 | 
				
			||||||
        apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks)
 | 
					        apks, cachechanged = fdroidserver.update.process_apks({}, 'repo', knownapks)
 | 
				
			||||||
        apkfile = 'v1.v2.sig_1020.apk'
 | 
					        apkfile = 'v1.v2.sig_1020.apk'
 | 
				
			||||||
 | 
					        self.assertIn(
 | 
				
			||||||
 | 
					            apkfile,
 | 
				
			||||||
 | 
					            os.listdir('repo'),
 | 
				
			||||||
 | 
					            f'{apkfile} was archived or otherwise removed from "repo"',
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
        (skip, apk, cachechanged) = fdroidserver.update.process_apk(
 | 
					        (skip, apk, cachechanged) = fdroidserver.update.process_apk(
 | 
				
			||||||
            {}, apkfile, 'repo', knownapks, False
 | 
					            {}, apkfile, 'repo', knownapks, False
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
| 
						 | 
					@ -1138,7 +1128,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
    def test_get_apks_without_allowed_signatures_allowed(self):
 | 
					    def test_get_apks_without_allowed_signatures_allowed(self):
 | 
				
			||||||
        """Test when the APK matches the specified AllowedAPKSigningKeys"""
 | 
					        """Test when the APK matches the specified AllowedAPKSigningKeys"""
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo')
 | 
					        shutil.copytree(basedir / 'repo', 'repo')
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
| 
						 | 
					@ -1163,7 +1153,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
    def test_get_apks_without_allowed_signatures_blocked(self):
 | 
					    def test_get_apks_without_allowed_signatures_blocked(self):
 | 
				
			||||||
        """Test when the APK does not match any specified AllowedAPKSigningKeys"""
 | 
					        """Test when the APK does not match any specified AllowedAPKSigningKeys"""
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo')
 | 
					        shutil.copytree(basedir / 'repo', 'repo')
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        fdroidserver.common.config = config
 | 
					        fdroidserver.common.config = config
 | 
				
			||||||
| 
						 | 
					@ -1190,12 +1180,12 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        os.mkdir('repo')
 | 
					        os.mkdir('repo')
 | 
				
			||||||
        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
					        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, testapk), testapk)
 | 
					        shutil.copy(basedir / testapk, testapk)
 | 
				
			||||||
        os.mkdir('metadata')
 | 
					        os.mkdir('metadata')
 | 
				
			||||||
        metadatafile = os.path.join('metadata', 'com.politedroid.yml')
 | 
					        metadatafile = os.path.join('metadata', 'com.politedroid.yml')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Copy and manipulate metadata file
 | 
					        # Copy and manipulate metadata file
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile)
 | 
					        shutil.copy(basedir / metadatafile, metadatafile)
 | 
				
			||||||
        with open(metadatafile, 'a') as fp:
 | 
					        with open(metadatafile, 'a') as fp:
 | 
				
			||||||
            fp.write(
 | 
					            fp.write(
 | 
				
			||||||
                '\n\nAllowedAPKSigningKeys: 32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6\n'
 | 
					                '\n\nAllowedAPKSigningKeys: 32a23624c201b949f085996ba5ed53d40f703aca4989476949cae891022e0ed6\n'
 | 
				
			||||||
| 
						 | 
					@ -1209,7 +1199,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        config['repo_keyalias'] = 'sova'
 | 
					        config['repo_keyalias'] = 'sova'
 | 
				
			||||||
        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keystorepass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
					        config['keypass'] = 'r9aquRHYoI8+dYz6jKrLntQ5/NJNASFBacJh7Jv2BlI='
 | 
				
			||||||
        config['keystore'] = os.path.join(self.basedir, 'keystore.jks')
 | 
					        config['keystore'] = os.path.join(basedir, 'keystore.jks')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertTrue(os.path.exists(testapk))
 | 
					        self.assertTrue(os.path.exists(testapk))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1219,7 +1209,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        self.assertTrue(os.path.exists(testapk))
 | 
					        self.assertTrue(os.path.exists(testapk))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Copy and manipulate metadata file again
 | 
					        # Copy and manipulate metadata file again
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, metadatafile), metadatafile)
 | 
					        shutil.copy(basedir / metadatafile, metadatafile)
 | 
				
			||||||
        with open(metadatafile, 'a') as fp:
 | 
					        with open(metadatafile, 'a') as fp:
 | 
				
			||||||
            fp.write(
 | 
					            fp.write(
 | 
				
			||||||
                '\n\nAllowedAPKSigningKeys: fa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edead\n'
 | 
					                '\n\nAllowedAPKSigningKeys: fa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edeadfa4edead\n'
 | 
				
			||||||
| 
						 | 
					@ -1232,8 +1222,8 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_translate_per_build_anti_features(self):
 | 
					    def test_translate_per_build_anti_features(self):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'repo'), 'repo')
 | 
					        shutil.copytree(basedir / 'repo', 'repo')
 | 
				
			||||||
        shutil.copytree(os.path.join(self.basedir, 'metadata'), 'metadata')
 | 
					        shutil.copytree(basedir / 'metadata', 'metadata')
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
        config['ndk_paths'] = dict()
 | 
					        config['ndk_paths'] = dict()
 | 
				
			||||||
| 
						 | 
					@ -1263,7 +1253,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					        os.chdir(self.testdir)
 | 
				
			||||||
        os.mkdir('repo')
 | 
					        os.mkdir('repo')
 | 
				
			||||||
        os.mkdir('metadata')
 | 
					        os.mkdir('metadata')
 | 
				
			||||||
        shutil.copy(os.path.join(localmodule, 'tests', 'urzip.apk'), 'repo')
 | 
					        shutil.copy(basedir / 'urzip.apk', 'repo')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
| 
						 | 
					@ -1302,7 +1292,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        # test using external template.yml
 | 
					        # test using external template.yml
 | 
				
			||||||
        os.remove(testfile)
 | 
					        os.remove(testfile)
 | 
				
			||||||
        self.assertFalse(os.path.exists(testfile))
 | 
					        self.assertFalse(os.path.exists(testfile))
 | 
				
			||||||
        shutil.copy(os.path.join(localmodule, 'examples', 'template.yml'), self.testdir)
 | 
					        shutil.copy(basedir.with_name('examples') / 'template.yml', self.testdir)
 | 
				
			||||||
        fdroidserver.update.create_metadata_from_template(apk)
 | 
					        fdroidserver.update.create_metadata_from_template(apk)
 | 
				
			||||||
        self.assertTrue(os.path.exists(testfile))
 | 
					        self.assertTrue(os.path.exists(testfile))
 | 
				
			||||||
        apps = fdroidserver.metadata.read_metadata()
 | 
					        apps = fdroidserver.metadata.read_metadata()
 | 
				
			||||||
| 
						 | 
					@ -1354,22 +1344,23 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # pylint: disable=protected-access
 | 
					        # pylint: disable=protected-access
 | 
				
			||||||
        icons_src = fdroidserver.update._get_apk_icons_src('urzip-release.apk', None)
 | 
					        icons_src = fdroidserver.update._get_apk_icons_src('urzip-release.apk', None)
 | 
				
			||||||
        assert not icons_src
 | 
					        self.assertFalse(icons_src)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_strip_and_copy_image(self):
 | 
					    def test_strip_and_copy_image(self):
 | 
				
			||||||
        in_file = os.path.join(self.basedir, 'metadata', 'info.guardianproject.urzip', 'en-US', 'images', 'icon.png')
 | 
					        in_file = basedir / 'metadata/info.guardianproject.urzip/en-US/images/icon.png'
 | 
				
			||||||
        out_file = os.path.join(self.testdir, 'icon.png')
 | 
					        out_file = os.path.join(self.testdir, 'icon.png')
 | 
				
			||||||
        fdroidserver.update._strip_and_copy_image(in_file, out_file)
 | 
					        fdroidserver.update._strip_and_copy_image(in_file, out_file)
 | 
				
			||||||
        self.assertTrue(os.path.exists(out_file))
 | 
					        self.assertTrue(os.path.exists(out_file))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        in_file = os.path.join(self.basedir, 'corrupt-featureGraphic.png')
 | 
					    def test_strip_and_copy_image_bad_filename(self):
 | 
				
			||||||
 | 
					        in_file = basedir / 'corrupt-featureGraphic.png'
 | 
				
			||||||
        out_file = os.path.join(self.testdir, 'corrupt-featureGraphic.png')
 | 
					        out_file = os.path.join(self.testdir, 'corrupt-featureGraphic.png')
 | 
				
			||||||
        fdroidserver.update._strip_and_copy_image(in_file, out_file)
 | 
					        fdroidserver.update._strip_and_copy_image(in_file, out_file)
 | 
				
			||||||
        self.assertFalse(os.path.exists(out_file))
 | 
					        self.assertFalse(os.path.exists(out_file))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_create_metadata_from_template_empty_keys(self):
 | 
					    def test_create_metadata_from_template_empty_keys(self):
 | 
				
			||||||
        apk = {'packageName': 'rocks.janicerand'}
 | 
					        apk = {'packageName': 'rocks.janicerand'}
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
					        with mkdtemp() as tmpdir, TmpCwd(tmpdir):
 | 
				
			||||||
            os.mkdir('metadata')
 | 
					            os.mkdir('metadata')
 | 
				
			||||||
            with open('template.yml', 'w') as f:
 | 
					            with open('template.yml', 'w') as f:
 | 
				
			||||||
                f.write(
 | 
					                f.write(
 | 
				
			||||||
| 
						 | 
					@ -1554,7 +1545,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
            self.assertIsNone(app.get(field))
 | 
					            self.assertIsNone(app.get(field))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_sanitize_funding_yml(self):
 | 
					    def test_sanitize_funding_yml(self):
 | 
				
			||||||
        with open(os.path.join(self.basedir, 'funding-usernames.yaml')) as fp:
 | 
					        with open(basedir / 'funding-usernames.yaml') as fp:
 | 
				
			||||||
            data = yaml.load(fp, Loader=SafeLoader)
 | 
					            data = yaml.load(fp, Loader=SafeLoader)
 | 
				
			||||||
        for k, entries in data.items():
 | 
					        for k, entries in data.items():
 | 
				
			||||||
            for entry in entries:
 | 
					            for entry in entries:
 | 
				
			||||||
| 
						 | 
					@ -1568,7 +1559,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
                    self.assertIsNotNone(m)
 | 
					                    self.assertIsNotNone(m)
 | 
				
			||||||
        self.assertIsNone(fdroidserver.update.sanitize_funding_yml_entry('foo\nbar'))
 | 
					        self.assertIsNone(fdroidserver.update.sanitize_funding_yml_entry('foo\nbar'))
 | 
				
			||||||
        self.assertIsNone(fdroidserver.update.sanitize_funding_yml_entry(
 | 
					        self.assertIsNone(fdroidserver.update.sanitize_funding_yml_entry(
 | 
				
			||||||
            ''.join(chr(random.randint(65, 90)) for _ in range(2049))))
 | 
					            ''.join(chr(random.randint(65, 90)) for _ in range(2049))))  # nosec B311
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # not recommended but valid entries
 | 
					        # not recommended but valid entries
 | 
				
			||||||
        self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(12345))
 | 
					        self.assertIsNotNone(fdroidserver.update.sanitize_funding_yml_entry(12345))
 | 
				
			||||||
| 
						 | 
					@ -1593,7 +1584,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        for f, key in files.items():
 | 
					        for f, key in files.items():
 | 
				
			||||||
            limit = config['char_limits'][key]
 | 
					            limit = config['char_limits'][key]
 | 
				
			||||||
            with open(f, 'w') as fp:
 | 
					            with open(f, 'w') as fp:
 | 
				
			||||||
                fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100)))
 | 
					                fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100)))  # nosec B311
 | 
				
			||||||
            locale = 'ru_US'
 | 
					            locale = 'ru_US'
 | 
				
			||||||
            app = dict()
 | 
					            app = dict()
 | 
				
			||||||
            fdroidserver.update._set_localized_text_entry(app, locale, key, f)
 | 
					            fdroidserver.update._set_localized_text_entry(app, locale, key, f)
 | 
				
			||||||
| 
						 | 
					@ -1628,7 +1619,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        limit = config['char_limits']['author']
 | 
					        limit = config['char_limits']['author']
 | 
				
			||||||
        for key in ('authorEmail', 'authorPhone', 'authorWebSite'):
 | 
					        for key in ('authorEmail', 'authorPhone', 'authorWebSite'):
 | 
				
			||||||
            with open(f, 'w') as fp:
 | 
					            with open(f, 'w') as fp:
 | 
				
			||||||
                fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100)))
 | 
					                fp.write(''.join(random.choice(string.ascii_letters) for i in range(limit + 100)))  # nosec B311
 | 
				
			||||||
            app = dict()
 | 
					            app = dict()
 | 
				
			||||||
            fdroidserver.update._set_author_entry(app, key, f)
 | 
					            fdroidserver.update._set_author_entry(app, key, f)
 | 
				
			||||||
            self.assertEqual(limit, len(app[key]))
 | 
					            self.assertEqual(limit, len(app[key]))
 | 
				
			||||||
| 
						 | 
					@ -1643,7 +1634,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        fdroidserver.common.config = {}
 | 
					        fdroidserver.common.config = {}
 | 
				
			||||||
        fdroidserver.update.config = {}
 | 
					        fdroidserver.update.config = {}
 | 
				
			||||||
        fdroidserver.update.options = Options
 | 
					        fdroidserver.update.options = Options
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir:
 | 
					        with mkdtemp() as tmpdir:
 | 
				
			||||||
            os.chdir(tmpdir)
 | 
					            os.chdir(tmpdir)
 | 
				
			||||||
            with mock.patch('sys.argv', ['fdroid update', '']):
 | 
					            with mock.patch('sys.argv', ['fdroid update', '']):
 | 
				
			||||||
                fdroidserver.update.status_update_json([], [])
 | 
					                fdroidserver.update.status_update_json([], [])
 | 
				
			||||||
| 
						 | 
					@ -1737,7 +1728,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        os.mkdir('repo')
 | 
					        os.mkdir('repo')
 | 
				
			||||||
        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
					        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
				
			||||||
        testapk_new = os.path.join('repo', 'Politedroid-1.5.apk')
 | 
					        testapk_new = os.path.join('repo', 'Politedroid-1.5.apk')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, testapk), testapk_new)
 | 
					        shutil.copy(basedir / testapk, testapk_new)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        config = dict()
 | 
					        config = dict()
 | 
				
			||||||
        fdroidserver.common.fill_config_defaults(config)
 | 
					        fdroidserver.common.fill_config_defaults(config)
 | 
				
			||||||
| 
						 | 
					@ -1817,14 +1808,14 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
					        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, testapk), testapk)
 | 
					        shutil.copy(basedir / testapk, testapk)
 | 
				
			||||||
        Path('metadata/com.politedroid.yml').write_text('Name: Polite')
 | 
					        Path('metadata/com.politedroid.yml').write_text('Name: Polite')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']):
 | 
					        with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']):
 | 
				
			||||||
            fdroidserver.update.main()
 | 
					            fdroidserver.update.main()
 | 
				
			||||||
        with open('repo/index-v2.json') as fp:
 | 
					        with open('repo/index-v2.json') as fp:
 | 
				
			||||||
            index = json.load(fp)
 | 
					            index = json.load(fp)
 | 
				
			||||||
        self.assertFalse(CATEGORIES_CONFIG_NAME in index['repo'])
 | 
					        self.assertNotIn(CATEGORIES_CONFIG_NAME, index['repo'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_auto_defined_categories(self):
 | 
					    def test_auto_defined_categories(self):
 | 
				
			||||||
        """Repos that don't define categories in config/ should use auto-generated."""
 | 
					        """Repos that don't define categories in config/ should use auto-generated."""
 | 
				
			||||||
| 
						 | 
					@ -1836,7 +1827,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
					        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, testapk), testapk)
 | 
					        shutil.copy(basedir / testapk, testapk)
 | 
				
			||||||
        Path('metadata/com.politedroid.yml').write_text('Categories: [Time]')
 | 
					        Path('metadata/com.politedroid.yml').write_text('Categories: [Time]')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']):
 | 
					        with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']):
 | 
				
			||||||
| 
						 | 
					@ -1858,10 +1849,10 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
					        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, testapk), testapk)
 | 
					        shutil.copy(basedir / testapk, testapk)
 | 
				
			||||||
        Path('metadata/com.politedroid.yml').write_text('Categories: [bar]')
 | 
					        Path('metadata/com.politedroid.yml').write_text('Categories: [bar]')
 | 
				
			||||||
        testapk = os.path.join('repo', 'souch.smsbypass_9.apk')
 | 
					        testapk = os.path.join('repo', 'souch.smsbypass_9.apk')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, testapk), testapk)
 | 
					        shutil.copy(basedir / testapk, testapk)
 | 
				
			||||||
        Path('metadata/souch.smsbypass.yml').write_text('Categories: [foo, bar]')
 | 
					        Path('metadata/souch.smsbypass.yml').write_text('Categories: [foo, bar]')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']):
 | 
					        with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']):
 | 
				
			||||||
| 
						 | 
					@ -1885,10 +1876,10 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
					        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, testapk), testapk)
 | 
					        shutil.copy(basedir / testapk, testapk)
 | 
				
			||||||
        Path('metadata/com.politedroid.yml').write_text('Categories: [Time]')
 | 
					        Path('metadata/com.politedroid.yml').write_text('Categories: [Time]')
 | 
				
			||||||
        testapk = os.path.join('repo', 'souch.smsbypass_9.apk')
 | 
					        testapk = os.path.join('repo', 'souch.smsbypass_9.apk')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, testapk), testapk)
 | 
					        shutil.copy(basedir / testapk, testapk)
 | 
				
			||||||
        Path('metadata/souch.smsbypass.yml').write_text('Categories: [System, Time]')
 | 
					        Path('metadata/souch.smsbypass.yml').write_text('Categories: [System, Time]')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']):
 | 
					        with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']):
 | 
				
			||||||
| 
						 | 
					@ -1915,7 +1906,7 @@ class UpdateTest(unittest.TestCase):
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
					        testapk = os.path.join('repo', 'com.politedroid_6.apk')
 | 
				
			||||||
        shutil.copy(os.path.join(self.basedir, testapk), testapk)
 | 
					        shutil.copy(basedir / testapk, testapk)
 | 
				
			||||||
        Path('metadata/com.politedroid.yml').write_text('Categories: [Time]')
 | 
					        Path('metadata/com.politedroid.yml').write_text('Categories: [Time]')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']):
 | 
					        with mock.patch('sys.argv', ['fdroid update', '--delete-unknown', '--nosign']):
 | 
				
			||||||
| 
						 | 
					@ -1937,12 +1928,8 @@ class TestParseIpa(unittest.TestCase):
 | 
				
			||||||
            biplist  # silence the linters
 | 
					            biplist  # silence the linters
 | 
				
			||||||
        except ImportError as e:
 | 
					        except ImportError as e:
 | 
				
			||||||
            self.skipTest(str(e))
 | 
					            self.skipTest(str(e))
 | 
				
			||||||
        ipa_path = os.path.join(
 | 
					        ipa_path = os.path.join(basedir, 'com.fake.IpaApp_1000000000001.ipa')
 | 
				
			||||||
            os.path.dirname(os.path.abspath(__file__)),
 | 
					 | 
				
			||||||
            'com.fake.IpaApp_1000000000001.ipa',
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
        result = fdroidserver.update.parse_ipa(ipa_path, 'fake_size', 'fake_sha')
 | 
					        result = fdroidserver.update.parse_ipa(ipa_path, 'fake_size', 'fake_sha')
 | 
				
			||||||
        self.maxDiff = None
 | 
					 | 
				
			||||||
        self.assertDictEqual(
 | 
					        self.assertDictEqual(
 | 
				
			||||||
            result,
 | 
					            result,
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
| 
						 | 
					@ -2007,12 +1994,10 @@ class TestUpdateVersionStringToInt(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestScanRepoForIpas(unittest.TestCase):
 | 
					class TestScanRepoForIpas(unittest.TestCase):
 | 
				
			||||||
    def setUp(self):
 | 
					 | 
				
			||||||
        self.maxDiff = None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def test_scan_repo_for_ipas_no_cache(self):
 | 
					    def test_scan_repo_for_ipas_no_cache(self):
 | 
				
			||||||
        self.maxDiff = None
 | 
					        self.maxDiff = None
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir, TmpCwd(tmpdir):
 | 
					        with mkdtemp() as tmpdir:
 | 
				
			||||||
 | 
					            os.chdir(tmpdir)
 | 
				
			||||||
            os.mkdir("repo")
 | 
					            os.mkdir("repo")
 | 
				
			||||||
            with open('repo/abc.Def_123.ipa', 'w') as f:
 | 
					            with open('repo/abc.Def_123.ipa', 'w') as f:
 | 
				
			||||||
                f.write('abc')
 | 
					                f.write('abc')
 | 
				
			||||||
| 
						 | 
					@ -2020,7 +2005,6 @@ class TestScanRepoForIpas(unittest.TestCase):
 | 
				
			||||||
                f.write('xyz')
 | 
					                f.write('xyz')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            apkcache = mock.MagicMock()
 | 
					            apkcache = mock.MagicMock()
 | 
				
			||||||
            # apkcache['a'] = 1
 | 
					 | 
				
			||||||
            repodir = "repo"
 | 
					            repodir = "repo"
 | 
				
			||||||
            knownapks = mock.MagicMock()
 | 
					            knownapks = mock.MagicMock()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2129,7 +2113,7 @@ class TestDiscoverIosScreenshots(unittest.TestCase):
 | 
				
			||||||
    def test_discover_ios_screenshots(self):
 | 
					    def test_discover_ios_screenshots(self):
 | 
				
			||||||
        self.maxDiff = None
 | 
					        self.maxDiff = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as fastlane_dir:
 | 
					        with mkdtemp() as fastlane_dir:
 | 
				
			||||||
            fastlane_dir = Path(fastlane_dir)
 | 
					            fastlane_dir = Path(fastlane_dir)
 | 
				
			||||||
            (fastlane_dir / "screenshots/en-US").mkdir(parents=True)
 | 
					            (fastlane_dir / "screenshots/en-US").mkdir(parents=True)
 | 
				
			||||||
            with open(fastlane_dir / "screenshots/en-US/iPhone 8+ @ iOS 16-1.png", 'w') as f:
 | 
					            with open(fastlane_dir / "screenshots/en-US/iPhone 8+ @ iOS 16-1.png", 'w') as f:
 | 
				
			||||||
| 
						 | 
					@ -2166,6 +2150,14 @@ class TestDiscoverIosScreenshots(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestCopyIosScreenshotsToRepo(unittest.TestCase):
 | 
					class TestCopyIosScreenshotsToRepo(unittest.TestCase):
 | 
				
			||||||
 | 
					    def setUp(self):
 | 
				
			||||||
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
 | 
					        os.chdir(self._td.name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def tearDown(self):
 | 
				
			||||||
 | 
					        os.chdir(basedir)
 | 
				
			||||||
 | 
					        self._td.cleanup()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_copy_ios_screenshots_to_repo(self):
 | 
					    def test_copy_ios_screenshots_to_repo(self):
 | 
				
			||||||
        self.maxDiff = None
 | 
					        self.maxDiff = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2218,7 +2210,7 @@ class TestGetIpaIcon(unittest.TestCase):
 | 
				
			||||||
    def test_get_ipa_icon(self):
 | 
					    def test_get_ipa_icon(self):
 | 
				
			||||||
        self.maxDiff = None
 | 
					        self.maxDiff = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir:
 | 
					        with mkdtemp() as tmpdir:
 | 
				
			||||||
            tmpdir = Path(tmpdir)
 | 
					            tmpdir = Path(tmpdir)
 | 
				
			||||||
            (tmpdir / 'OnionBrowser.xcodeproj').mkdir()
 | 
					            (tmpdir / 'OnionBrowser.xcodeproj').mkdir()
 | 
				
			||||||
            with open(tmpdir / 'OnionBrowser.xcodeproj/project.pbxproj', "w") as f:
 | 
					            with open(tmpdir / 'OnionBrowser.xcodeproj/project.pbxproj', "w") as f:
 | 
				
			||||||
| 
						 | 
					@ -2245,7 +2237,7 @@ class TestParseFromPbxproj(unittest.TestCase):
 | 
				
			||||||
    def test_parse_from_pbxproj(self):
 | 
					    def test_parse_from_pbxproj(self):
 | 
				
			||||||
        self.maxDiff = None
 | 
					        self.maxDiff = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        with tempfile.TemporaryDirectory() as tmpdir:
 | 
					        with mkdtemp() as tmpdir:
 | 
				
			||||||
            with open(Path(tmpdir) / "asdf.pbxproj", 'w', encoding="utf-8") as f:
 | 
					            with open(Path(tmpdir) / "asdf.pbxproj", 'w', encoding="utf-8") as f:
 | 
				
			||||||
                f.write("""
 | 
					                f.write("""
 | 
				
			||||||
                    230jfaod=flc'
 | 
					                    230jfaod=flc'
 | 
				
			||||||
| 
						 | 
					@ -2257,29 +2249,3 @@ class TestParseFromPbxproj(unittest.TestCase):
 | 
				
			||||||
                "ASSETCATALOG_COMPILER_APPICON_NAME"
 | 
					                "ASSETCATALOG_COMPILER_APPICON_NAME"
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            self.assertEqual(v, "MyIcon")
 | 
					            self.assertEqual(v, "MyIcon")
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(UpdateTest))
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(TestUpdateVersionStringToInt))
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(TestScanRepoForIpas))
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(TestParseIosScreenShotName))
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(TestInsertLocalizedIosAppMetadata))
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(TestDiscoverIosScreenshots))
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(TestGetIpaIcon))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,45 +1,26 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# http://www.drdobbs.com/testing/unit-testing-with-python/240165163
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from git import Repo
 | 
					from git import Repo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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.build
 | 
					 | 
				
			||||||
import fdroidserver.common
 | 
					import fdroidserver.common
 | 
				
			||||||
import fdroidserver.metadata
 | 
					import fdroidserver.metadata
 | 
				
			||||||
import fdroidserver.scanner
 | 
					from .testcommon import mkdtemp
 | 
				
			||||||
from testcommon import mkdtemp, parse_args_for_test
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VCSTest(unittest.TestCase):
 | 
					class VCSTest(unittest.TestCase):
 | 
				
			||||||
    """For some reason the VCS classes are in fdroidserver/common.py"""
 | 
					    """For some reason the VCS classes are in fdroidserver/common.py"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					 | 
				
			||||||
        self.basedir = os.path.join(localmodule, 'tests')
 | 
					 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
        self._td = mkdtemp()
 | 
					        self._td = mkdtemp()
 | 
				
			||||||
        self.testdir = self._td.name
 | 
					        os.chdir(self._td.name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def tearDown(self):
 | 
					    def tearDown(self):
 | 
				
			||||||
        self._td.cleanup()
 | 
					        self._td.cleanup()
 | 
				
			||||||
        os.chdir(self.basedir)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_remote_set_head_can_fail(self):
 | 
					    def test_remote_set_head_can_fail(self):
 | 
				
			||||||
        os.chdir(self.testdir)
 | 
					 | 
				
			||||||
        # First create an upstream repo with one commit
 | 
					        # First create an upstream repo with one commit
 | 
				
			||||||
        upstream_repo = Repo.init("upstream_repo")
 | 
					        upstream_repo = Repo.init("upstream_repo")
 | 
				
			||||||
        with open(upstream_repo.working_dir + "/file", 'w') as f:
 | 
					        with open(upstream_repo.working_dir + "/file", 'w') as f:
 | 
				
			||||||
| 
						 | 
					@ -72,6 +53,8 @@ class VCSTest(unittest.TestCase):
 | 
				
			||||||
        build.androidupdate = ['no']
 | 
					        build.androidupdate = ['no']
 | 
				
			||||||
        vcs, build_dir = fdroidserver.common.setup_vcs(app)
 | 
					        vcs, build_dir = fdroidserver.common.setup_vcs(app)
 | 
				
			||||||
        # force an init of the repo, the remote head error only occurs on the second gotorevision call
 | 
					        # force an init of the repo, the remote head error only occurs on the second gotorevision call
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fdroidserver.common.options = type('Options', (), {'verbose': False})
 | 
				
			||||||
        vcs.gotorevision(build.commit)
 | 
					        vcs.gotorevision(build.commit)
 | 
				
			||||||
        fdroidserver.common.prepare_source(
 | 
					        fdroidserver.common.prepare_source(
 | 
				
			||||||
            vcs,
 | 
					            vcs,
 | 
				
			||||||
| 
						 | 
					@ -82,23 +65,3 @@ class VCSTest(unittest.TestCase):
 | 
				
			||||||
            extlib_dir="ignore",
 | 
					            extlib_dir="ignore",
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        self.assertTrue(os.path.isfile("build/com.gpl.rpg.AndorsTrail/file"))
 | 
					        self.assertTrue(os.path.isfile("build/com.gpl.rpg.AndorsTrail/file"))
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    parse_args_for_test(parser, sys.argv)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(VCSTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,25 +1,15 @@
 | 
				
			||||||
#!/usr/bin/env python3
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import inspect
 | 
					 | 
				
			||||||
import json
 | 
					import json
 | 
				
			||||||
import logging
 | 
					 | 
				
			||||||
import os
 | 
					import os
 | 
				
			||||||
import shutil
 | 
					import shutil
 | 
				
			||||||
import sys
 | 
					 | 
				
			||||||
import tempfile
 | 
					import tempfile
 | 
				
			||||||
import unittest
 | 
					import unittest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from pathlib import Path
 | 
					from pathlib import Path
 | 
				
			||||||
from unittest.mock import patch
 | 
					from unittest.mock import patch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
localmodule = os.path.realpath(
 | 
					from fdroidserver import verify
 | 
				
			||||||
    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, verify
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST_APP_ENTRY = {
 | 
					TEST_APP_ENTRY = {
 | 
				
			||||||
| 
						 | 
					@ -45,12 +35,11 @@ TEST_APP_ENTRY = {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					basedir = Path(__file__).parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VerifyTest(unittest.TestCase):
 | 
					class VerifyTest(unittest.TestCase):
 | 
				
			||||||
    basedir = Path(__file__).resolve().parent
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def setUp(self):
 | 
					    def setUp(self):
 | 
				
			||||||
        logging.basicConfig(level=logging.DEBUG)
 | 
					 | 
				
			||||||
        self.tempdir = tempfile.TemporaryDirectory()
 | 
					        self.tempdir = tempfile.TemporaryDirectory()
 | 
				
			||||||
        os.chdir(self.tempdir.name)
 | 
					        os.chdir(self.tempdir.name)
 | 
				
			||||||
        self.repodir = Path('repo')
 | 
					        self.repodir = Path('repo')
 | 
				
			||||||
| 
						 | 
					@ -72,8 +61,8 @@ class VerifyTest(unittest.TestCase):
 | 
				
			||||||
        remote_apk = 'tmp/' + apk_name
 | 
					        remote_apk = 'tmp/' + apk_name
 | 
				
			||||||
        unsigned_apk = 'unsigned/' + apk_name
 | 
					        unsigned_apk = 'unsigned/' + apk_name
 | 
				
			||||||
        # TODO common.use apk_strip_v1_signatures() on unsigned_apk
 | 
					        # TODO common.use apk_strip_v1_signatures() on unsigned_apk
 | 
				
			||||||
        shutil.copy(str(self.basedir / 'repo' / apk_name), remote_apk)
 | 
					        shutil.copy(basedir / 'repo' / apk_name, remote_apk)
 | 
				
			||||||
        shutil.copy(str(self.basedir / 'repo' / apk_name), unsigned_apk)
 | 
					        shutil.copy(basedir / 'repo' / apk_name, unsigned_apk)
 | 
				
			||||||
        url = TEST_APP_ENTRY['1539780240.3885746']['url']
 | 
					        url = TEST_APP_ENTRY['1539780240.3885746']['url']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertFalse(verified_json.exists())
 | 
					        self.assertFalse(verified_json.exists())
 | 
				
			||||||
| 
						 | 
					@ -88,23 +77,3 @@ class VerifyTest(unittest.TestCase):
 | 
				
			||||||
            secondpass = json.load(fp)
 | 
					            secondpass = json.load(fp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertEqual(firstpass, secondpass)
 | 
					        self.assertEqual(firstpass, secondpass)
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
if __name__ == "__main__":
 | 
					 | 
				
			||||||
    os.chdir(os.path.dirname(__file__))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    import argparse
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    parser = argparse.ArgumentParser()
 | 
					 | 
				
			||||||
    parser.add_argument(
 | 
					 | 
				
			||||||
        "-v",
 | 
					 | 
				
			||||||
        "--verbose",
 | 
					 | 
				
			||||||
        action="store_true",
 | 
					 | 
				
			||||||
        default=False,
 | 
					 | 
				
			||||||
        help="Spew out even more information than normal",
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
    common.options = common.parse_args(parser)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    newSuite = unittest.TestSuite()
 | 
					 | 
				
			||||||
    newSuite.addTest(unittest.makeSuite(VerifyTest))
 | 
					 | 
				
			||||||
    unittest.main(failfast=False)
 | 
					 | 
				
			||||||
| 
						 | 
					@ -78,19 +78,6 @@ def mkdir_testfiles(localmodule, test):
 | 
				
			||||||
    return tempfile.mkdtemp(dir=testdir)
 | 
					    return tempfile.mkdtemp(dir=testdir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def parse_args_for_test(parser, args):
 | 
					 | 
				
			||||||
    """Only send --flags to the ArgumentParser, not test classes, etc."""
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    from fdroidserver.common import parse_args
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    flags = []
 | 
					 | 
				
			||||||
    for arg in args:
 | 
					 | 
				
			||||||
        if arg[0] == '-':
 | 
					 | 
				
			||||||
            flags.append(flags)
 | 
					 | 
				
			||||||
    with unittest.mock.patch('sys.argv', flags):
 | 
					 | 
				
			||||||
        parse_args(parser)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def mock_urlopen(status=200, body=None):
 | 
					def mock_urlopen(status=200, body=None):
 | 
				
			||||||
    resp = unittest.mock.MagicMock()
 | 
					    resp = unittest.mock.MagicMock()
 | 
				
			||||||
    resp.getcode.return_value = status
 | 
					    resp.getcode.return_value = status
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue