From 28f89389f026379aad6f90254ba37f4d37272bcb Mon Sep 17 00:00:00 2001 From: Hal Canary Date: Tue, 12 Dec 2017 09:42:14 -0500 Subject: SkQP: add junit app Change-Id: Ic32eaec6cce1509f07e7cf610717d3b12d335c89 Reviewed-on: https://skia-review.googlesource.com/83921 Reviewed-by: Hal Canary Commit-Queue: Hal Canary --- platform_tools/android/apps/settings.gradle | 1 + platform_tools/android/apps/skqp/build.gradle | 30 +++++ .../android/apps/skqp/src/main/AndroidManifest.xml | 9 ++ .../skqp/src/main/java/org/skia/skqp/SkQP.java | 14 +++ .../src/main/java/org/skia/skqp/SkQPException.java | 12 ++ .../src/main/java/org/skia/skqp/SkQPRunner.java | 133 +++++++++++++++++++++ 6 files changed, 199 insertions(+) create mode 100644 platform_tools/android/apps/skqp/build.gradle create mode 100644 platform_tools/android/apps/skqp/src/main/AndroidManifest.xml create mode 100644 platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQP.java create mode 100644 platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPException.java create mode 100644 platform_tools/android/apps/skqp/src/main/java/org/skia/skqp/SkQPRunner.java (limited to 'platform_tools') 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 @@ + + + + + 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); + } + } +} + -- cgit v1.2.3