11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipackage org.chromium.mojo.bindings;
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport android.test.suitebuilder.annotation.SmallTest;
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.mojo.MojoTestCase;
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport java.nio.ByteBuffer;
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport java.nio.ByteOrder;
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/**
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Testing {@link ValidationTestUtil}.
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipublic class ValidationTestUtilTest extends MojoTestCase {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Check that the input parser is correct on a given input.
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public static void checkInputParser(
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            String input, boolean isInputValid, ByteBuffer expectedData, int expectedHandlesCount) {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ValidationTestUtil.Data data = ValidationTestUtil.parseData(input);
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        if (isInputValid) {
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertNull(data.getErrorMessage());
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(expectedData, data.getData());
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertEquals(expectedHandlesCount, data.getHandlesCount());
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        } else {
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertNotNull(data.getErrorMessage());
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            assertNull(data.getData());
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    /**
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     * Testing {@link ValidationTestUtil#parseData(String)}.
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     */
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    @SmallTest
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    public void testCorrectMessageParsing() {
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            // Test empty input.
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            String input = "";
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ByteBuffer expected = ByteBuffer.allocateDirect(0);
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.order(ByteOrder.nativeOrder());
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            checkInputParser(input, true, expected, 0);
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            // Test input that only consists of comments and whitespaces.
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            String input = "    \t  // hello world \n\r \t// the answer is 42   ";
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ByteBuffer expected = ByteBuffer.allocateDirect(0);
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.order(ByteOrder.nativeOrder());
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            checkInputParser(input, true, expected, 0);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            String input = "[u1]0x10// hello world !! \n\r  \t [u2]65535 \n" +
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    "[u4]65536 [u8]0xFFFFFFFFFFFFFFFF 0 0Xff";
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ByteBuffer expected = ByteBuffer.allocateDirect(17);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.order(ByteOrder.nativeOrder());
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.put((byte) 0x10);
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.putShort((short) 65535);
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.putInt(65536);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.putLong(-1);
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.put((byte) 0);
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.put((byte) 0xff);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.flip();
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            checkInputParser(input, true, expected, 0);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            String input = "[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40";
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ByteBuffer expected = ByteBuffer.allocateDirect(15);
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.order(ByteOrder.nativeOrder());
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.putLong(-0x800);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.put((byte) -128);
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.putShort((short) 0);
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.putInt(-40);
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.flip();
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            checkInputParser(input, true, expected, 0);
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            String input = "[b]00001011 [b]10000000  // hello world\r [b]00000000";
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ByteBuffer expected = ByteBuffer.allocateDirect(3);
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.order(ByteOrder.nativeOrder());
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.put((byte) 11);
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.put((byte) 128);
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.put((byte) 0);
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.flip();
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            checkInputParser(input, true, expected, 0);
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            String input = "[f]+.3e9 [d]-10.03";
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ByteBuffer expected = ByteBuffer.allocateDirect(12);
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.order(ByteOrder.nativeOrder());
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.putFloat(+.3e9f);
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.putDouble(-10.03);
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.flip();
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            checkInputParser(input, true, expected, 0);
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            String input = "[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar";
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ByteBuffer expected = ByteBuffer.allocateDirect(14);
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.order(ByteOrder.nativeOrder());
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.putInt(14);
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.put((byte) 0);
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.putLong(9);
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.put((byte) 0);
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.flip();
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            checkInputParser(input, true, expected, 0);
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            String input = "// This message has handles! \n[handles]50 [u8]2";
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ByteBuffer expected = ByteBuffer.allocateDirect(8);
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.order(ByteOrder.nativeOrder());
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.putLong(2);
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            expected.flip();
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            checkInputParser(input, true, expected, 50);
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        // Test some failure cases.
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        {
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            String error_inputs[] = {
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "/ hello world",
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "[u1]x",
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "[u2]-1000",
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "[u1]0x100",
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "[s2]-0x8001",
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "[b]1",
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "[b]1111111k",
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "[dist4]unmatched",
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "[anchr]hello [dist8]hello",
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "[dist4]a [dist4]a [anchr]a",
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "[dist4]a [anchr]a [dist4]a [anchr]a",
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "0 [handles]50"
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            };
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            for (String input : error_inputs) {
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ByteBuffer expected = ByteBuffer.allocateDirect(0);
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                expected.order(ByteOrder.nativeOrder());
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                checkInputParser(input, false, expected, 0);
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            }
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
152