Merge pull request #658 from artbristol/functional-testing

Start on Robolectric integration test
This commit is contained in:
Vincent 2014-06-20 00:44:31 +02:00
commit f47bb1e8e2
9 changed files with 204 additions and 42 deletions

View File

@ -1,13 +1,5 @@
apply plugin: 'android' apply plugin: 'android'
//apply plugin: 'android-test' apply plugin: 'robolectric'
sourceSets {
//androidTest {
//java.srcDir file('src/test/java')
// configure the set of classes for JUnit tests
// include '**/*Test.class'
//}
}
dependencies { dependencies {
// NOTE: Always use fixed version codes not dynamic ones, e.g. 0.7.3 instead of 0.7.+, see README for more information // NOTE: Always use fixed version codes not dynamic ones, e.g. 0.7.3 instead of 0.7.+, see README for more information
@ -29,26 +21,27 @@ dependencies {
compile project(':extern:SuperToasts:supertoasts') compile project(':extern:SuperToasts:supertoasts')
compile project(':extern:dnsjava') compile project(':extern:dnsjava')
// Dependencies for the `instrumentTest` task, make sure to list all your global dependencies here as well
androidTestCompile 'junit:junit:4.11' // Unit tests are run with Robolectric
androidTestCompile 'org.robolectric:robolectric:2.3' testCompile 'junit:junit:4.11'
androidTestCompile 'com.squareup:fest-android:1.0.8' testCompile 'org.robolectric:robolectric:2.3'
androidTestCompile 'com.google.android:android:4.1.1.4' testCompile 'com.squareup:fest-android:1.0.8'
androidTestCompile 'com.android.support:support-v4:19.1.0' testCompile 'com.google.android:android:4.1.1.4'
androidTestCompile 'com.android.support:appcompat-v7:19.1.0' testCompile 'com.android.support:support-v4:19.1.0'
androidTestCompile project(':extern:openpgp-api-lib') testCompile 'com.android.support:appcompat-v7:19.1.0'
androidTestCompile project(':extern:openkeychain-api-lib') testCompile project(':extern:openpgp-api-lib')
androidTestCompile project(':extern:html-textview') testCompile project(':extern:openkeychain-api-lib')
androidTestCompile project(':extern:StickyListHeaders:library') testCompile project(':extern:html-textview')
androidTestCompile project(':extern:AndroidBootstrap:AndroidBootstrap') testCompile project(':extern:StickyListHeaders:library')
androidTestCompile project(':extern:zxing-qr-code') testCompile project(':extern:AndroidBootstrap:AndroidBootstrap')
androidTestCompile project(':extern:zxing-android-integration') testCompile project(':extern:zxing-qr-code')
androidTestCompile project(':extern:spongycastle:core') testCompile project(':extern:zxing-android-integration')
androidTestCompile project(':extern:spongycastle:pg') testCompile project(':extern:spongycastle:core')
androidTestCompile project(':extern:spongycastle:pkix') testCompile project(':extern:spongycastle:pg')
androidTestCompile project(':extern:spongycastle:prov') testCompile project(':extern:spongycastle:pkix')
androidTestCompile project(':extern:AppMsg:library') testCompile project(':extern:spongycastle:prov')
androidTestCompile project(':extern:SuperToasts:supertoasts') testCompile project(':extern:AppMsg:library')
testCompile project(':extern:SuperToasts:supertoasts')
} }

View File

@ -1,12 +0,0 @@
package tests;
import org.junit.Assert;
import org.junit.Test;
public class SomeTest {
@Test
public void willFail() {
// stub
// Assert.assertThat();
}
}

View File

@ -0,0 +1,85 @@
package org.sufficientlysecure.keychain.testsupport;
import android.content.Context;
import android.net.Uri;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerify;
import org.sufficientlysecure.keychain.pgp.PgpDecryptVerifyResult;
import org.sufficientlysecure.keychain.pgp.WrappedPublicKeyRing;
import org.sufficientlysecure.keychain.provider.ProviderHelper;
import org.sufficientlysecure.keychain.util.InputData;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* For functional tests of PgpDecryptVerify
*/
public class PgpVerifyTestingHelper {
private final Context context;
public PgpVerifyTestingHelper(Context robolectricContext) {
this.context=robolectricContext;
}
public int doTestFile(String testFileName) throws Exception {
ProviderHelper providerHelper = new ProviderHelperStub(context);
PgpDecryptVerify.PassphraseCache passphraseCache = new PgpDecryptVerify.PassphraseCache() {
public String getCachedPassphrase(long masterKeyId) {
return "I am a passphrase";
}
};
byte[] sampleInputBytes = readFully(getClass().getResourceAsStream(testFileName));
InputStream sampleInput = new ByteArrayInputStream(sampleInputBytes);
InputData data = new InputData(sampleInput, sampleInputBytes.length);
OutputStream outStream = new ByteArrayOutputStream();
PgpDecryptVerify verify = new PgpDecryptVerify.Builder(providerHelper, passphraseCache, data, outStream).build();
PgpDecryptVerifyResult result = verify.execute();
return result.getSignatureResult().getStatus();
}
static class ProviderHelperStub extends ProviderHelper {
public ProviderHelperStub(Context context) {
super(context);
}
@Override
public WrappedPublicKeyRing getWrappedPublicKeyRing(Uri id) throws NotFoundException {
try {
byte[] data = readFully(getClass().getResourceAsStream("/public-key-for-sample.blob"));
return new WrappedPublicKeyRing(data, false, 0);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
public static byte[] readFully(InputStream input) throws IOException
{
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = input.read(buffer)) != -1)
{
output.write(buffer, 0, bytesRead);
}
return output.toByteArray();
}
}

View File

@ -0,0 +1,7 @@
/**
* Test support classes.
* This is only in main code because of gradle-Android Studio-robolectric issues. Having
* classes in main code means IDE autocomplete, class detection, etc., all works.
* TODO Move into test package when possible
*/
package org.sufficientlysecure.keychain.testsupport;

View File

@ -0,0 +1,37 @@
package tests;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.*;
import org.openintents.openpgp.OpenPgpSignatureResult;
import org.sufficientlysecure.keychain.testsupport.PgpVerifyTestingHelper;
@RunWith(RobolectricTestRunner.class)
@org.robolectric.annotation.Config(emulateSdk = 18) // Robolectric doesn't yet support 19
public class RoboTest {
@Test
public void testVerifySuccess() throws Exception {
String testFileName = "/sample.txt";
int expectedSignatureResult = OpenPgpSignatureResult.SIGNATURE_SUCCESS_UNCERTIFIED;
int status = new PgpVerifyTestingHelper(Robolectric.application).doTestFile(testFileName);
Assert.assertEquals(expectedSignatureResult, status);
}
@Test
public void testVerifyFailure() throws Exception {
String testFileName = "/sample-altered.txt";
int expectedSignatureResult = OpenPgpSignatureResult.SIGNATURE_ERROR;
int status = new PgpVerifyTestingHelper(Robolectric.application).doTestFile(testFileName);
Assert.assertEquals(expectedSignatureResult, status);
}
}

View File

@ -0,0 +1,26 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
This is a simple text document, which is used to illustrate
the concept of signing simple text files. There are no
control characters or special formatting commands in this
text, just simple printable ASCII characters.
MALICIOUS TEXT
To make this a slightly less uninteresting document, there
follows a short shopping list.
eggs, 1 doz
milk, 1 gal
bacon, 1 lb
olive oil
bread, 1 loaf
That's all there is to this document.
-----BEGIN PGP SIGNATURE-----
Version: PGPfreeware 5.5.5 for non-commercial use <http://www.nai.com>
iQA/AwUBN78ib3S9RCOKzj55EQKqDACg1NV2/iyPKrDlOVJvJwz6ArcQ0UQAnjNC
CDxKAFyaaGa835l1vpbFkAJk
=3r/N
-----END PGP SIGNATURE-----

View File

@ -0,0 +1,26 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
This is a simple text document, which is used to illustrate
the concept of signing simple text files. There are no
control characters or special formatting commands in this
text, just simple printable ASCII characters.
To make this a slightly less uninteresting document, there
follows a short shopping list.
eggs, 1 doz
milk, 1 gal
bacon, 1 lb
olive oil
bread, 1 loaf
That's all there is to this document.
-----BEGIN PGP SIGNATURE-----
Version: PGPfreeware 5.5.5 for non-commercial use <http://www.nai.com>
iQA/AwUBN78ib3S9RCOKzj55EQKqDACg1NV2/iyPKrDlOVJvJwz6ArcQ0UQAnjNC
CDxKAFyaaGa835l1vpbFkAJk
=3r/N
-----END PGP SIGNATURE-----

View File

@ -6,7 +6,7 @@ buildscript {
dependencies { dependencies {
// NOTE: Always use fixed version codes not dynamic ones, e.g. 0.7.3 instead of 0.7.+, see README for more information // 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:0.11.1' classpath 'com.android.tools.build:gradle:0.11.1'
//classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.10.0' classpath 'org.robolectric:robolectric-gradle-plugin:0.11.0'
} }
} }