1 // Copyright 2015 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.mojo.bindings; 6 7 import android.test.suitebuilder.annotation.SmallTest; 8 9 import org.chromium.mojo.MojoTestCase; 10 import org.chromium.mojo.bindings.Callbacks.Callback1; 11 import org.chromium.mojo.bindings.test.mojom.sample.Enum; 12 import org.chromium.mojo.bindings.test.mojom.sample.IntegerAccessor; 13 import org.chromium.mojo.system.MojoException; 14 15 import java.io.Closeable; 16 import java.util.ArrayList; 17 import java.util.Collections; 18 import java.util.List; 19 20 /** 21 * Tests for interface control messages. 22 */ 23 public class InterfaceControlMessageTest extends MojoTestCase { 24 private final List<Closeable> mCloseablesToClose = new ArrayList<Closeable>(); 25 26 /** 27 * See mojo/public/interfaces/bindings/tests/sample_interfaces.mojom. 28 */ 29 class IntegerAccessorImpl extends SideEffectFreeCloseable implements IntegerAccessor { 30 private long mValue = 0; 31 private int mEnum = 0; 32 private boolean mEncounteredError = false; 33 34 /** 35 * @see ConnectionErrorHandler#onConnectionError(MojoException) 36 */ 37 @Override 38 public void onConnectionError(MojoException e) { 39 mEncounteredError = true; 40 } 41 42 /** 43 * @see IntegerAccessor#getInteger(IntegerAccessor.GetIntegerResponse) 44 */ 45 @Override 46 public void getInteger(GetIntegerResponse response) { 47 response.call(mValue, mEnum); 48 } 49 50 /** 51 * @see IntegerAccessor#setInteger(long, int) 52 */ 53 @Override 54 public void setInteger(long value, int enumValue) { 55 mValue = value; 56 mEnum = enumValue; 57 } 58 59 public long getValue() { 60 return mValue; 61 } 62 63 public boolean encounteredError() { 64 return mEncounteredError; 65 } 66 } 67 68 /** 69 * @see MojoTestCase#tearDown() 70 */ 71 @Override 72 protected void tearDown() throws Exception { 73 // Close the elements in the reverse order they were added. This is needed because it is an 74 // error to close the handle of a proxy without closing the proxy first. 75 Collections.reverse(mCloseablesToClose); 76 for (Closeable c : mCloseablesToClose) { 77 c.close(); 78 } 79 super.tearDown(); 80 } 81 82 @SmallTest 83 public void testQueryVersion() { 84 IntegerAccessor.Proxy p = BindingsTestUtils.newProxyOverPipe( 85 IntegerAccessor.MANAGER, new IntegerAccessorImpl(), mCloseablesToClose); 86 assertEquals(0, p.getProxyHandler().getVersion()); 87 p.getProxyHandler().queryVersion(new Callback1<Integer>() { 88 @Override 89 public void call(Integer version) { 90 assertEquals(3, version.intValue()); 91 } 92 }); 93 runLoopUntilIdle(); 94 assertEquals(3, p.getProxyHandler().getVersion()); 95 } 96 97 @SmallTest 98 public void testRequireVersion() { 99 IntegerAccessorImpl impl = new IntegerAccessorImpl(); 100 IntegerAccessor.Proxy p = BindingsTestUtils.newProxyOverPipe( 101 IntegerAccessor.MANAGER, impl, mCloseablesToClose); 102 103 assertEquals(0, p.getProxyHandler().getVersion()); 104 105 p.getProxyHandler().requireVersion(1); 106 assertEquals(1, p.getProxyHandler().getVersion()); 107 p.setInteger(123, Enum.VALUE); 108 runLoopUntilIdle(); 109 assertFalse(impl.encounteredError()); 110 assertEquals(123, impl.getValue()); 111 112 p.getProxyHandler().requireVersion(3); 113 assertEquals(3, p.getProxyHandler().getVersion()); 114 p.setInteger(456, Enum.VALUE); 115 runLoopUntilIdle(); 116 assertFalse(impl.encounteredError()); 117 assertEquals(456, impl.getValue()); 118 119 // Require a version that is not supported by the implementation side. 120 p.getProxyHandler().requireVersion(4); 121 // getVersion() is updated synchronously. 122 assertEquals(4, p.getProxyHandler().getVersion()); 123 p.setInteger(789, Enum.VALUE); 124 runLoopUntilIdle(); 125 assertTrue(impl.encounteredError()); 126 // The call to setInteger() after requireVersion() is ignored. 127 assertEquals(456, impl.getValue()); 128 } 129 } 130