SequenceTest.java revision 561ee011997c6c2f1befbfaa9d5f0a99771c1d63
1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes* @author Stepan M. Mishura
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes*/
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.security.tests.asn1.der;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.IOException;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.ArrayList;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Arrays;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.List;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1Boolean;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1Exception;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1Integer;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1Sequence;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1SequenceOf;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.ASN1Type;
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.BerInputStream;
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.DerInputStream;
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport org.apache.harmony.security.asn1.DerOutputStream;
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * ASN.1 DER test for Sequence type
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * @see http://asn1.elibel.tm.fr/en/standards/index.htm
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class SequenceTest extends TestCase {
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static void main(String[] args) {
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        junit.textui.TestRunner.run(SequenceTest.class);
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static ASN1SequenceOf sequenceOf = new ASN1SequenceOf(ASN1Boolean
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            .getInstance());
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static ArrayList defaultList;
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static ASN1Sequence sequence;
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static Object[][] testcases;
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void setUp() throws Exception {
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.setUp();
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // sequence ::= SEQUENCE {
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //     boolean BOOLEAN, DEFAULT true
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //     list SEQUENCE OF BOOLEAN, DEFAULT list(false)
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // }
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        defaultList = new ArrayList();
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        defaultList.add(Boolean.FALSE);
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        sequence = new ASN1Sequence(new ASN1Type[] { ASN1Boolean.getInstance(),
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                sequenceOf }) {
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                setDefault(Boolean.TRUE, 0);
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                setDefault(defaultList, 1);
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            protected Object getDecodedObject(BerInputStream in)
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    throws IOException {
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                Object[] values = (Object[]) in.content;
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return new AppClass((Boolean) values[0], (List) values[1]);
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            protected void getValues(Object object, Object[] values) {
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                AppClass obj = (AppClass) object;
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                values[0] = obj.ok;
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                values[1] = obj.list;
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Test Cases
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        testcases = new Object[][] {
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // format: object to encode / byte array
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // sequence : all values are default
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { new AppClass(Boolean.TRUE, defaultList),
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        new byte[] { 0x30, 0x00 } },
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // sequence : true, default
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { new AppClass(Boolean.FALSE, defaultList),
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        new byte[] { 0x30, 0x03, 0x01, 0x01, 0x00 } },
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // sequence = default, empty sequence
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { new AppClass(Boolean.TRUE, new ArrayList()),
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        new byte[] { 0x30, 0x02, 0x30, 0x00 } },
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // sequence = false, empty sequence
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                { new AppClass(Boolean.FALSE, new ArrayList()),
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        new byte[] { 0x30, 0x05, 0x01, 0x01, 0x00, 0x30, 0x00 } },
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //TODO add testcase for another ASN.1 type`
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Application class
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class AppClass {
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public Boolean ok;
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public List list;
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public AppClass(Boolean ok, List list) {
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.ok = ok;
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            this.list = list;
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public boolean equals(Object o) {
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (o instanceof AppClass) {
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                AppClass obj = (AppClass) o;
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return ok.equals(obj.ok) && list.equals(obj.list);
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return false;
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecode_Valid() throws IOException {
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < testcases.length; i++) {
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                DerInputStream in = new DerInputStream((byte[]) testcases[i][1]);
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertEquals("Test case: " + i, testcases[i][0], sequence
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        .decode(in));
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (ASN1Exception e) {
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("Test case: " + i + "\n" + e.getMessage());
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    //FIXME need testcase for decoding invalid encodings
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testEncode() throws IOException {
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < testcases.length; i++) {
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            DerOutputStream out = new DerOutputStream(sequence, testcases[i][0]);
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue("Test case: " + i, Arrays.equals(
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    (byte[]) testcases[i][1], out.encoded));
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testVerify() throws IOException {
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ASN1Sequence seqVerify = new ASN1Sequence(new ASN1Type[] {
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ASN1Boolean.getInstance(), sequenceOf }) {
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                setDefault(Boolean.TRUE, 0);
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                setDefault(defaultList, 1);
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            protected Object getDecodedObject(BerInputStream in)
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    throws IOException {
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new IOException(
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                        "Method getDecodedObject MUST not be invoked");
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < testcases.length; i++) {
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            DerInputStream in = new DerInputStream((byte[]) testcases[i][1]);
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            in.setVerify();
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            seqVerify.decode(in);
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Tests encoding default fields
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testEncodeDefault() throws IOException {
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Boolean as default
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ASN1Sequence s = new ASN1Sequence(new ASN1Type[] { ASN1Boolean
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getInstance() }) {
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                setDefault(Boolean.TRUE, 0);
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            protected void getValues(Object object, Object[] values) {
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                values = (Object[]) object;
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] expectedArray = new byte[] { 0x30, 0x00 };
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] encoded = s.encode(new Object[] { Boolean.TRUE });
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Encoded boolean:", Arrays.equals(expectedArray, encoded));
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Integer as default
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        s = new ASN1Sequence(new ASN1Type[] { ASN1Integer.getInstance() }) {
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                setDefault(new byte[] { 0x01 }, 0);
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            protected void getValues(Object object, Object[] values) {
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                values = (Object[]) object;
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoded = s.encode(new Object[] { new byte[] { 0x01 } });
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Encoded integer:", Arrays.equals(expectedArray, encoded));
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Tests encoding optional fields
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testEncodeOptional() throws IOException {
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Test not optional
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ASN1Sequence s = new ASN1Sequence(new ASN1Type[] { ASN1Boolean
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .getInstance() }) {
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            protected void getValues(Object object, Object[] values) {
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                values[0] = ((Object[]) object)[0];
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            s.encode(new Object[] { null });
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("No expected RuntimeException");
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (RuntimeException e) {
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Test optional
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        s = new ASN1Sequence(new ASN1Type[] { ASN1Boolean.getInstance() }) {
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            {
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                setOptional(0);
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            protected void getValues(Object object, Object[] values) {
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                values[0] = ((Object[]) object)[0];
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        };
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] expectedArray = new byte[] { 0x30, 0x00 };
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] encoded = s.encode(new Object[] { null });
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Encoded boolean:", Arrays.equals(expectedArray, encoded));
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}