Index: mojo/android/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java |
diff --git a/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java b/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c101675186b5148ba45dfa63f1bcafdda827ff4e |
--- /dev/null |
+++ b/mojo/android/javatests/src/org/chromium/mojo/bindings/InterfaceControlMessageTest.java |
@@ -0,0 +1,129 @@ |
+// Copyright 2015 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 org.chromium.mojo.MojoTestCase; |
+import org.chromium.mojo.bindings.Callbacks.Callback1; |
+import org.chromium.mojo.bindings.test.mojom.sample.Enum; |
+import org.chromium.mojo.bindings.test.mojom.sample.IntegerAccessor; |
+import org.chromium.mojo.system.MojoException; |
+ |
+import java.io.Closeable; |
+import java.util.ArrayList; |
+import java.util.Collections; |
+import java.util.List; |
+ |
+/** |
+ * Tests for interface control messages. |
+ */ |
+public class InterfaceControlMessageTest extends MojoTestCase { |
+ private final List<Closeable> mCloseablesToClose = new ArrayList<Closeable>(); |
+ |
+ /** |
+ * See mojo/public/interfaces/bindings/tests/sample_interfaces.mojom. |
+ */ |
+ class IntegerAccessorImpl extends SideEffectFreeCloseable implements IntegerAccessor { |
+ private long mValue = 0; |
+ private int mEnum = 0; |
+ private boolean mEncounteredError = false; |
+ |
+ /** |
+ * @see ConnectionErrorHandler#onConnectionError(MojoException) |
+ */ |
+ @Override |
+ public void onConnectionError(MojoException e) { |
+ mEncounteredError = true; |
+ } |
+ |
+ /** |
+ * @see IntegerAccessor#getInteger(IntegerAccessor.GetIntegerResponse) |
+ */ |
+ @Override |
+ public void getInteger(GetIntegerResponse response) { |
+ response.call(mValue, mEnum); |
+ } |
+ |
+ /** |
+ * @see IntegerAccessor#setInteger(long, int) |
+ */ |
+ @Override |
+ public void setInteger(long value, int enumValue) { |
+ mValue = value; |
+ mEnum = enumValue; |
+ } |
+ |
+ public long getValue() { |
+ return mValue; |
+ } |
+ |
+ public boolean encounteredError() { |
+ return mEncounteredError; |
+ } |
+ } |
+ |
+ /** |
+ * @see MojoTestCase#tearDown() |
+ */ |
+ @Override |
+ protected void tearDown() throws Exception { |
+ // Close the elements in the reverse order they were added. This is needed because it is an |
+ // error to close the handle of a proxy without closing the proxy first. |
+ Collections.reverse(mCloseablesToClose); |
+ for (Closeable c : mCloseablesToClose) { |
+ c.close(); |
+ } |
+ super.tearDown(); |
+ } |
+ |
+ @SmallTest |
+ public void testQueryVersion() { |
+ IntegerAccessor.Proxy p = BindingsTestUtils.newProxyOverPipe( |
+ IntegerAccessor.MANAGER, new IntegerAccessorImpl(), mCloseablesToClose); |
+ assertEquals(0, p.getProxyHandler().getVersion()); |
+ p.getProxyHandler().queryVersion(new Callback1<Integer>() { |
+ @Override |
+ public void call(Integer version) { |
+ assertEquals(3, version.intValue()); |
+ } |
+ }); |
+ runLoopUntilIdle(); |
+ assertEquals(3, p.getProxyHandler().getVersion()); |
+ } |
+ |
+ @SmallTest |
+ public void testRequireVersion() { |
+ IntegerAccessorImpl impl = new IntegerAccessorImpl(); |
+ IntegerAccessor.Proxy p = BindingsTestUtils.newProxyOverPipe( |
+ IntegerAccessor.MANAGER, impl, mCloseablesToClose); |
+ |
+ assertEquals(0, p.getProxyHandler().getVersion()); |
+ |
+ p.getProxyHandler().requireVersion(1); |
+ assertEquals(1, p.getProxyHandler().getVersion()); |
+ p.setInteger(123, Enum.VALUE); |
+ runLoopUntilIdle(); |
+ assertFalse(impl.encounteredError()); |
+ assertEquals(123, impl.getValue()); |
+ |
+ p.getProxyHandler().requireVersion(3); |
+ assertEquals(3, p.getProxyHandler().getVersion()); |
+ p.setInteger(456, Enum.VALUE); |
+ runLoopUntilIdle(); |
+ assertFalse(impl.encounteredError()); |
+ assertEquals(456, impl.getValue()); |
+ |
+ // Require a version that is not supported by the implementation side. |
+ p.getProxyHandler().requireVersion(4); |
+ // getVersion() is updated synchronously. |
+ assertEquals(4, p.getProxyHandler().getVersion()); |
+ p.setInteger(789, Enum.VALUE); |
+ runLoopUntilIdle(); |
+ assertTrue(impl.encounteredError()); |
+ // The call to setInteger() after requireVersion() is ignored. |
+ assertEquals(456, impl.getValue()); |
+ } |
+} |