aboutsummaryrefslogtreecommitdiffhomepage
path: root/platform_tools
diff options
context:
space:
mode:
authorGravatar Hal Canary <halcanary@google.com>2017-12-12 09:42:14 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-12-18 18:58:52 +0000
commit28f89389f026379aad6f90254ba37f4d37272bcb (patch)
tree7736d9a3fdd88d628bb070bc5348096d3e363a9a /platform_tools
parent37155d476cd727329d985b75ecedbefe380a0f23 (diff)
SkQP: add junit app
Change-Id: Ic32eaec6cce1509f07e7cf610717d3b12d335c89 Reviewed-on: https://skia-review.googlesource.com/83921 Reviewed-by: Hal Canary <halcanary@google.com> Commit-Queue: Hal Canary <halcanary@google.com>
Diffstat (limited to 'platform_tools')
-rw-r--r--platform_tools/android/apps/settings.gradle1
-rw-r--r--platform_tools/android/apps/skqp/build.gradle30
-rw-r--r--platform_tools/android/apps/skqp/src/main/AndroidManifest.xml9
-rw-r--r--platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQP.java14
-rw-r--r--platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPException.java12
-rw-r--r--platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java133
6 files changed, 199 insertions, 0 deletions
diff --git a/platform_tools/android/apps/settings.gradle b/platform_tools/android/apps/settings.gradle
index 75ce0a6db1..a8c2cb3fb4 100644
--- a/platform_tools/android/apps/settings.gradle
+++ b/platform_tools/android/apps/settings.gradle
@@ -1 +1,2 @@
include ':viewer'
+include ':skqp'
diff --git a/platform_tools/android/apps/skqp/build.gradle b/platform_tools/android/apps/skqp/build.gradle
new file mode 100644
index 0000000000..0a883ca869
--- /dev/null
+++ b/platform_tools/android/apps/skqp/build.gradle
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+apply plugin: 'com.android.application'
+
+dependencies {
+ compile 'com.android.support:support-annotations:24.0.0'
+ compile 'com.android.support.test:runner:0.5'
+ compile group: 'junit', name: 'junit', version: '4.+'
+}
+
+android {
+ compileSdkVersion 23
+ buildToolsVersion "22.0.1"
+ defaultConfig {
+ applicationId "org.skia.skqp"
+ minSdkVersion 19
+ targetSdkVersion 19
+ versionCode 1
+ versionName "1.0"
+ signingConfig signingConfigs.debug
+ }
+ sourceSets.main.jni.srcDirs = []
+ sourceSets.main.jniLibs.srcDir "src/main/libs"
+ productFlavors { arm {}; arm64 {}; x86 {}; x64 {}; arm64vulkan{}; }
+ setupSkiaLibraryBuild(project, applicationVariants, "libskqp_app")
+}
diff --git a/platform_tools/android/apps/skqp/src/main/AndroidManifest.xml b/platform_tools/android/apps/skqp/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..30028fb436
--- /dev/null
+++ b/platform_tools/android/apps/skqp/src/main/AndroidManifest.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.skia.skqp"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <application><uses-library android:name="android.test.runner" /></application>
+ <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
+ android:targetPackage="org.skia.skqp"></instrumentation>
+</manifest>
diff --git a/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQP.java b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQP.java
new file mode 100644
index 0000000000..c5843f013e
--- /dev/null
+++ b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQP.java
@@ -0,0 +1,14 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+package org.skia.skqp;
+
+import org.junit.runner.RunWith;
+
+@RunWith(SkQPRunner.class)
+public class SkQP {}
+
diff --git a/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPException.java b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPException.java
new file mode 100644
index 0000000000..a7c8721bfb
--- /dev/null
+++ b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPException.java
@@ -0,0 +1,12 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+package org.skia.skqp;
+
+public class SkQPException extends Exception {
+ public SkQPException(String m) { super(m); }
+}
diff --git a/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java
new file mode 100644
index 0000000000..1cf3aef9e2
--- /dev/null
+++ b/platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2017 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+package org.skia.skqp;
+
+import android.content.Context;
+import android.content.res.AssetManager;
+import android.content.res.Resources;
+import android.support.test.InstrumentationRegistry;
+import android.util.Log;
+import java.io.File;
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+import org.junit.runner.Description;
+import org.junit.runner.Runner;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunNotifier;
+
+public class SkQPRunner extends Runner {
+ private native void nInit(AssetManager assetManager, String dataDir);
+ private native float nExecuteGM(int gm, int backend) throws SkQPException;
+ private native String[] nExecuteUnitTest(int test);
+
+ private AssetManager mAssetManager;
+ private String[] mGMs;
+ private String[] mBackends;
+ private String[] mUnitTests;
+
+ private static boolean sOnceFlag = false;
+ private static final String kSkiaGM = "SkiaGM_";
+ private static final String kSkiaUnitTests = "Skia_UnitTests";
+
+ private Description mDescription;
+
+ private static void DeleteDirectoryContents(File f) throws IOException {
+ for (File s : f.listFiles()) {
+ if (s.isDirectory()) {
+ SkQPRunner.DeleteDirectoryContents(s);
+ }
+ s.delete();
+ }
+ }
+
+ private static void Fail(Description desc, RunNotifier notifier, String failure) {
+ notifier.fireTestFailure(new Failure(desc, new Throwable(failure)));
+ }
+
+ ////////////////////////////////////////////////////////////////////////////
+
+ public SkQPRunner(Class testClass) {
+ synchronized (SkQPRunner.class) {
+ if (sOnceFlag) {
+ throw new IllegalStateException("Error multiple SkQPs defined");
+ }
+ sOnceFlag = true;
+ }
+ System.loadLibrary("skqp_app");
+
+ Context context = InstrumentationRegistry.getTargetContext();
+ File filesDir = context.getFilesDir();
+ try {
+ SkQPRunner.DeleteDirectoryContents(filesDir);
+ } catch (IOException e) {
+ Log.w("org.skis.skqp", "DeleteDirectoryContents: " + e.getMessage());
+ }
+
+ Resources resources = context.getResources();
+ mAssetManager = resources.getAssets();
+ this.nInit(mAssetManager, filesDir.getAbsolutePath());
+
+ mDescription = Description.createSuiteDescription(testClass);
+ Annotation annots[] = new Annotation[0];
+ for (int backend = 0; backend < mBackends.length; backend++) {
+ String classname = kSkiaGM + mBackends[backend];
+ for (int gm = 0; gm < mGMs.length; gm++) {
+ mDescription.addChild(Description.createTestDescription(classname, mGMs[gm], annots));
+ }
+ }
+ for (int unitTest = 0; unitTest < mUnitTests.length; unitTest++) {
+ mDescription.addChild(Description.createTestDescription(kSkiaUnitTests,
+ mUnitTests[unitTest], annots));
+ }
+ }
+
+ @Override
+ public Description getDescription() { return mDescription; }
+
+ @Override
+ public int testCount() { return mUnitTests.length + mGMs.length * mBackends.length; }
+
+ @Override
+ public void run(RunNotifier notifier) {
+ Annotation annots[] = new Annotation[0];
+ for (int backend = 0; backend < mBackends.length; backend++) {
+ String classname = kSkiaGM + mBackends[backend];
+ for (int gm = 0; gm < mGMs.length; gm++) {
+ Description desc = Description.createTestDescription(classname, mGMs[gm], annots);
+ notifier.fireTestStarted(desc);
+ float value = java.lang.Float.MAX_VALUE;
+ String error = null;
+ try {
+ value = this.nExecuteGM(gm, backend);
+ } catch (SkQPException exept) {
+ error = exept.getMessage();
+ }
+ if (error != null) {
+ SkQPRunner.Fail(desc, notifier, String.format("Exception: %s", error));
+ } else if (value != 0) {
+ SkQPRunner.Fail(desc, notifier, String.format(
+ "Image mismatch: max channel diff = %f", value));
+ }
+ notifier.fireTestFinished(desc);
+ }
+ }
+ for (int unitTest = 0; unitTest < mUnitTests.length; unitTest++) {
+ Description desc = Description.createTestDescription(
+ kSkiaUnitTests, mUnitTests[unitTest], annots);
+ notifier.fireTestStarted(desc);
+ String[] errors = this.nExecuteUnitTest(unitTest);
+ if (errors != null && errors.length > 0) {
+ for (String error : errors) {
+ SkQPRunner.Fail(desc, notifier, error);
+ }
+ }
+ notifier.fireTestFinished(desc);
+ }
+ }
+}
+