1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2015 The Chromium Authors. All rights reserved.
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file.
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpackage org.chromium.mojo.bindings;
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
7cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelliimport android.support.test.filters.SmallTest;
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.MojoTestCase;
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.bindings.Callbacks.Callback1;
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.bindings.test.mojom.sample.Enum;
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.bindings.test.mojom.sample.IntegerAccessor;
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.system.MojoException;
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport java.io.Closeable;
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport java.util.ArrayList;
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport java.util.Collections;
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport java.util.List;
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/**
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Tests for interface control messages.
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpublic class InterfaceControlMessageTest extends MojoTestCase {
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    private final List<Closeable> mCloseablesToClose = new ArrayList<Closeable>();
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * See mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    class IntegerAccessorImpl extends SideEffectFreeCloseable implements IntegerAccessor {
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        private long mValue = 0;
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        private int mEnum = 0;
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        private boolean mEncounteredError = false;
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * @see ConnectionErrorHandler#onConnectionError(MojoException)
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        @Override
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public void onConnectionError(MojoException e) {
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mEncounteredError = true;
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * @see IntegerAccessor#getInteger(IntegerAccessor.GetIntegerResponse)
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        @Override
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public void getInteger(GetIntegerResponse response) {
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            response.call(mValue, mEnum);
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * @see IntegerAccessor#setInteger(long, int)
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        @Override
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public void setInteger(long value, int enumValue) {
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mValue = value;
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mEnum = enumValue;
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public long getValue() {
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return mValue;
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public boolean encounteredError() {
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return mEncounteredError;
65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see MojoTestCase#tearDown()
70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @Override
72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    protected void tearDown() throws Exception {
73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        // Close the elements in the reverse order they were added. This is needed because it is an
74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        // error to close the handle of a proxy without closing the proxy first.
75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        Collections.reverse(mCloseablesToClose);
76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        for (Closeable c : mCloseablesToClose) {
77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            c.close();
78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        super.tearDown();
80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SmallTest
83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public void testQueryVersion() {
84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        IntegerAccessor.Proxy p = BindingsTestUtils.newProxyOverPipe(
85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                IntegerAccessor.MANAGER, new IntegerAccessorImpl(), mCloseablesToClose);
86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertEquals(0, p.getProxyHandler().getVersion());
87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        p.getProxyHandler().queryVersion(new Callback1<Integer>() {
88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            @Override
89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public void call(Integer version) {
90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                assertEquals(3, version.intValue());
91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        });
93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        runLoopUntilIdle();
94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertEquals(3, p.getProxyHandler().getVersion());
95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SmallTest
98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public void testRequireVersion() {
99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        IntegerAccessorImpl impl = new IntegerAccessorImpl();
100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        IntegerAccessor.Proxy p = BindingsTestUtils.newProxyOverPipe(
101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                IntegerAccessor.MANAGER, impl, mCloseablesToClose);
102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertEquals(0, p.getProxyHandler().getVersion());
104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        p.getProxyHandler().requireVersion(1);
106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertEquals(1, p.getProxyHandler().getVersion());
107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        p.setInteger(123, Enum.VALUE);
108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        runLoopUntilIdle();
109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertFalse(impl.encounteredError());
110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertEquals(123, impl.getValue());
111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        p.getProxyHandler().requireVersion(3);
113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertEquals(3, p.getProxyHandler().getVersion());
114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        p.setInteger(456, Enum.VALUE);
115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        runLoopUntilIdle();
116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertFalse(impl.encounteredError());
117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertEquals(456, impl.getValue());
118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        // Require a version that is not supported by the implementation side.
120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        p.getProxyHandler().requireVersion(4);
121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        // getVersion() is updated synchronously.
122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertEquals(4, p.getProxyHandler().getVersion());
123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        p.setInteger(789, Enum.VALUE);
124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        runLoopUntilIdle();
125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertTrue(impl.encounteredError());
126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        // The call to setInteger() after requireVersion() is ignored.
127645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        assertEquals(456, impl.getValue());
128645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
129645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
130