15df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun/*
25df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun * Copyright (C) 2016 The Android Open Source Project
35df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun *
45df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun * Licensed under the Apache License, Version 2.0 (the "License");
55df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun * you may not use this file except in compliance with the License.
65df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun * You may obtain a copy of the License at
75df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun *
85df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun *      http://www.apache.org/licenses/LICENSE-2.0
95df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun *
105df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun * Unless required by applicable law or agreed to in writing, software
115df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun * distributed under the License is distributed on an "AS IS" BASIS,
125df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun * See the License for the specific language governing permissions and
145df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun * limitations under the License.
155df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun */
165df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
175df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunpackage com.android.internal.telephony.uicc.euicc.asn1;
185df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
195df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport static org.junit.Assert.assertArrayEquals;
205df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport static org.junit.Assert.assertEquals;
215df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport static org.junit.Assert.assertFalse;
225df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport static org.junit.Assert.assertTrue;
235df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport static org.junit.Assert.fail;
245df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
255df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport android.test.suitebuilder.annotation.SmallTest;
265df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
275df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport com.android.internal.telephony.uicc.IccUtils;
285df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport com.android.internal.telephony.uicc.asn1.Asn1Decoder;
295df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport com.android.internal.telephony.uicc.asn1.Asn1Node;
305df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport com.android.internal.telephony.uicc.asn1.InvalidAsn1DataException;
315df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport com.android.internal.telephony.uicc.asn1.TagNotFoundException;
325df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
335df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunimport org.junit.Test;
345df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
355df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sunpublic class Asn1NodeTest {
365df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
375df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
385df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test
395df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testCreateConstructedNodeWithShortTag() {
405df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0x65).build();
415df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0x65, node.getTag());
425df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertTrue(node.isConstructed());
435df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(2, node.getEncodedLength());
445df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0, node.getDataLength());
455df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertArrayEquals(new byte[] {0x65, 0x00}, node.toBytes());
465df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
475df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
485df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
495df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test
505df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testCreateConstructedNodeWithLongTag() {
515df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0x3F34).build();
525df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0x3F34, node.getTag());
535df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertTrue(node.isConstructed());
545df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(3, node.getEncodedLength());
555df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0, node.getDataLength());
565df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertArrayEquals(new byte[] {0x3F, 0x34, 0x00}, node.toBytes());
575df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
585df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
595df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
605df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test
615df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testChildren() throws TagNotFoundException, InvalidAsn1DataException {
625df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node =
635df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                Asn1Node.newBuilder(0x3F34)
645df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChild(Asn1Node.newBuilder(0x35).addChild(Asn1Node.newBuilder(0x36)))
655df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChild(Asn1Node.newBuilder(0x35))
665df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChild(Asn1Node.newBuilder(0x37))
675df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .build();
685df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
695df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0x3F34, node.getTag());
705df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(3, node.getChildren().size());
715df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0x35, node.getChildren().get(0).getTag());
725df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0x35, node.getChildren().get(1).getTag());
735df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0x37, node.getChildren().get(2).getTag());
745df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(2, node.getChildren(0x35).size());
755df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0x35, node.getChildren(0x35).get(0).getTag());
765df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0x35, node.getChildren(0x35).get(1).getTag());
775df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(1, node.getChild(0x35).getChildren().size());
785df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0, node.getChildren().get(1).getChildren().size());
795df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0x36, node.getChild(0x35).getChildren().get(0).getTag());
805df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
815df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertTrue(node.hasChild(0x35, 0x36));
825df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertFalse(node.hasChild(0x38, 0x39));
835df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertTrue(node.getChild(0x35).hasChild(0x36));
845df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertFalse(node.getChild(0x35).hasChild(0x39));
855df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
865df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
875df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
885df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test
895df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testNonExitingChildren() throws TagNotFoundException, InvalidAsn1DataException {
905df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node =
915df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                Asn1Node.newBuilder(0x3F34)
925df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChild(Asn1Node.newBuilder(0x34))
935df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChild(Asn1Node.newBuilder(0x35).addChild(Asn1Node.newBuilder(0x36)))
945df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChildAsInteger(0x11, 123)
955df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .build();
965df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
975df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0, node.getChild(0x34).getChildren(0x37).size());
985df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0, node.getChildren(0x37).size());
995df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0, node.getChild(0x11).getChildren(0x37).size());
1005df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0, node.getChild(0x11).getChildren().size());
1015df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        try {
1025df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            node.getChild(0x35).getChild(0x37);
1035df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            fail("0x37 should not exist.");
1045df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        } catch (TagNotFoundException e) {
1055df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            assertEquals(0x37, e.getTag());
1065df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        }
1075df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        try {
1085df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            node.getChild(0x35, 0x37);
1095df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            fail("0x37 should not exist.");
1105df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        } catch (TagNotFoundException e) {
1115df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            assertEquals(0x37, e.getTag());
1125df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        }
1135df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        try {
1145df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            node.getChild(0x11).getChild(0x37);
1155df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            fail("0x37 should not exist.");
1165df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        } catch (TagNotFoundException e) {
1175df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            assertEquals(0x37, e.getTag());
1185df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        }
1195df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
1205df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
1215df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
1225df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test
1235df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testBuilderAndGetters() throws TagNotFoundException, InvalidAsn1DataException {
1245df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node =
1255df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                Asn1Node.newBuilder(0x30)
1265df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChildAsInteger(0x11, 1234567)
1275df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChildAsString(0x12, "This is a test.")
1285df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChild(
1295df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                                Asn1Node.newBuilder(0x31)
1305df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                                        .addChildAsBits(0x13, 0xF2344)
1315df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                                        .addChildAsBytes(0x14, new byte[] {-1, 0, -1}))
1325df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChildAsBoolean(0x15, true)
1335df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChildAsBoolean(0x16, false)
1345df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .addChildren(IccUtils.hexStringToBytes("13040422C4F01403FF00FF"))
1355df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        .build();
1365df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
1375df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(54, node.getEncodedLength());
1385df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(52, node.getDataLength());
1395df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
1405df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        final String nodeHex =
1415df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                "3034110312D687120F54686973206973206120746573742E310B13040422C4F0"
1425df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        + "1403FF00FF1501FF16010013040422C4F01403FF00FF";
1435df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(nodeHex, node.toHex());
1445df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals("3034", node.getHeadAsHex());
1455df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(1234567, node.getChild(0x11).asInteger());
1465df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals("This is a test.", node.getChild(0x12).asString());
1475df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0xF2344, node.getChild(0x31).getChild(0x13).asBits());
1485df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertArrayEquals(new byte[] {-1, 0, -1}, node.getChild(0x31).getChild(0x14).asBytes());
1495df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertTrue(node.getChild(0x15).asBoolean());
1505df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertFalse(node.getChild(0x16).asBoolean());
1515df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(0xF2344, node.getChild(0x13).asBits());
1525df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertArrayEquals(new byte[] {-1, 0, -1}, node.getChild(0x14).asBytes());
1535df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
1545df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
1555df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
1565df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test
1575df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testGettersInvalidData() throws TagNotFoundException, InvalidAsn1DataException {
1585df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0x30).addChildAsString(0x12, "string").build();
1595df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        try {
1605df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            node.getChild(0x12).asInteger();
1615df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            fail("Should not be parsed.");
1625df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        } catch (InvalidAsn1DataException e) {
1635df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            assertEquals(0x12, e.getTag());
1645df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        }
1655df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        try {
1665df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            node.getChild(0x12).asBits();
1675df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            fail("Should not be parsed.");
1685df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        } catch (InvalidAsn1DataException e) {
1695df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            assertEquals(0x12, e.getTag());
1705df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        }
1715df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        try {
1725df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            node.getChild(0x12).asBoolean();
1735df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            fail("Should not be parsed.");
1745df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        } catch (InvalidAsn1DataException e) {
1755df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            assertEquals(0x12, e.getTag());
1765df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        }
1775df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
1785df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
1795df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
1805df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test
1815df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testWriteToBytes() throws InvalidAsn1DataException {
1825df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        final String nodeHex =
1835df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                "3031110312D687120F54686973206973206120746573742E310B13040422C4F0"
1845df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun                        + "1403FF00FF1501FF13040422C4F01403FF00FF";
1855df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
1865df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = new Asn1Decoder(nodeHex).nextNode();
1875df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        // Writes the bytes before children accessed.
1885df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(nodeHex, node.toHex());
1895df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        // Writes the bytes after children accessed.
1905df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        node.getChildren();
1915df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(nodeHex, node.toHex());
1925df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
1935df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
1945df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
1955df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test
1965df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testLongFormLength() throws TagNotFoundException, InvalidAsn1DataException {
1975df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0xBF37).addChildAsBytes(0x5A, new byte[257]).build();
1985df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(266, node.getEncodedLength());
1995df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(261, node.getDataLength());
2005df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals(257, node.getChild(0x5A).getDataLength());
2015df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertEquals("BF37820105", node.getHeadAsHex());
2025df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2035df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        byte[] expected = new byte[266];
2045df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        System.arraycopy(IccUtils.hexStringToBytes("BF378201055A820101"), 0, expected, 0, 9);
2055df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        byte[] actual = new byte[266];
2065df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        node.writeToBytes(actual, 0);
2075df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        assertArrayEquals(expected, actual);
2085df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2095df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2105df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2115df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalArgumentException.class)
2125df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testBuilder_NonConstructedTag() {
2135df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node.newBuilder(0x87);
2145df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2155df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2165df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2175df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalStateException.class)
2185df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testBuilderAddChildAsInteger_ConstructedTag() {
2195df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node.newBuilder(0xBF37).addChildAsInteger(0xBF37, 1);
2205df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2215df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2225df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2235df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalStateException.class)
2245df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testBuilderAddChildAsString_ConstructedTag() {
2255df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node.newBuilder(0xBF37).addChildAsString(0xBF37, "");
2265df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2275df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2285df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2295df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalStateException.class)
2305df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testBuilderAddChildAsBytes_ConstructedTag() {
2315df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node.newBuilder(0xBF37).addChildAsBytesFromHex(0xBF37, "00");
2325df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2335df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2345df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2355df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalStateException.class)
2365df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testBuilderAddChildAsBits_ConstructedTag() {
2375df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node.newBuilder(0xBF37).addChildAsBits(0xBF37, 1);
2385df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2395df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2405df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2415df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalStateException.class)
2425df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testBuilderAddChildAsBoolean_ConstructedTag() {
2435df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node.newBuilder(0xBF37).addChildAsBoolean(0xBF37, true);
2445df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2455df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2465df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2475df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalStateException.class)
2485df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testAsInteger_ConstructedTag() throws InvalidAsn1DataException {
2495df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0xBF37).build();
2505df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        node.asInteger();
2515df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2525df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2535df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2545df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalStateException.class)
2555df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testAsLong_ConstructedTag() throws InvalidAsn1DataException {
2565df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0xBF37).build();
2575df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        node.asRawLong();
2585df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2595df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2605df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2615df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalStateException.class)
2625df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testAsString_ConstructedTag() throws InvalidAsn1DataException {
2635df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0xBF37).build();
2645df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        node.asString();
2655df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2665df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2675df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2685df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalStateException.class)
2695df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testAsBytes_ConstructedTag() throws InvalidAsn1DataException {
2705df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0xBF37).build();
2715df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        node.asBytes();
2725df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2735df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2745df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2755df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalStateException.class)
2765df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testAsBits_ConstructedTag() throws InvalidAsn1DataException {
2775df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0xBF37).build();
2785df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        node.asBits();
2795df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2805df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2815df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2825df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IllegalStateException.class)
2835df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testAsBoolean_ConstructedTag() throws InvalidAsn1DataException {
2845df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0xBF37).build();
2855df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        node.asBoolean();
2865df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2875df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2885df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2895df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = InvalidAsn1DataException.class)
2905df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testAsBoolean_InvalidData() throws TagNotFoundException, InvalidAsn1DataException {
2915df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0xBF37).addChildAsString(1, "1").build();
2925df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        node.getChild(1).asBoolean();
2935df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
2945df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun
2955df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @SmallTest
2965df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    @Test(expected = IndexOutOfBoundsException.class)
2975df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    public void testWriteToBytes_IndexOutOfBounds()
2985df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun            throws TagNotFoundException, InvalidAsn1DataException {
2995df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        Asn1Node node = Asn1Node.newBuilder(0xBF37).addChildAsString(1, "1").build();
3005df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        byte[] bytes = new byte[1];
3015df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun        node.writeToBytes(bytes, 0);
3025df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun    }
3035df6f558161aba520c84eb76d0926d4cb43fff1dHolly Jiuyu Sun}
304