Home | History | Annotate | Download | only in bindings
      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