Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1207)

Unified Diff: mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java

Issue 522353003: mojo: Run validation tests on java (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Adding conformance tests. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef9ab74e0648f821be08b64c16b9468f6b6f4e5a
--- /dev/null
+++ b/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java
@@ -0,0 +1,197 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.mojo.bindings;
+
+import android.test.suitebuilder.annotation.SmallTest;
+import android.util.Log;
+
+import org.chromium.base.test.util.UrlUtils;
+import org.chromium.mojo.MojoTestCase;
+import org.chromium.mojo.bindings.test.mojom.mojo.ConformanceTestInterface;
+import org.chromium.mojo.bindings.test.mojom.mojo.IntegrationTestInterface1;
+import org.chromium.mojo.bindings.test.mojom.mojo.IntegrationTestInterface2TestHelper;
+import org.chromium.mojo.system.Handle;
+import org.chromium.mojo.system.InvalidHandle;
+
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileNotFoundException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Scanner;
+
+/**
+ * Testing deserialization validation.
ppi 2014/09/02 13:07:45 Let's indicate ".. using the interfaces defined in
ppi 2014/09/02 13:07:45 nit: Testing validation upon deserialization.
qsr 2014/09/02 13:28:53 Done.
qsr 2014/09/02 13:28:53 Done.
+ */
+public class ValidationTest extends MojoTestCase {
+
+ /**
+ * The path where validation test data is.
+ */
+ private static final File VALIDATION_TEST_DATA_PATH =
+ new File(UrlUtils.getTestFilePath("bindings/validation"));
+
+ /**
+ * The data needed for a validation test.
+ */
+ private static class TestData {
+ public File file;
ppi 2014/09/02 13:07:44 nit: s/file/dataFile/
qsr 2014/09/02 13:28:53 Done.
+ public ValidationTestUtil.Data inputData;
+ public String result;
ppi 2014/09/02 13:07:44 s/result/expectedResult/
qsr 2014/09/02 13:28:53 Done.
+ }
+
+ private static class DataFileFilter implements FileFilter {
+ private final String mPrefix;
+
+ public DataFileFilter(String prefix) {
+ this.mPrefix = prefix;
+ }
+
+ @Override
+ public boolean accept(File pathname) {
+ return pathname.isFile() && pathname.getName().startsWith(mPrefix)
+ && pathname.getName().endsWith(".data");
+ }
+ }
+
+ private static String getStringContent(File f) throws FileNotFoundException {
+ Scanner scanner = new Scanner(f).useDelimiter("\\Z");
+ if (scanner.hasNext()) {
+ return scanner.next();
+ }
+ return "";
+ }
+
+ private static List<TestData> getTestData(String prefix)
+ throws FileNotFoundException {
+ List<TestData> results = new ArrayList<TestData>();
+
+ // Do not fail if not test path is given, just skip the test.
ppi 2014/09/02 13:07:45 Did you mean "if test path is not given"? Also, wh
qsr 2014/09/02 13:28:53 It happens if you do not specify --test-data on th
ppi 2014/09/02 13:57:39 Ok. Is this automatically handled by "test_runner.
qsr 2014/09/02 14:15:22 It is not handled automatically. You need to add -
+ if (!VALIDATION_TEST_DATA_PATH.isDirectory()) {
+ Log.w("ValidationTest", "No test found.");
+ return results;
+ }
+
+ for (File data : VALIDATION_TEST_DATA_PATH.listFiles(new DataFileFilter(prefix))) {
ppi 2014/09/02 13:07:44 s/data/dataFile/
qsr 2014/09/02 13:28:53 Done.
+ File expected = new File(data.getParent(),
ppi 2014/09/02 13:07:45 s/expected/resultFile/
qsr 2014/09/02 13:28:53 Done.
+ data.getName().replaceFirst("\\.data$", ".expected"));
+ TestData testData = new TestData();
+ testData.file = data;
+ testData.inputData = ValidationTestUtil.parseData(getStringContent(data));
+ testData.result = getStringContent(expected);
+ results.add(testData);
+ }
+ return results;
+ }
+
+ /**
+ * Run all the test with the given prefix on the given {@link MessageReceiver}.
ppi 2014/09/02 13:07:44 s/Run/Runs/
qsr 2014/09/02 13:28:53 Done.
+ */
+ private static void runTest(String prefix, MessageReceiver messageReceiver)
+ throws FileNotFoundException {
+ List<TestData> testData = getTestData(prefix);
+ for (TestData test : testData) {
+ // TODO(qsr): Found out what is the expected result here according to the specs.
ppi 2014/09/02 13:07:44 Nit: Add "// Temporarily disable a failing test."
ppi 2014/09/02 13:07:45 s/Found/Find/
qsr 2014/09/02 13:28:53 Done.
qsr 2014/09/02 13:28:53 I do not plan to push this. I want to resolve the
+ if (test.file.getName().equals(
+ "conformance_mthd0_struct_num_fields_less_than_min_requirement.data")) {
+ continue;
+ }
+ assertNull(test.inputData.getErrorMessage());
+ List<Handle> handles = new ArrayList<Handle>();
+ for (int i = 0; i < test.inputData.getHandlesCount(); ++i) {
+ handles.add(InvalidHandle.INSTANCE);
+ }
+ Message message = new SimpleMessage(test.inputData.getData(), handles);
+ boolean result = messageReceiver.accept(message);
ppi 2014/09/02 13:07:44 s/result/passed/ maybe?
qsr 2014/09/02 13:28:53 Done.
+ if (result && !test.result.equals("PASS")) {
+ fail("Input: " + test.file.getName() +
+ ": The message should have been refused. Error expected: " + test.result);
ppi 2014/09/02 13:07:45 s/Error expected/Expected error/
qsr 2014/09/02 13:28:53 Done.
+ }
+ if (!result && test.result.equals("PASS")) {
+ fail("Input: " + test.file.getName() + ": The message should have been accepted.");
+ }
+ }
+ }
+
+ private static class RoutingMessageReceiver implements MessageReceiver {
+ private final MessageReceiver mRequest;
+ private final MessageReceiver mResponse;
+
+ private RoutingMessageReceiver(MessageReceiver request, MessageReceiver response) {
+ this.mRequest = request;
+ this.mResponse = response;
+ }
+
+ /*
+ * (non-Javadoc)
ppi 2014/09/02 13:07:44 'git grep "non-Javadoc" | wc -l' returns 0, could
qsr 2014/09/02 13:28:53 This is an automatic comment for Eclipse. Removed.
+ * @see
+ * org.chromium.mojo.bindings.MessageReceiver#accept(org.chromium.mojo.bindings.Message)
+ */
+ @Override
+ public boolean accept(Message message) {
+ try {
+ MessageHeader header = message.asMojoMessage().getHeader();
+ if (header.hasFlag(MessageHeader.MESSAGE_IS_RESPONSE_FLAG)) {
+ return mResponse.accept(message);
+ } else {
+ return mRequest.accept(message);
+ }
+ } catch (DeserializationException e) {
+ return false;
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.chromium.mojo.bindings.MessageReceiver#close()
+ */
+ @Override
+ public void close() {
+ }
+
+ }
+
+ /**
+ * A trivial message receiver that refuses all messages it receives.
+ */
+ private static class SinkMessageReceiver implements MessageReceiverWithResponder {
+
+ @Override
+ public boolean accept(Message message) {
+ return false;
+ }
+
+ @Override
+ public void close() {
+ }
+
+ @Override
+ public boolean acceptWithResponder(Message message, MessageReceiver responder) {
+ return false;
+ }
+ }
+
+ /**
+ * Testing the conformance suite.
+ */
+ @SmallTest
+ public void testConformance() throws FileNotFoundException {
+ runTest("conformance_", ConformanceTestInterface.MANAGER.buildStub(null,
+ ConformanceTestInterface.MANAGER.buildProxy(null, new SinkMessageReceiver())));
+ }
+
+ /**
+ * Testing the integration suite.
+ */
+ @SmallTest
+ public void testIntegration() throws FileNotFoundException {
+ runTest("integration_",
ppi 2014/09/02 13:07:44 should this be extracted into a constant next to V
qsr 2014/09/02 13:28:53 I don't know. I feel this information fits in the
ppi 2014/09/02 13:57:39 I see, let's keep these where they are.
qsr 2014/09/02 14:15:22 Acknowledged.
+ new RoutingMessageReceiver(IntegrationTestInterface1.MANAGER.buildStub(null,
+ IntegrationTestInterface1.MANAGER.buildProxy(null,
+ new SinkMessageReceiver())),
+ IntegrationTestInterface2TestHelper.
+ newIntegrationTestInterface2MethodCallback()));
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698