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..1abb40d40e6cd426134ac2340295da792866f005 |
--- /dev/null |
+++ b/mojo/android/javatests/src/org/chromium/mojo/bindings/ValidationTest.java |
@@ -0,0 +1,195 @@ |
+// 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 validation upon deserialization using the interfaces defined in the |
+ * mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom file. |
+ * <p> |
+ * One needs to pass '--test_data=bindings:{path to mojo/public/interfaces/bindings/tests/data}' to |
+ * the test_runner script for this test to find the validation data it needs. |
+ */ |
+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 dataFile; |
+ public ValidationTestUtil.Data inputData; |
+ public String expectedResult; |
+ } |
+ |
+ 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 the test data is not present. |
+ if (!VALIDATION_TEST_DATA_PATH.isDirectory()) { |
+ Log.w("ValidationTest", "No test found."); |
+ return results; |
+ } |
+ |
+ for (File dataFile : VALIDATION_TEST_DATA_PATH.listFiles(new DataFileFilter(prefix))) { |
+ File resultFile = new File(dataFile.getParent(), |
+ dataFile.getName().replaceFirst("\\.data$", ".expected")); |
+ TestData testData = new TestData(); |
+ testData.dataFile = dataFile; |
+ testData.inputData = ValidationTestUtil.parseData(getStringContent(dataFile)); |
+ testData.expectedResult = getStringContent(resultFile); |
+ results.add(testData); |
+ } |
+ return results; |
+ } |
+ |
+ /** |
+ * Runs all the test with the given prefix on the given {@link MessageReceiver}. |
+ */ |
+ private static void runTest(String prefix, MessageReceiver messageReceiver) |
+ throws FileNotFoundException { |
+ List<TestData> testData = getTestData(prefix); |
+ for (TestData test : testData) { |
+ 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 passed = messageReceiver.accept(message); |
+ if (passed && !test.expectedResult.equals("PASS")) { |
+ fail("Input: " + test.dataFile.getName() + |
+ ": The message should have been refused. Expected error: " + |
+ test.expectedResult); |
+ } |
+ if (!passed && test.expectedResult.equals("PASS")) { |
+ fail("Input: " + test.dataFile.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; |
+ } |
+ |
+ /** |
+ * @see MessageReceiver#accept(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; |
+ } |
+ } |
+ |
+ /** |
+ * @see 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_", |
+ new RoutingMessageReceiver(IntegrationTestInterface1.MANAGER.buildStub(null, |
+ IntegrationTestInterface1.MANAGER.buildProxy(null, |
+ new SinkMessageReceiver())), |
+ IntegrationTestInterface2TestHelper. |
+ newIntegrationTestInterface2MethodCallback())); |
+ } |
+} |