From 7d09040cc6b46d5a1db6078c75f6a53f9f9a8310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 1 Feb 2017 18:53:26 +0100 Subject: [PATCH 01/11] Update build env --- OpenKeychain/build.gradle | 8 ++++---- build.gradle | 8 ++++---- gradle/wrapper/gradle-wrapper.jar | Bin 52928 -> 54208 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 19 +++++++++++-------- 5 files changed, 21 insertions(+), 18 deletions(-) diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index ac4563ab1..46d57e370 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -296,6 +296,10 @@ android { javaMaxHeapSize "2g" } + dataBinding { + enabled = true + } + packagingOptions { exclude 'LICENSE.txt' exclude 'META-INF/LICENSE.txt' @@ -305,10 +309,6 @@ android { exclude 'META-INF/NOTICE' exclude '.readme' } - - dataBinding { - enabled = true - } } task jacocoTestReport(type:JacocoReport, dependsOn: "testFdroidDebugWithTestCoverageUnitTest") { diff --git a/build.gradle b/build.gradle index 91cd0023c..e1c3772a6 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { dependencies { // NOTE: Always use fixed version codes not dynamic ones, e.g. 0.7.3 instead of 0.7.+, see README for more information - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.2.3' classpath files('gradle-witness.jar') // bintray dependency to satisfy dependency of openpgp-api lib classpath 'com.novoda:bintray-release:0.2.7' @@ -26,7 +26,7 @@ allprojects { } task wrapper(type: Wrapper) { - gradleVersion = '3.1' + gradleVersion = '3.3' } subprojects { @@ -47,6 +47,6 @@ project(':extern:bouncycastle') { // SDK Version and Build Tools used by all subprojects // See http://tools.android.com/tech-docs/new-build-system/tips#TOC-Controlling-Android-properties-of-all-your-modules-from-the-main-project. ext { - compileSdkVersion = 24 - buildToolsVersion = '24.0.1' + compileSdkVersion = 25 + buildToolsVersion = '25.0.2' } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 6ffa237849ef3607e39c3b334a92a65367962071..384aba4a7099cf227db73d43f607be30d342bc38 100644 GIT binary patch delta 17812 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 delta 16531 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 Date: Wed, 1 Feb 2017 18:59:32 +0100 Subject: [PATCH 02/11] Update build env of submodules --- extern/KeybaseLib | 2 +- extern/openkeychain-api-lib | 2 +- extern/openpgp-api-lib | 2 +- extern/safeslinger-exchange | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extern/KeybaseLib b/extern/KeybaseLib index 051ed509f..fdad9ac1b 160000 --- a/extern/KeybaseLib +++ b/extern/KeybaseLib @@ -1 +1 @@ -Subproject commit 051ed509f4ada5d6a69611088daddc640539fd49 +Subproject commit fdad9ac1b8cfbe0c6a4f3a0194656464cef1785f diff --git a/extern/openkeychain-api-lib b/extern/openkeychain-api-lib index 9b5b0b9ca..0aa1e6d80 160000 --- a/extern/openkeychain-api-lib +++ b/extern/openkeychain-api-lib @@ -1 +1 @@ -Subproject commit 9b5b0b9ca32e80f3dadebe57d27e1422889d8254 +Subproject commit 0aa1e6d80e12526fe68a104776a0981f43202617 diff --git a/extern/openpgp-api-lib b/extern/openpgp-api-lib index f953ca8cd..9603bc282 160000 --- a/extern/openpgp-api-lib +++ b/extern/openpgp-api-lib @@ -1 +1 @@ -Subproject commit f953ca8cdb7fbab0f8877589d9578d74005f8d1f +Subproject commit 9603bc282c62e26009a4bcca2e118e9ed4a0d006 diff --git a/extern/safeslinger-exchange b/extern/safeslinger-exchange index 5bc65b9cf..1104bb592 160000 --- a/extern/safeslinger-exchange +++ b/extern/safeslinger-exchange @@ -1 +1 @@ -Subproject commit 5bc65b9cf8d333c44fae4403bc5181c895abd74f +Subproject commit 1104bb592652ecfc9eef08ab66a5562b4af41b15 From ad8e115d9681c7e216ed590266745e5ab1a1d022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 2 Feb 2017 10:52:44 +0100 Subject: [PATCH 03/11] Remove unused TLS package in BC --- extern/bouncycastle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/bouncycastle b/extern/bouncycastle index 9b11b73f6..25df6cb25 160000 --- a/extern/bouncycastle +++ b/extern/bouncycastle @@ -1 +1 @@ -Subproject commit 9b11b73f6eb1476e2f7c2b066b2130d32e3b72f7 +Subproject commit 25df6cb254ae64dcd6505807b14193437d004a62 From 0fcdc3df58446712db77d461dda47b7ba5eee6b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 2 Feb 2017 10:55:34 +0100 Subject: [PATCH 04/11] Disable ProsGuard for debug builds --- OpenKeychain/build.gradle | 7 +++---- .../{proguard-rules.pro => proguard-rules-release.pro} | 0 2 files changed, 3 insertions(+), 4 deletions(-) rename OpenKeychain/{proguard-rules.pro => proguard-rules-release.pro} (100%) diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index 46d57e370..c33c8c54c 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -185,7 +185,7 @@ android { buildTypes { release { minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-release.pro' // Reference them in the java files with e.g. BuildConfig.ACCOUNT_TYPE. buildConfigField "String", "ACCOUNT_TYPE", "\"org.sufficientlysecure.keychain.account\"" @@ -201,9 +201,8 @@ android { } debug { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - testProguardFile('proguard-rules.pro') + // disable ProGuard for faster compile times for debug builds + minifyEnabled false applicationIdSuffix ".debug" diff --git a/OpenKeychain/proguard-rules.pro b/OpenKeychain/proguard-rules-release.pro similarity index 100% rename from OpenKeychain/proguard-rules.pro rename to OpenKeychain/proguard-rules-release.pro From 2b9144a8631875f6bda4db7238c615858f71d5d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 1 Feb 2017 19:32:28 +0100 Subject: [PATCH 05/11] Unify syntax in build.gradle --- OpenKeychain/build.gradle | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index c33c8c54c..70e995b63 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -149,8 +149,6 @@ dependencyVerification { ] } - - android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion @@ -288,15 +286,15 @@ android { } dexOptions { - preDexLibraries = true + preDexLibraries true // dexInProcess requires much RAM, which is not available on all dev systems - dexInProcess = false - jumboMode = true + dexInProcess false + jumboMode true javaMaxHeapSize "2g" } dataBinding { - enabled = true + enabled true } packagingOptions { @@ -333,8 +331,8 @@ task jacocoTestReport(type:JacocoReport, dependsOn: "testFdroidDebugWithTestCove executionData = fileTree(dir: "${buildDir}/jacoco", include: "**/*.exec") reports { - xml.enabled = true - html.enabled = true + xml.enabled true + html.enabled true } } From 694d03fb2defa10719aafde9396f33dd7d436370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 1 Feb 2017 19:33:18 +0100 Subject: [PATCH 06/11] Update travis config --- .travis.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6bbe01d9a..fc684fceb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,12 +17,9 @@ before_install: android: components: - tools - - android-22 - - android-23 - - android-24 + - android-25 - platform-tools - - build-tools-23.0.2 - - build-tools-24.0.1 + - build-tools-25.0.2 - extra-android-support - extra-android-m2repository - sys-img-armeabi-v7a-android-21 From b831cd5725e635e6930904d1da16393c18030e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Wed, 1 Feb 2017 23:15:59 +0100 Subject: [PATCH 07/11] Update Robolectric to 3.2.2 --- OpenKeychain/build.gradle | 2 +- .../keychain/KeychainTestRunner.java | 21 +++++++++++ .../operations/BackupOperationTest.java | 23 +++++------- .../operations/BenchmarkOperationTest.java | 37 +++---------------- .../operations/CertifyOperationTest.java | 12 ++---- .../operations/PromoteKeyOperationTest.java | 21 +++++------ .../keychain/pgp/InputDataOperationTest.java | 23 +++++------- .../keychain/pgp/PgpEncryptDecryptTest.java | 25 ++++++------- .../keychain/pgp/PgpKeyOperationTest.java | 19 ++++------ .../keychain/pgp/SplitUserIdTest.java | 9 +---- .../pgp/UncachedKeyringCanonicalizeTest.java | 25 +++++-------- .../pgp/UncachedKeyringMergeTest.java | 23 +++++------- .../keychain/pgp/UncachedKeyringTest.java | 13 ++----- .../keychain/provider/InteropTest.java | 9 ++--- .../provider/ProviderHelperKeyringTest.java | 19 ++++------ .../provider/ProviderHelperSaveTest.java | 18 +++------ .../OpenPgpServiceKeyIdExtractorTest.java | 14 +++---- .../securitytoken/Iso7816TLVTest.java | 10 ++--- .../securitytoken/SecurityTokenUtilsTest.java | 7 +--- .../keychain/util/CharsetVerifierTest.java | 7 +--- .../keychain/util/KeyFormattingUtilsTest.java | 7 +--- .../util/ParcelableFileCacheTest.java | 7 +--- 22 files changed, 138 insertions(+), 213 deletions(-) create mode 100644 OpenKeychain/src/test/java/org/sufficientlysecure/keychain/KeychainTestRunner.java diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index 70e995b63..18e4d8e23 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -66,7 +66,7 @@ dependencies { // http://robolectric.org/getting-started/ // http://www.vogella.com/tutorials/Robolectric/article.html testCompile 'junit:junit:4.12' - testCompile ('org.robolectric:robolectric:3.1.2') { + testCompile ('org.robolectric:robolectric:3.2.2') { exclude group: 'org.bouncycastle', module: 'bcprov-jdk16' } testCompile 'org.mockito:mockito-core:1.10.19' diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/KeychainTestRunner.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/KeychainTestRunner.java new file mode 100644 index 000000000..f1e274270 --- /dev/null +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/KeychainTestRunner.java @@ -0,0 +1,21 @@ +package org.sufficientlysecure.keychain; + +import org.junit.runners.model.InitializationError; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +public class KeychainTestRunner extends RobolectricTestRunner { + + public KeychainTestRunner(Class testClass) throws InitializationError { + super(testClass); + } + + @Override + protected Config buildGlobalConfig() { + return new Config.Builder() + .setSdk(23) + .setConstants(WorkaroundBuildConfig.class) + .setManifest("src/main/AndroidManifest.xml") + .build(); + } +} diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/BackupOperationTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/BackupOperationTest.java index 31ba021b7..50d14b069 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/BackupOperationTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/BackupOperationTest.java @@ -18,14 +18,6 @@ package org.sufficientlysecure.keychain.operations; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; -import java.io.PrintStream; -import java.security.Security; -import java.util.Iterator; - import android.app.Application; import android.content.ContentResolver; import android.content.ContentValues; @@ -38,11 +30,9 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; import org.sufficientlysecure.keychain.operations.results.ExportResult; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; @@ -66,6 +56,14 @@ import org.sufficientlysecure.keychain.util.Passphrase; import org.sufficientlysecure.keychain.util.ProgressScaler; import org.sufficientlysecure.keychain.util.TestingUtils; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.PipedInputStream; +import java.io.PipedOutputStream; +import java.io.PrintStream; +import java.security.Security; +import java.util.Iterator; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -77,8 +75,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class BackupOperationTest { static Passphrase mPassphrase = TestingUtils.genPassphrase(true); diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/BenchmarkOperationTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/BenchmarkOperationTest.java index b6e0d2cd4..d5c55cf07 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/BenchmarkOperationTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/BenchmarkOperationTest.java @@ -18,46 +18,21 @@ package org.sufficientlysecure.keychain.operations; -import java.io.PrintStream; -import java.security.Security; -import java.util.ArrayList; -import java.util.Date; -import java.util.Random; - -import org.junit.Assert; -import org.junit.Before; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.bouncycastle.bcpg.sig.KeyFlags; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; -import org.sufficientlysecure.keychain.operations.results.CertifyResult; -import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; -import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult; -import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing; -import org.sufficientlysecure.keychain.pgp.PgpKeyOperation; -import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; -import org.sufficientlysecure.keychain.pgp.WrappedUserAttribute; -import org.sufficientlysecure.keychain.provider.KeychainContract.Certs; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.provider.ProviderHelper; import org.sufficientlysecure.keychain.service.BenchmarkInputParcel; -import org.sufficientlysecure.keychain.service.CertifyActionsParcel; -import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction; -import org.sufficientlysecure.keychain.service.SaveKeyringParcel; -import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm; -import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; -import org.sufficientlysecure.keychain.util.Passphrase; -import org.sufficientlysecure.keychain.util.ProgressScaler; -import org.sufficientlysecure.keychain.util.TestingUtils; + +import java.io.PrintStream; +import java.security.Security; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class BenchmarkOperationTest { static PrintStream oldShadowStream; diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/CertifyOperationTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/CertifyOperationTest.java index 6be13ec8e..8d6c94bba 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/CertifyOperationTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/CertifyOperationTest.java @@ -17,19 +17,16 @@ package org.sufficientlysecure.keychain.operations; +import org.bouncycastle.bcpg.sig.KeyFlags; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.bouncycastle.bcpg.sig.KeyFlags; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.sufficientlysecure.keychain.BuildConfig; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.operations.results.CertifyResult; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult; @@ -55,8 +52,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.Random; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class CertifyOperationTest { static UncachedKeyRing mStaticRing1, mStaticRing2; diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperationTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperationTest.java index 7b1d8df3c..b8c3e2860 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperationTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/operations/PromoteKeyOperationTest.java @@ -18,23 +18,17 @@ package org.sufficientlysecure.keychain.operations; -import java.io.PrintStream; -import java.security.Security; -import java.util.Iterator; - +import org.bouncycastle.bcpg.sig.KeyFlags; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.bouncycastle.bcpg.sig.KeyFlags; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.util.encoders.Hex; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult; import org.sufficientlysecure.keychain.operations.results.PromoteKeyResult; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey; @@ -54,8 +48,11 @@ import org.sufficientlysecure.keychain.util.Passphrase; import org.sufficientlysecure.keychain.util.ProgressScaler; import org.sufficientlysecure.keychain.util.TestingUtils; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +import java.io.PrintStream; +import java.security.Security; +import java.util.Iterator; + +@RunWith(KeychainTestRunner.class) public class PromoteKeyOperationTest { static UncachedKeyRing mStaticRing; diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/InputDataOperationTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/InputDataOperationTest.java index b586e9618..2d518eaa6 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/InputDataOperationTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/InputDataOperationTest.java @@ -18,30 +18,22 @@ package org.sufficientlysecure.keychain.pgp; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.FileNotFoundException; -import java.io.PrintStream; -import java.security.Security; -import java.util.ArrayList; - import android.app.Application; import android.content.ContentResolver; import android.content.ContentValues; import android.net.Uri; import junit.framework.Assert; + import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.openintents.openpgp.OpenPgpMetadata; -import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.operations.InputDataOperation; import org.sufficientlysecure.keychain.operations.results.InputDataResult; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; @@ -50,6 +42,13 @@ import org.sufficientlysecure.keychain.provider.TemporaryFileProvider; import org.sufficientlysecure.keychain.service.InputDataParcel; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.PrintStream; +import java.security.Security; +import java.util.ArrayList; + import static org.mockito.Mockito.any; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; @@ -57,9 +56,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; - -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class InputDataOperationTest { public static final Uri FAKE_CONTENT_INPUT_URI_1 = Uri.parse("content://fake/1"); diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpEncryptDecryptTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpEncryptDecryptTest.java index c22e1f6b0..575cc33cc 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpEncryptDecryptTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpEncryptDecryptTest.java @@ -18,15 +18,6 @@ package org.sufficientlysecure.keychain.pgp; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; -import java.security.Security; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; - import org.apache.tools.ant.util.StringUtils; import org.bouncycastle.bcpg.BCPGInputStream; import org.bouncycastle.bcpg.Packet; @@ -42,11 +33,9 @@ import org.junit.runner.RunWith; import org.openintents.openpgp.OpenPgpDecryptionResult; import org.openintents.openpgp.OpenPgpMetadata; import org.openintents.openpgp.OpenPgpSignatureResult; -import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult; @@ -66,12 +55,20 @@ import org.sufficientlysecure.keychain.util.Passphrase; import org.sufficientlysecure.keychain.util.ProgressScaler; import org.sufficientlysecure.keychain.util.TestingUtils; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.security.Security; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.Iterator; + import static org.hamcrest.core.AnyOf.anyOf; import static org.hamcrest.core.Is.is; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class PgpEncryptDecryptTest { static Passphrase mSymmetricPassphrase = TestingUtils.genPassphrase(true); diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperationTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperationTest.java index 9266d8a40..9cfc90544 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperationTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/PgpKeyOperationTest.java @@ -20,14 +20,6 @@ package org.sufficientlysecure.keychain.pgp; import junit.framework.AssertionFailedError; -import org.junit.Assert; -import org.junit.Test; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.runner.RunWith; -import org.robolectric.*; -import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowLog; import org.bouncycastle.bcpg.BCPGInputStream; import org.bouncycastle.bcpg.Packet; import org.bouncycastle.bcpg.PacketTags; @@ -41,7 +33,13 @@ import org.bouncycastle.bcpg.UserIDPacket; import org.bouncycastle.bcpg.sig.KeyFlags; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.openpgp.PGPSignature; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.shadows.ShadowLog; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult; @@ -71,8 +69,7 @@ import java.util.Iterator; import java.util.List; import java.util.Random; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class PgpKeyOperationTest { static UncachedKeyRing staticRing; diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/SplitUserIdTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/SplitUserIdTest.java index 3eb474c1d..8f8ca1337 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/SplitUserIdTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/SplitUserIdTest.java @@ -21,14 +21,9 @@ import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.openintents.openpgp.util.OpenPgpUtils; -import org.robolectric.RobolectricGradleTestRunner; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; -import org.sufficientlysecure.keychain.BuildConfig; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class SplitUserIdTest { @Test diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringCanonicalizeTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringCanonicalizeTest.java index 5d32fd9dd..7265282ef 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringCanonicalizeTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringCanonicalizeTest.java @@ -18,15 +18,6 @@ package org.sufficientlysecure.keychain.pgp; -import org.junit.BeforeClass; -import org.junit.runner.RunWith; -import org.junit.Assert; -import org.junit.Test; -import org.junit.Before; -import org.robolectric.RobolectricGradleTestRunner; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowLog; import org.bouncycastle.bcpg.BCPGInputStream; import org.bouncycastle.bcpg.HashAlgorithmTags; import org.bouncycastle.bcpg.Packet; @@ -53,16 +44,21 @@ import org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBu import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyEncryptorBuilder; import org.bouncycastle.util.Strings; -import org.sufficientlysecure.keychain.BuildConfig; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.shadows.ShadowLog; import org.sufficientlysecure.keychain.Constants; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.operations.results.OperationResult; +import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; +import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult; import org.sufficientlysecure.keychain.service.ChangeUnlockParcel; import org.sufficientlysecure.keychain.service.SaveKeyringParcel; import org.sufficientlysecure.keychain.service.SaveKeyringParcel.Algorithm; -import org.sufficientlysecure.keychain.operations.results.OperationResult.LogType; -import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; import org.sufficientlysecure.keychain.service.input.CryptoInputParcel; import org.sufficientlysecure.keychain.support.KeyringTestingHelper; import org.sufficientlysecure.keychain.support.KeyringTestingHelper.RawPacket; @@ -82,8 +78,7 @@ import java.util.Iterator; * Test cases are made for all its assertions. */ -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class UncachedKeyringCanonicalizeTest { static UncachedKeyRing staticRing; diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringMergeTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringMergeTest.java index 784af2bcc..07aa18d6a 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringMergeTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringMergeTest.java @@ -18,15 +18,6 @@ package org.sufficientlysecure.keychain.pgp; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; -import org.robolectric.shadows.ShadowLog; import org.bouncycastle.bcpg.BCPGInputStream; import org.bouncycastle.bcpg.PacketTags; import org.bouncycastle.bcpg.S2K; @@ -34,11 +25,16 @@ import org.bouncycastle.bcpg.SecretKeyPacket; import org.bouncycastle.bcpg.sig.KeyFlags; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.Strings; -import org.sufficientlysecure.keychain.BuildConfig; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.shadows.ShadowLog; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.operations.results.OperationResult; -import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult; import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; +import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult; import org.sufficientlysecure.keychain.pgp.PgpCertifyOperation.PgpCertifyResult; import org.sufficientlysecure.keychain.service.CertifyActionsParcel.CertifyAction; import org.sufficientlysecure.keychain.service.ChangeUnlockParcel; @@ -81,8 +77,7 @@ import java.util.Random; * packet will be copied regardless. Filtering out bad packets is done with canonicalization. * */ -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class UncachedKeyringMergeTest { static UncachedKeyRing staticRingA, staticRingB; diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringTest.java index f4f089d0d..486b1f95a 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/pgp/UncachedKeyringTest.java @@ -18,19 +18,15 @@ package org.sufficientlysecure.keychain.pgp; +import org.bouncycastle.bcpg.sig.KeyFlags; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.bouncycastle.bcpg.sig.KeyFlags; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.sufficientlysecure.keychain.BuildConfig; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.operations.results.PgpEditKeyResult; import org.sufficientlysecure.keychain.pgp.UncachedKeyRing.IteratorWithIOThrow; import org.sufficientlysecure.keychain.pgp.exception.PgpGeneralException; @@ -46,8 +42,7 @@ import java.security.Security; import java.util.Iterator; import java.util.Random; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class UncachedKeyringTest { static UncachedKeyRing staticRing, staticPubRing; diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/InteropTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/InteropTest.java index 114501d83..f0bd955e1 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/InteropTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/InteropTest.java @@ -19,6 +19,7 @@ package org.sufficientlysecure.keychain.provider; import android.net.Uri; +import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.json.JSONArray; import org.json.JSONObject; import org.junit.Assert; @@ -27,12 +28,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.openintents.openpgp.OpenPgpMetadata; import org.openintents.openpgp.OpenPgpSignatureResult; -import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.operations.results.DecryptVerifyResult; import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; import org.sufficientlysecure.keychain.pgp.CanonicalizedKeyRing; @@ -60,8 +58,7 @@ import java.net.URL; import java.security.Security; import java.util.ArrayList; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class InteropTest { @BeforeClass diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/ProviderHelperKeyringTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/ProviderHelperKeyringTest.java index 8c042fb6d..62358d848 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/ProviderHelperKeyringTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/ProviderHelperKeyringTest.java @@ -17,22 +17,19 @@ package org.sufficientlysecure.keychain.provider; -import java.util.Collections; -import java.util.Arrays; -import java.util.Collection; -import java.util.ArrayList; - import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.*; -import org.robolectric.annotation.Config; -import org.sufficientlysecure.keychain.BuildConfig; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.robolectric.RuntimeEnvironment; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.support.KeyringTestingHelper; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; + +@RunWith(KeychainTestRunner.class) public class ProviderHelperKeyringTest { @Test diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/ProviderHelperSaveTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/ProviderHelperSaveTest.java index 47c08aff2..f22464185 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/ProviderHelperSaveTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/provider/ProviderHelperSaveTest.java @@ -18,35 +18,29 @@ package org.sufficientlysecure.keychain.provider; +import org.bouncycastle.bcpg.sig.KeyFlags; +import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.Robolectric; -import org.robolectric.RobolectricGradleTestRunner; -import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.bouncycastle.bcpg.sig.KeyFlags; -import org.bouncycastle.util.encoders.Hex; -import org.sufficientlysecure.keychain.BuildConfig; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; +import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; +import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult; import org.sufficientlysecure.keychain.pgp.CanonicalizedPublicKeyRing; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKey.SecretKeyType; import org.sufficientlysecure.keychain.pgp.CanonicalizedSecretKeyRing; import org.sufficientlysecure.keychain.pgp.UncachedKeyRing; -import org.sufficientlysecure.keychain.operations.results.OperationResult.OperationLog; -import org.sufficientlysecure.keychain.operations.results.SaveKeyringResult; import org.sufficientlysecure.keychain.util.IterableIterator; import org.sufficientlysecure.keychain.util.ProgressScaler; import java.util.Arrays; import java.util.Iterator; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class ProviderHelperSaveTest { ProviderHelper mProviderHelper = new ProviderHelper(RuntimeEnvironment.application); diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/remote/OpenPgpServiceKeyIdExtractorTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/remote/OpenPgpServiceKeyIdExtractorTest.java index 23732d227..3198f3e44 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/remote/OpenPgpServiceKeyIdExtractorTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/remote/OpenPgpServiceKeyIdExtractorTest.java @@ -1,9 +1,6 @@ package org.sufficientlysecure.keychain.remote; -import java.util.ArrayList; -import java.util.Arrays; - import android.app.PendingIntent; import android.content.ContentResolver; import android.content.Intent; @@ -16,11 +13,12 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.openintents.openpgp.OpenPgpError; import org.openintents.openpgp.util.OpenPgpApi; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.annotation.Config; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.remote.OpenPgpServiceKeyIdExtractor.KeyIdResult; +import java.util.ArrayList; +import java.util.Arrays; + import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -29,10 +27,8 @@ import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; - @SuppressWarnings("unchecked") -@RunWith(RobolectricTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class OpenPgpServiceKeyIdExtractorTest { private static final long[] KEY_IDS = new long[] { 123L, 234L }; diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/securitytoken/Iso7816TLVTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/securitytoken/Iso7816TLVTest.java index 7e8c2d37a..dfab970a9 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/securitytoken/Iso7816TLVTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/securitytoken/Iso7816TLVTest.java @@ -15,20 +15,16 @@ package org.sufficientlysecure.keychain.securitytoken; +import org.bouncycastle.util.encoders.Hex; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.bouncycastle.util.encoders.Hex; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; -import org.sufficientlysecure.keychain.securitytoken.Iso7816TLV; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.securitytoken.Iso7816TLV.Iso7816CompositeTLV; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class Iso7816TLVTest { @Before diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenUtilsTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenUtilsTest.java index 6ac175994..826300fb5 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenUtilsTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/securitytoken/SecurityTokenUtilsTest.java @@ -25,10 +25,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; -import org.robolectric.RobolectricGradleTestRunner; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.securitytoken.usb.UsbTransportException; import java.io.ByteArrayOutputStream; @@ -37,8 +35,7 @@ import java.math.BigInteger; import java.security.interfaces.RSAPrivateCrtKey; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class SecurityTokenUtilsTest extends Mockito { @Before public void setUp() { diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/CharsetVerifierTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/CharsetVerifierTest.java index 606040e4b..8cc944f4e 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/CharsetVerifierTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/CharsetVerifierTest.java @@ -3,17 +3,14 @@ package org.sufficientlysecure.keychain.util; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; -import org.robolectric.annotation.Config; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class CharsetVerifierTest { @Test diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/KeyFormattingUtilsTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/KeyFormattingUtilsTest.java index 30cfb0f14..eec924c67 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/KeyFormattingUtilsTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/KeyFormattingUtilsTest.java @@ -4,14 +4,11 @@ package org.sufficientlysecure.keychain.util; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; -import org.robolectric.annotation.Config; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import org.sufficientlysecure.keychain.ui.util.KeyFormattingUtils; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class KeyFormattingUtilsTest { static final byte[] fp = new byte[] { diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/ParcelableFileCacheTest.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/ParcelableFileCacheTest.java index aeea457f7..3bda809d4 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/ParcelableFileCacheTest.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/util/ParcelableFileCacheTest.java @@ -24,16 +24,13 @@ import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import org.sufficientlysecure.keychain.WorkaroundBuildConfig; +import org.sufficientlysecure.keychain.KeychainTestRunner; import java.util.ArrayList; -@RunWith(RobolectricGradleTestRunner.class) -@Config(constants = WorkaroundBuildConfig.class, sdk = 23, manifest = "src/main/AndroidManifest.xml") +@RunWith(KeychainTestRunner.class) public class ParcelableFileCacheTest { @Before From 2625da55ed69470be2706e063eeefdc3e5aa3f5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 2 Feb 2017 11:08:27 +0100 Subject: [PATCH 08/11] Add OpenKeychainIntents into main git --- .../keychain/intents/OpenKeychainIntents.java | 45 +++++++++++++++++++ .../keychain/ui/EncryptFilesActivity.java | 1 - 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 OpenKeychain/src/main/java/org/sufficientlysecure/keychain/intents/OpenKeychainIntents.java diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/intents/OpenKeychainIntents.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/intents/OpenKeychainIntents.java new file mode 100644 index 000000000..37f7c307c --- /dev/null +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/intents/OpenKeychainIntents.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2014-2017 Dominik Schürmann + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.sufficientlysecure.keychain.intents; + +public class OpenKeychainIntents { + private static final String PACKAGE_NAME = "org.sufficientlysecure.keychain"; + + // prefix packagename for exported Intents + // as described in http://developer.android.com/guide/components/intents-filters.html + private static final String INTENT_PREFIX = PACKAGE_NAME + ".action."; + private static final String EXTRA_PREFIX = PACKAGE_NAME + "."; + + public static final String ENCRYPT_TEXT = INTENT_PREFIX + "ENCRYPT_TEXT"; + public static final String ENCRYPT_EXTRA_TEXT = EXTRA_PREFIX + "EXTRA_TEXT"; // String + + public static final String ENCRYPT_DATA = INTENT_PREFIX + "ENCRYPT_DATA"; + public static final String ENCRYPT_EXTRA_ASCII_ARMOR = EXTRA_PREFIX + "EXTRA_ASCII_ARMOR"; // boolean + + public static final String DECRYPT_DATA = INTENT_PREFIX + "DECRYPT_DATA"; + + public static final String IMPORT_KEY = INTENT_PREFIX + "IMPORT_KEY"; + public static final String IMPORT_EXTRA_KEY_EXTRA_KEY_BYTES = EXTRA_PREFIX + "EXTRA_KEY_BYTES"; // byte[] + + public static final String IMPORT_KEY_FROM_KEYSERVER = INTENT_PREFIX + "IMPORT_KEY_FROM_KEYSERVER"; + public static final String IMPORT_KEY_FROM_KEYSERVER_EXTRA_QUERY = EXTRA_PREFIX + "EXTRA_QUERY"; // String + public static final String IMPORT_KEY_FROM_KEYSERVER_EXTRA_FINGERPRINT = EXTRA_PREFIX + "EXTRA_FINGERPRINT"; // String + + public static final String IMPORT_KEY_FROM_QR_CODE = INTENT_PREFIX + "IMPORT_KEY_FROM_QR_CODE"; + +} diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java index 136787984..d6b7d43bb 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/EncryptFilesActivity.java @@ -23,7 +23,6 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.FragmentTransaction; -import android.view.View; import org.sufficientlysecure.keychain.R; import org.sufficientlysecure.keychain.intents.OpenKeychainIntents; From 8105cca6c12facc34ca3604029fd45843baf6a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 2 Feb 2017 11:10:10 +0100 Subject: [PATCH 09/11] Removed submodule openkeychain-api --- .gitmodules | 4 ---- extern/openkeychain-api-lib | 1 - 2 files changed, 5 deletions(-) delete mode 160000 extern/openkeychain-api-lib diff --git a/.gitmodules b/.gitmodules index a3337f219..fdc6dddb3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,10 +2,6 @@ path = extern/openpgp-api-lib url = https://github.com/open-keychain/openpgp-api.git ignore = dirty -[submodule "extern/openkeychain-api-lib"] - path = extern/openkeychain-api-lib - url = https://github.com/open-keychain/openkeychain-intents.git - ignore = dirty [submodule "extern/KeybaseLib"] path = extern/KeybaseLib url = https://github.com/open-keychain/KeybaseLib.git diff --git a/extern/openkeychain-api-lib b/extern/openkeychain-api-lib deleted file mode 160000 index 0aa1e6d80..000000000 --- a/extern/openkeychain-api-lib +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 0aa1e6d80e12526fe68a104776a0981f43202617 From 8d0c747bc9e72af666788b985f0b7b5e2cfcd984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 2 Feb 2017 11:12:25 +0100 Subject: [PATCH 10/11] Remove openkeychain-api gradle deps --- OpenKeychain/build.gradle | 1 - settings.gradle | 3 --- 2 files changed, 4 deletions(-) diff --git a/OpenKeychain/build.gradle b/OpenKeychain/build.gradle index 18e4d8e23..af54cf831 100644 --- a/OpenKeychain/build.gradle +++ b/OpenKeychain/build.gradle @@ -53,7 +53,6 @@ dependencies { // libs as submodules compile project(':openpgp-api-lib') - compile project(':openkeychain-api-lib') compile project(':extern:bouncycastle:core') compile project(':extern:bouncycastle:pg') compile project(':extern:bouncycastle:prov') diff --git a/settings.gradle b/settings.gradle index 2244f1c3d..69ddb206a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,9 +8,6 @@ include ':extern:minidns' //include ':extern:safeslinger-exchange:safeslinger-exchange' include ':safeslinger-exchange' project(':safeslinger-exchange').projectDir = new File('extern/safeslinger-exchange/safeslinger-exchange') -//include ':extern:openkeychain-api-lib:openkeychain-intents' -include ':openkeychain-api-lib' -project(':openkeychain-api-lib').projectDir = new File('extern/openkeychain-api-lib/openkeychain-intents') //include ':extern:openpgp-api-lib:openpgp-api' include ':openpgp-api-lib' project(':openpgp-api-lib').projectDir = new File('extern/openpgp-api-lib/openpgp-api') From 70678ecd81acb5f903da3e42570fad593a0d2735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Sch=C3=BCrmann?= Date: Thu, 2 Feb 2017 11:27:20 +0100 Subject: [PATCH 11/11] Update robolectric config --- .../org/sufficientlysecure/keychain/KeychainTestRunner.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/KeychainTestRunner.java b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/KeychainTestRunner.java index f1e274270..3d4b14b2d 100644 --- a/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/KeychainTestRunner.java +++ b/OpenKeychain/src/test/java/org/sufficientlysecure/keychain/KeychainTestRunner.java @@ -13,9 +13,8 @@ public class KeychainTestRunner extends RobolectricTestRunner { @Override protected Config buildGlobalConfig() { return new Config.Builder() - .setSdk(23) + .setSdk(25) .setConstants(WorkaroundBuildConfig.class) - .setManifest("src/main/AndroidManifest.xml") .build(); } }