diff --git a/app/build.gradle b/app/build.gradle index b7224f23..19f15494 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,6 +11,7 @@ android { versionCode 30 versionName "0.7.1-beta2" vectorDrawables.useSupportLibrary = true + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { @@ -67,4 +68,8 @@ dependencies { implementation "org.sufficientlysecure:openpgp-api:12.0" implementation "com.leinardi.android:speed-dial:3.1.1" implementation "com.mikepenz:aboutlibraries:6.2.3" + + androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', { + exclude group: 'com.android.support', module: 'support-annotations' + }) } diff --git a/app/src/androidTest/java/org/shadowice/flocke/andotp/ApplicationTest.java b/app/src/androidTest/java/org/shadowice/flocke/andotp/ApplicationTest.java index 7afd0c9b..fa9b49e4 100644 --- a/app/src/androidTest/java/org/shadowice/flocke/andotp/ApplicationTest.java +++ b/app/src/androidTest/java/org/shadowice/flocke/andotp/ApplicationTest.java @@ -23,14 +23,16 @@ package org.shadowice.flocke.andotp; -import android.app.Application; import android.content.Context; -import android.test.ApplicationTestCase; +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import org.apache.commons.codec.DecoderException; import org.apache.commons.codec.binary.Base32; import org.apache.commons.codec.binary.Hex; import org.json.JSONObject; +import org.junit.Test; +import org.junit.runner.RunWith; import org.shadowice.flocke.andotp.Database.Entry; import org.shadowice.flocke.andotp.Utilities.Constants; import org.shadowice.flocke.andotp.Utilities.DatabaseHelper; @@ -58,12 +60,13 @@ import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; -public class ApplicationTest extends ApplicationTestCase { +import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertTrue; - public ApplicationTest() { - super(Application.class); - } +@RunWith(AndroidJUnit4.class) +public class ApplicationTest { + @Test public void testTOTPCalculation(){ // Test Vectors from https://tools.ietf.org/html/rfc6238 byte[] keySHA1 = "12345678901234567890".getBytes(StandardCharsets.US_ASCII); @@ -95,6 +98,7 @@ public class ApplicationTest extends ApplicationTestCase { assertEquals(47863826, TokenCalculator.TOTP_RFC6238(keySHA512, TokenCalculator.TOTP_DEFAULT_PERIOD, 20000000000L, 8, TokenCalculator.HashAlgorithm.SHA512)); } + @Test public void testHOTPCalculation() { // Test cases from https://tools.ietf.org/html/rfc4226 byte[] keySHA1 = "12345678901234567890".getBytes(StandardCharsets.US_ASCII); @@ -111,19 +115,21 @@ public class ApplicationTest extends ApplicationTestCase { assertEquals("520489", TokenCalculator.HOTP(keySHA1, 9, 6, TokenCalculator.HashAlgorithm.SHA1)); } - + @Test public void testEntry() throws Exception { byte secret[] = "Das System ist sicher".getBytes(); String label = "5 von 5 Sterne"; int period = 30; String s = "{\"secret\":\"" + new String(new Base32().encode(secret)) + "\"," + + "\"issuer\":\"\"," + "\"label\":\"" + label + "\"," + "\"digits\":6," + "\"type\":\"TOTP\"," + "\"algorithm\":\"SHA1\"," + "\"thumbnail\":\"Default\"," + "\"last_used\":0," + + "\"used_frequency\":0," + "\"period\":" + Integer.toString(period) + "," + "\"tags\":[\"test1\",\"test2\"]}"; @@ -139,7 +145,7 @@ public class ApplicationTest extends ApplicationTestCase { } - + @Test public void testEntryURL() throws Exception { try { new Entry("DON'T CARE"); @@ -168,13 +174,13 @@ public class ApplicationTest extends ApplicationTestCase { } Entry entry = new Entry("otpauth://totp/ACME%20Co:john.doe@email.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&ALGORITHM=SHA1&digits=6&period=30"); - assertEquals("ACME Co - ACME Co:john.doe@email.com", entry.getLabel()); + assertEquals("john.doe@email.com", entry.getLabel()); assertEquals("HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ", new String(new Base32().encode(entry.getSecret()))); entry = new Entry("otpauth://totp/ACME%20Co:john.doe@email.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&ALGORITHM=SHA1&digits=6&period=30&tags=test1&tags=test2"); - assertEquals("ACME Co - ACME Co:john.doe@email.com", entry.getLabel()); + assertEquals("john.doe@email.com", entry.getLabel()); assertEquals("HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ", new String(new Base32().encode(entry.getSecret()))); String[] tags = new String[]{"test1", "test2"}; @@ -182,8 +188,9 @@ public class ApplicationTest extends ApplicationTestCase { assertTrue(Arrays.equals(tags, entry.getTags().toArray(new String[entry.getTags().size()]))); } + @Test public void testSettingsHelper() throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException { - Context context = getContext(); + Context context = InstrumentationRegistry.getTargetContext(); final KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); keyStore.load(null); @@ -216,6 +223,7 @@ public class ApplicationTest extends ApplicationTestCase { new File(context.getFilesDir() + "/" + Constants.FILENAME_ENCRYPTED_KEY).delete(); } + @Test public void testEncryptionHelper() throws NoSuchPaddingException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, IllegalBlockSizeException, UnsupportedEncodingException, InvalidAlgorithmParameterException, DecoderException { diff --git a/app/src/main/java/org/shadowice/flocke/andotp/Database/Entry.java b/app/src/main/java/org/shadowice/flocke/andotp/Database/Entry.java index 21cbd791..8eb9c1ed 100644 --- a/app/src/main/java/org/shadowice/flocke/andotp/Database/Entry.java +++ b/app/src/main/java/org/shadowice/flocke/andotp/Database/Entry.java @@ -131,6 +131,9 @@ public class Entry { String secret = uri.getQueryParameter("secret"); String label = uri.getPath().substring(1); + if(label.contains(":")) { + label = label.split(":")[1]; + } String counter = uri.getQueryParameter("counter"); String issuer = uri.getQueryParameter("issuer");