13d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner/*
23d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner * Copyright (C) 2014 The Android Open Source Project
33d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner *
43d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner * Licensed under the Apache License, Version 2.0 (the "License");
53d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner * you may not use this file except in compliance with the License.
63d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner * You may obtain a copy of the License at
73d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner *
83d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner *      http://www.apache.org/licenses/LICENSE-2.0
93d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner *
103d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner * Unless required by applicable law or agreed to in writing, software
113d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner * distributed under the License is distributed on an "AS IS" BASIS,
123d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner * See the License for the specific language governing permissions and
143d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner * limitations under the License.
153d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner */
163d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
173d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shraunerpackage com.android.exchange.adapter;
183d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
193d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shraunerimport android.test.AndroidTestCase;
203d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shraunerimport android.test.suitebuilder.annotation.SmallTest;
213d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shraunerimport android.text.TextUtils;
223d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
233c193c425ff383dbc94514d055ae6778821d8471Martin Hibdonimport com.android.exchange.service.EasService;
243c193c425ff383dbc94514d055ae6778821d8471Martin Hibdon
253d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shraunerimport java.io.ByteArrayInputStream;
263d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shraunerimport java.io.InputStream;
273d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shraunerimport java.io.IOException;
283d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shraunerimport java.util.Deque;
293d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shraunerimport java.util.ArrayDeque;
303d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shraunerimport java.util.Arrays;
313d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
323d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner@SmallTest
333d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shraunerpublic class ParserTest extends AndroidTestCase {
343d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    public class TestParser extends Parser {
353d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        private Deque<Object> mExpectedData;
363d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
373d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        public TestParser(InputStream in, Object[] expectedData) throws IOException{
383d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            super(in);
393c193c425ff383dbc94514d055ae6778821d8471Martin Hibdon            EasService.setProtocolLogging(true);
403d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            mExpectedData = expectedData == null ? null
413d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                : new ArrayDeque<Object>(Arrays.asList(expectedData));
423d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        }
433d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
443d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        @Override
453d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        public boolean parse() throws IOException {
463d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            int tag;
473d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            while((tag = nextTag(START_DOCUMENT)) != END_DOCUMENT) {
483d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                if (tag == 0x0B) {
493d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                    final String strVal = getValue();
503d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                    if (mExpectedData != null) {
513d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                        final String expectedStrVal = (String) mExpectedData.removeFirst();
523d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                        assertEquals(expectedStrVal, strVal);
533d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                    }
543d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                } else if (tag == 0x0C) {
553d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                    final int intVal = getValueInt();
563d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                    if (mExpectedData != null) {
573d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                        final Integer expectedIntVal = (Integer) mExpectedData.removeFirst();
583d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                        assertEquals(expectedIntVal.intValue(), intVal);
593d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                    }
603d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                } else if (tag == 0x0D) {
613d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                    final byte[] bytes = getValueBytes();
623d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                    if (mExpectedData != null) {
633d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                        final String expectedHexStr = stripString((String) mExpectedData.removeFirst());
643d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                        final String hexStr = byteArrayToHexString(bytes);
653d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                        assertEquals(expectedHexStr, hexStr);
663d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                    }
673d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                }
683d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            }
693d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            return true;
703d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        }
713d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
723d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
733d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
743d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    private static String byteArrayToHexString(byte[] bytes) {
753d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        char[] hexChars = new char[bytes.length * 2];
763d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        for ( int j = 0; j < bytes.length; j++ ) {
773d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            int v = bytes[j] & 0xFF;
783d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            hexChars[j * 2] = hexArray[v >>> 4];
793d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
803d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        }
813d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        return new String(hexChars);
823d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
833d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
843d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    private static String stripString(String str) {
853d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        return TextUtils.join("", str.split(" "));
863d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
873d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
883d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    private static byte[] hexStringToByteArray(String hexStr) {
893d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String s = TextUtils.join("", hexStr.split(" "));
903d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final int len = s.length();
913d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final byte[] data = new byte[len / 2];
923d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        for (int i = 0; i < len; i += 2) {
933d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
943d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner                    + Character.digit(s.charAt(i+1), 16));
953d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        }
963d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        return data;
973d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
983d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
993d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    private static InputStream getTestInputStream(final String hexStr) {
1003d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final byte[] byteArray = hexStringToByteArray(hexStr);
1013d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        return new ByteArrayInputStream(byteArray);
1023d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
1033d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1043d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    private void testParserHelper(String wbxmlStr) throws Exception {
1053d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(wbxmlStr, null);
1063d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
1073d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1083d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    private void testParserHelper(String wbxmlStr, Object[] expectedData) throws Exception {
1093d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final Parser parser = new TestParser(getTestInputStream(wbxmlStr), expectedData);
1103d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        parser.parse();
1113d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
1123d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1133d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    @SmallTest
1143d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    public void testUnsupportedWbxmlTag() throws Exception {
1153d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Test parser with unsupported Wbxml tag (EXT_2 = 0xC2)
1163d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String unsupportedWbxmlTag = "03 01 6A 00 45 5F C2 05 11 22 33 44 00 01 01";
1173d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        try {
1183d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            testParserHelper(unsupportedWbxmlTag);
1193d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            fail("Expected EasParserException for unsupported tag 0xC2");
1203d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        } catch (Parser.EasParserException e) {
1213d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            // expected
1223d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        }
1233d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
1243d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1253d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    @SmallTest
1263d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    public void testUnknownCodePage() throws Exception {
1273d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Test parser with non existent code page 64 (0x40)
1283d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String unknownCodePage = "03 01 6A 00 45 00 40 4A 03 31 00 01 01";
1293d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        try {
1303d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            testParserHelper(unknownCodePage);
1313d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            fail("Expected EasParserException for unknown code page 64");
1323d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        } catch (Parser.EasParserException e) {
1333d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            // expected
1343d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        }
1353d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
1363d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1373d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    @SmallTest
1383d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    public void testUnknownTag() throws Exception {
1393d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Test parser with valid code page (0x00) but non existent tag (0x3F)
1403d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String unknownTag = "03 01 6A 00 45 7F 03 31 00 01 01";
1413d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(unknownTag);
1423d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
1433d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1443d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    @SmallTest
1453d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    public void testTextParsing() throws Exception {
1463d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect text; has text data "DF"
1473d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String textTagWithTextData = "03 01 6A 00 45 4B 03 44 46 00 01 01";
1483d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(textTagWithTextData, new Object[] {"DF"});
1493d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1503d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect text; has tag with no content: <Tag/>
1513d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String textTagNoContent = "03 01 6A 00 45 0B 01";
1523d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(textTagNoContent, new Object[] {""});
1533d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1543d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect text; has tag and end tag with no value: <Tag></Tag>
1553d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String emptyTextTag = "03 01 6A 00 45 4B 01 01";
1563d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(emptyTextTag, new Object[] {""});
1573d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1583d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect text; has opaque data {0x11, 0x22, 0x33}
1593d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String textTagWithOpaqueData = "03 01 6A 00 45 4B C3 03 11 22 33 01 01";
1603d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        try {
1613d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            testParserHelper(textTagWithOpaqueData);
1623d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            fail("Expected EasParserException for trying to read opaque data as text");
1633d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        } catch (Parser.EasParserException e) {
1643d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            // expected
1653d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        }
1663d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
1673d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1683d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    @SmallTest
1693d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    public void testIntegerStringParsing() throws Exception {
1703d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect int; has text data "1"
1713d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String intTagWithIntData = "03 01 6A 00 45 4C 03 31 00 01 01";
1723d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(intTagWithIntData, new Object[] {1});
1733d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1743d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect int; has tag with no content: <Tag/>
1753d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String intTagNoContent = "03 01 6A 00 45 0C 01";
1763d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(intTagNoContent, new Object[] {0});
1773d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1783d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect int; has tag and end tag with no value: <Tag></Tag>
1793d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String emptyIntTag = "03 01 6A 00 45 4C 01 01";
1803d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(emptyIntTag, new Object[] {0});
1813d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1823d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect int; has text data "DF"
1833d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String intTagWithTextData = "03 01 6A 00 45 4C 03 44 46 00 01 01";
1843d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        try {
1853d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            testParserHelper(intTagWithTextData);
1863d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            fail("Expected EasParserException for nonnumeric char 'D'");
1873d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        } catch (Parser.EasParserException e) {
1883d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            // expected
1893d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        }
1903d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
1913d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1923d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    @SmallTest
1933d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    public void testOpaqueDataParsing() throws Exception {
1943d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect opaque; has opaque data {0x11, 0x22, 0x33}
1953d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String opaqueTagWithOpaqueData = "03 01 6A 00 45 4D C3 03 11 22 33 01 01";
1963d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(opaqueTagWithOpaqueData, new Object[] {"11 22 33"});
1973d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
1983d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect opaque; has tag with no content: <Tag/>
1993d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String opaqueTagNoContent = "03 01 6A 00 45 0D 01";
2003d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(opaqueTagNoContent, new Object[] {""});
2013d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
2023d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect opaque; has tag and end tag with no value: <Tag></Tag>
2033d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String emptyOpaqueTag = "03 01 6A 00 45 4D 01 01";
2043d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(emptyOpaqueTag, new Object[] {""});
2053d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
2063d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Expect opaque; has text data "DF"
2073d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String opaqueTagWithTextData = "03 01 6A 00 45 4D 03 44 46 00 01 01";
2083d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        testParserHelper(opaqueTagWithTextData, new Object[] {"44 46"});
2093d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
2103d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
2113d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    @SmallTest
2123d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    public void testMalformedData() throws Exception {
2133d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String malformedData = "03 01 6A 00 45 4B 03 11 22 00 00 33 00 01 01";
2143d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        try {
2153d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            testParserHelper(malformedData);
2163d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            fail("Expected EasParserException for improperly escaped text data");
2173d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        } catch (Parser.EasParserException e) {
2183d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            // expected
2193d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        }
2203d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
2213d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner
2223d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    @SmallTest
2233d52ff729b82a20802bb6d5a8952040f4d961cefJay Shrauner    public void testRunOnInteger() throws Exception {
2243d52ff729b82a20802bb6d5a8952040f4d961cefJay Shrauner        final String runOnIntegerEncoding = "03 01 6A 00 45 4D C3 81 82 83 84 85 06 11 22 33 01 01";
2253d52ff729b82a20802bb6d5a8952040f4d961cefJay Shrauner        try {
2263d52ff729b82a20802bb6d5a8952040f4d961cefJay Shrauner            testParserHelper(runOnIntegerEncoding);
2273d52ff729b82a20802bb6d5a8952040f4d961cefJay Shrauner            fail("Expected EasParserException for improperly encoded integer");
2283d52ff729b82a20802bb6d5a8952040f4d961cefJay Shrauner        } catch (Parser.EasParserException e) {
2293d52ff729b82a20802bb6d5a8952040f4d961cefJay Shrauner            // expected
2303d52ff729b82a20802bb6d5a8952040f4d961cefJay Shrauner        }
2313d52ff729b82a20802bb6d5a8952040f4d961cefJay Shrauner    }
2323d52ff729b82a20802bb6d5a8952040f4d961cefJay Shrauner
2333d52ff729b82a20802bb6d5a8952040f4d961cefJay Shrauner    @SmallTest
2343d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    public void testAttributeTag() throws Exception {
2353d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        // Test parser with known tag with attributes
2363d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        final String tagWithAttributes = "03 01 6A 00 45 DF 06 01 03 31 00 01 01";
2373d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        try {
2383d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            testParserHelper(tagWithAttributes);
2393d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            fail("Expected EasParserException for tag with attributes 0xDF");
2403d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        } catch (Parser.EasParserException e) {
2413d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner            // expected
2423d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner        }
2433d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner    }
2443d3a9d01938c0b25f629985473fcef8f7d4455eeJay Shrauner}
245