1   /*
2    *   Copyright 2004-2005 The Apache Software Foundation
3    *
4    *   Licensed under the Apache License, Version 2.0 (the "License");
5    *   you may not use this file except in compliance with the License.
6    *   You may obtain a copy of the License at
7    *
8    *       http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *   Unless required by applicable law or agreed to in writing, software
11   *   distributed under the License is distributed on an "AS IS" BASIS,
12   *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *   See the License for the specific language governing permissions and
14   *   limitations under the License.
15   *
16   */
17  package org.apache.asn1.ber ;
18  
19  
20  import org.apache.asn1.ber.AbstractDecoderTestCase;
21  import org.apache.asn1.ber.BERDecoderState;
22  
23  
24  /***
25   * Performs constructed tlv tests.
26   *
27   * @author <a href="mailto:dev@directory.apache.org">
28   * Apache Directory Project</a>
29   * @version $Rev: 157644 $
30   */
31  public class ConstructedTLVTests extends AbstractDecoderTestCase
32  {
33  
34      /***
35       * @param arg0
36       */
37      public ConstructedTLVTests( String arg0 )
38      {
39          super( arg0 ) ;
40      }
41  
42  
43      public void testConstructedDefinateTLV() throws Exception
44      {
45          // decode tag
46          Tuple outter = decode( "01100001" ) ;
47          assertEquals( 1, outter.id ) ;
48          assertEquals( 0, tlvList.size() ) ;
49          assertEquals( false, outter.isPrimitive ) ;
50          assertEquals( TypeClass.APPLICATION, outter.typeClass ) ;
51          assertEquals( BERDecoderState.LENGTH, decoder.getState() ) ;
52  
53          // decode length
54          outter = decode( "00000011" ) ;
55          assertEquals( BERDecoderState.TAG, decoder.getState() ) ;
56  
57          // decode tag
58          Tuple tlv = decode( "01000001" ) ;
59          assertEquals( 1, tlv.id ) ;
60          assertEquals( 0, tlvList.size() ) ;
61          assertEquals( true, tlv.isPrimitive ) ;
62          assertEquals( TypeClass.APPLICATION, tlv.typeClass ) ;
63          assertEquals( BERDecoderState.LENGTH, decoder.getState() ) ;
64  
65          // decode length
66          tlv = decode( "00000001" ) ;
67          assertEquals( BERDecoderState.VALUE, decoder.getState() ) ;
68          assertEquals( 1, tlv.length ) ;
69  
70          // decode value
71          tlv = decode( "01010101" ) ;
72          assertEquals( BERDecoderState.TAG, decoder.getState() ) ;
73          assertEquals( 2, tlvList.size() ) ;
74      }
75  
76  
77      public void testMultipleIndefiniteTLV() throws Exception
78      {
79          // --------------------------------------------------------------------
80  
81          // decode tag
82          Tuple outter = decode( "01100001" ) ;
83          assertEquals( 1, outter.id ) ;
84          assertEquals( 0, tlvList.size() ) ;
85          assertEquals( false, outter.isPrimitive ) ;
86          assertEquals( TypeClass.APPLICATION, outter.typeClass ) ;
87          assertEquals( BERDecoderState.LENGTH, decoder.getState() ) ;
88  
89          // decode length
90          outter = decode( "10000000" ) ;
91          assertEquals( BERDecoderState.TAG, decoder.getState() ) ;
92  
93  
94          // --------------------------------------------------------------------
95  
96  
97          // decode tag
98          Tuple tlv = decode( "01000001" ) ;
99          assertEquals( 1, tlv.id ) ;
100         assertEquals( 0, tlvList.size() ) ;
101         assertEquals( true, tlv.isPrimitive ) ;
102         assertEquals( TypeClass.APPLICATION, tlv.typeClass ) ;
103         assertEquals( BERDecoderState.LENGTH, decoder.getState() ) ;
104 
105         // decode length
106         tlv = decode( "00000001" ) ;
107         assertEquals( BERDecoderState.VALUE, decoder.getState() ) ;
108         assertEquals( 1, tlv.length ) ;
109         assertEquals( 0, tlvList.size() ) ;
110 
111         // decode value
112         tlv = decode( "01010101" ) ;
113         assertEquals( BERDecoderState.TAG, decoder.getState() ) ;
114         assertEquals( 1, tlvList.size() ) ;
115         assertNotNull( tlv.valueChunk ) ;
116         assertEquals( 0x0055, 0x00ff & tlv.valueChunk.get( 0 ) ) ;
117 
118 
119         // --------------------------------------------------------------------
120 
121 
122         // decode tag
123         tlv = decode( "01000001" ) ;
124         assertEquals( 1, tlv.id ) ;
125         assertEquals( 1, tlvList.size() ) ;
126         assertEquals( true, tlv.isPrimitive ) ;
127         assertEquals( TypeClass.APPLICATION, tlv.typeClass ) ;
128         assertEquals( BERDecoderState.LENGTH, decoder.getState() ) ;
129 
130         // decode length
131         tlv = decode( "00000001" ) ;
132         assertEquals( BERDecoderState.VALUE, decoder.getState() ) ;
133         assertEquals( 1, tlv.length ) ;
134 
135         // decode value
136         tlv = decode( "01010101" ) ;
137         assertEquals( BERDecoderState.TAG, decoder.getState() ) ;
138         assertEquals( 2, tlvList.size() ) ;
139         assertNotNull( tlv.valueChunk ) ;
140         assertEquals( 0x0055, 0x00ff & tlv.valueChunk.get( 0 ) ) ;
141 
142 
143         // --------------------------------------------------------------------
144 
145 
146         // decode tag
147         tlv = decode( "01000001" ) ;
148         assertEquals( 1, tlv.id ) ;
149         assertEquals( 2, tlvList.size() ) ;
150         assertEquals( true, tlv.isPrimitive ) ;
151         assertEquals( TypeClass.APPLICATION, tlv.typeClass ) ;
152         assertEquals( BERDecoderState.LENGTH, decoder.getState() ) ;
153 
154         // decode length
155         tlv = decode( "00000001" ) ;
156         assertEquals( BERDecoderState.VALUE, decoder.getState() ) ;
157         assertEquals( 1, tlv.length ) ;
158 
159         // decode value
160         tlv = decode( "01010101" ) ;
161         assertEquals( BERDecoderState.TAG, decoder.getState() ) ;
162         assertEquals( 3, tlvList.size() ) ;
163         assertNotNull( tlv.valueChunk ) ;
164         assertEquals( 0x0055, 0x00ff & tlv.valueChunk.get( 0 ) ) ;
165 
166         decode( "00000000" ) ;
167         decode( "00000000" ) ;
168 
169         assertEquals( 4, tlvList.size() ) ;
170         assertEquals( BERDecoderState.TAG, decoder.getState() ) ;
171     }
172 
173 
174     public void testIllegalState() throws Exception
175     {
176         try
177         {
178             decode( "00000000" ) ;
179             decode( "00000000" ) ;
180             fail( "should throw an exception before getting here" ) ;
181         }
182         catch( Throwable e )
183         {
184             assertNotNull( e ) ;
185         }
186     }
187 
188 
189     public void testIllegalStateNoMonitor() throws Exception
190     {
191         decoder.setDecoderMonitor( null ) ;
192 
193         try
194         {
195             decode( "00000000" ) ;
196             decode( "00000000" ) ;
197             fail( "should throw an exception before getting here" ) ;
198         }
199         catch( Throwable e )
200         {
201             assertNotNull( e ) ;
202         }
203     }
204 }