1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2014 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
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport android.test.suitebuilder.annotation.SmallTest;
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.MojoTestCase;
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport java.nio.ByteBuffer;
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport java.nio.ByteOrder;
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/**
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Testing {@link ValidationTestUtil}.
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpublic class ValidationTestUtilTest extends MojoTestCase {
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * Check that the input parser is correct on a given input.
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public static void checkInputParser(
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            String input, boolean isInputValid, ByteBuffer expectedData, int expectedHandlesCount) {
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        ValidationTestUtil.Data data = ValidationTestUtil.parseData(input);
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        if (isInputValid) {
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            assertNull(data.getErrorMessage());
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            assertEquals(expectedData, data.getData());
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            assertEquals(expectedHandlesCount, data.getHandlesCount());
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        } else {
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            assertNotNull(data.getErrorMessage());
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            assertNull(data.getData());
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * Testing {@link ValidationTestUtil#parseData(String)}.
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @SmallTest
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public void testCorrectMessageParsing() {
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Test empty input.
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            String input = "";
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            ByteBuffer expected = ByteBuffer.allocateDirect(0);
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.order(ByteOrder.LITTLE_ENDIAN);
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            checkInputParser(input, true, expected, 0);
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // Test input that only consists of comments and whitespaces.
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            String input = "    \t  // hello world \n\r \t// the answer is 42   ";
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            ByteBuffer expected = ByteBuffer.allocateDirect(0);
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.order(ByteOrder.nativeOrder());
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            checkInputParser(input, true, expected, 0);
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            String input = "[u1]0x10// hello world !! \n\r  \t [u2]65535 \n"
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    + "[u4]65536 [u8]0xFFFFFFFFFFFFFFFF 0 0Xff";
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            ByteBuffer expected = ByteBuffer.allocateDirect(17);
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.order(ByteOrder.nativeOrder());
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.put((byte) 0x10);
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.putShort((short) 65535);
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.putInt(65536);
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.putLong(-1);
65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.put((byte) 0);
66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.put((byte) 0xff);
67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.flip();
68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            checkInputParser(input, true, expected, 0);
70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {
72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            String input = "[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40";
73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            ByteBuffer expected = ByteBuffer.allocateDirect(15);
74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.order(ByteOrder.nativeOrder());
75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.putLong(-0x800);
76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.put((byte) -128);
77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.putShort((short) 0);
78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.putInt(-40);
79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.flip();
80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            checkInputParser(input, true, expected, 0);
82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {
84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            String input = "[b]00001011 [b]10000000  // hello world\r [b]00000000";
85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            ByteBuffer expected = ByteBuffer.allocateDirect(3);
86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.order(ByteOrder.nativeOrder());
87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.put((byte) 11);
88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.put((byte) 128);
89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.put((byte) 0);
90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.flip();
91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            checkInputParser(input, true, expected, 0);
93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {
95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            String input = "[f]+.3e9 [d]-10.03";
96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            ByteBuffer expected = ByteBuffer.allocateDirect(12);
97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.order(ByteOrder.nativeOrder());
98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.putFloat(+.3e9f);
99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.putDouble(-10.03);
100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.flip();
101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            checkInputParser(input, true, expected, 0);
103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {
105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            String input = "[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar";
106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            ByteBuffer expected = ByteBuffer.allocateDirect(14);
107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.order(ByteOrder.nativeOrder());
108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.putInt(14);
109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.put((byte) 0);
110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.putLong(9);
111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.put((byte) 0);
112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.flip();
113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            checkInputParser(input, true, expected, 0);
115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {
117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            String input = "// This message has handles! \n[handles]50 [u8]2";
118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            ByteBuffer expected = ByteBuffer.allocateDirect(8);
119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.order(ByteOrder.nativeOrder());
120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.putLong(2);
121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            expected.flip();
122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            checkInputParser(input, true, expected, 50);
124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        // Test some failure cases.
127645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        {
128645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            String error_inputs[] = {
129645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "/ hello world",
130645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "[u1]x",
131645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "[u2]-1000",
132645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "[u1]0x100",
133645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "[s2]-0x8001",
134645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "[b]1",
135645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "[b]1111111k",
136645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "[dist4]unmatched",
137645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "[anchr]hello [dist8]hello",
138645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "[dist4]a [dist4]a [anchr]a",
139645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "[dist4]a [anchr]a [dist4]a [anchr]a",
140645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                "0 [handles]50"
141645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            };
142645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
143645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            for (String input : error_inputs) {
144645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                ByteBuffer expected = ByteBuffer.allocateDirect(0);
145645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                expected.order(ByteOrder.nativeOrder());
146645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                checkInputParser(input, false, expected, 0);
147645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
148645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
149645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
150645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
151645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
152