1/*
2 * Copyright (C) 2010 The Android Open Source Project
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
17package com.android.internal.telephony;
18
19import com.android.internal.telephony.WspTypeDecoder;
20import com.android.internal.util.HexDump;
21
22import java.io.ByteArrayOutputStream;
23import java.util.HashMap;
24import java.util.Map;
25
26import junit.framework.TestCase;
27
28public class Wap230WspContentTypeTest extends TestCase {
29
30    public static final Map<Integer, String> WELL_KNOWN_SHORT_MIME_TYPES
31            = new HashMap<Integer, String>();
32    public static final Map<Integer, String> WELL_KNOWN_LONG_MIME_TYPES
33            = new HashMap<Integer, String>();
34    public static final Map<Integer, String> WELL_KNOWN_PARAMETERS
35            = new HashMap<Integer, String>();
36
37    static {
38        WELL_KNOWN_SHORT_MIME_TYPES.put(0x00, "*/*");
39        WELL_KNOWN_SHORT_MIME_TYPES.put(0x01, "text/*");
40        WELL_KNOWN_SHORT_MIME_TYPES.put(0x02, "text/html");
41        WELL_KNOWN_SHORT_MIME_TYPES.put(0x03, "text/plain");
42        WELL_KNOWN_SHORT_MIME_TYPES.put(0x04, "text/x-hdml");
43        WELL_KNOWN_SHORT_MIME_TYPES.put(0x05, "text/x-ttml");
44        WELL_KNOWN_SHORT_MIME_TYPES.put(0x06, "text/x-vCalendar");
45        WELL_KNOWN_SHORT_MIME_TYPES.put(0x07, "text/x-vCard");
46        WELL_KNOWN_SHORT_MIME_TYPES.put(0x08, "text/vnd.wap.wml");
47        WELL_KNOWN_SHORT_MIME_TYPES.put(0x09, "text/vnd.wap.wmlscript");
48        WELL_KNOWN_SHORT_MIME_TYPES.put(0x0A, "text/vnd.wap.wta-event");
49        WELL_KNOWN_SHORT_MIME_TYPES.put(0x0B, "multipart/*");
50        WELL_KNOWN_SHORT_MIME_TYPES.put(0x0C, "multipart/mixed");
51        WELL_KNOWN_SHORT_MIME_TYPES.put(0x0D, "multipart/form-data");
52        WELL_KNOWN_SHORT_MIME_TYPES.put(0x0E, "multipart/byterantes");
53        WELL_KNOWN_SHORT_MIME_TYPES.put(0x0F, "multipart/alternative");
54        WELL_KNOWN_SHORT_MIME_TYPES.put(0x10, "application/*");
55        WELL_KNOWN_SHORT_MIME_TYPES.put(0x11, "application/java-vm");
56        WELL_KNOWN_SHORT_MIME_TYPES.put(0x12, "application/x-www-form-urlencoded");
57        WELL_KNOWN_SHORT_MIME_TYPES.put(0x13, "application/x-hdmlc");
58        WELL_KNOWN_SHORT_MIME_TYPES.put(0x14, "application/vnd.wap.wmlc");
59        WELL_KNOWN_SHORT_MIME_TYPES.put(0x15, "application/vnd.wap.wmlscriptc");
60        WELL_KNOWN_SHORT_MIME_TYPES.put(0x16, "application/vnd.wap.wta-eventc");
61        WELL_KNOWN_SHORT_MIME_TYPES.put(0x17, "application/vnd.wap.uaprof");
62        WELL_KNOWN_SHORT_MIME_TYPES.put(0x18, "application/vnd.wap.wtls-ca-certificate");
63        WELL_KNOWN_SHORT_MIME_TYPES.put(0x19, "application/vnd.wap.wtls-user-certificate");
64        WELL_KNOWN_SHORT_MIME_TYPES.put(0x1A, "application/x-x509-ca-cert");
65        WELL_KNOWN_SHORT_MIME_TYPES.put(0x1B, "application/x-x509-user-cert");
66        WELL_KNOWN_SHORT_MIME_TYPES.put(0x1C, "image/*");
67        WELL_KNOWN_SHORT_MIME_TYPES.put(0x1D, "image/gif");
68        WELL_KNOWN_SHORT_MIME_TYPES.put(0x1E, "image/jpeg");
69        WELL_KNOWN_SHORT_MIME_TYPES.put(0x1F, "image/tiff");
70        WELL_KNOWN_SHORT_MIME_TYPES.put(0x20, "image/png");
71        WELL_KNOWN_SHORT_MIME_TYPES.put(0x21, "image/vnd.wap.wbmp");
72        WELL_KNOWN_SHORT_MIME_TYPES.put(0x22, "application/vnd.wap.multipart.*");
73        WELL_KNOWN_SHORT_MIME_TYPES.put(0x23, "application/vnd.wap.multipart.mixed");
74        WELL_KNOWN_SHORT_MIME_TYPES.put(0x24, "application/vnd.wap.multipart.form-data");
75        WELL_KNOWN_SHORT_MIME_TYPES.put(0x25, "application/vnd.wap.multipart.byteranges");
76        WELL_KNOWN_SHORT_MIME_TYPES.put(0x26, "application/vnd.wap.multipart.alternative");
77        WELL_KNOWN_SHORT_MIME_TYPES.put(0x27, "application/xml");
78        WELL_KNOWN_SHORT_MIME_TYPES.put(0x28, "text/xml");
79        WELL_KNOWN_SHORT_MIME_TYPES.put(0x29, "application/vnd.wap.wbxml");
80        WELL_KNOWN_SHORT_MIME_TYPES.put(0x2A, "application/x-x968-cross-cert");
81        WELL_KNOWN_SHORT_MIME_TYPES.put(0x2B, "application/x-x968-ca-cert");
82        WELL_KNOWN_SHORT_MIME_TYPES.put(0x2C, "application/x-x968-user-cert");
83        WELL_KNOWN_SHORT_MIME_TYPES.put(0x2D, "text/vnd.wap.si");
84        WELL_KNOWN_SHORT_MIME_TYPES.put(0x2E, "application/vnd.wap.sic");
85        WELL_KNOWN_SHORT_MIME_TYPES.put(0x2F, "text/vnd.wap.sl");
86        WELL_KNOWN_SHORT_MIME_TYPES.put(0x30, "application/vnd.wap.slc");
87        WELL_KNOWN_SHORT_MIME_TYPES.put(0x31, "text/vnd.wap.co");
88        WELL_KNOWN_SHORT_MIME_TYPES.put(0x32, "application/vnd.wap.coc");
89        WELL_KNOWN_SHORT_MIME_TYPES.put(0x33, "application/vnd.wap.multipart.related");
90        WELL_KNOWN_SHORT_MIME_TYPES.put(0x34, "application/vnd.wap.sia");
91        WELL_KNOWN_SHORT_MIME_TYPES.put(0x35, "text/vnd.wap.connectivity-xml");
92        WELL_KNOWN_SHORT_MIME_TYPES.put(0x36, "application/vnd.wap.connectivity-wbxml");
93        WELL_KNOWN_SHORT_MIME_TYPES.put(0x37, "application/pkcs7-mime");
94        WELL_KNOWN_SHORT_MIME_TYPES.put(0x38, "application/vnd.wap.hashed-certificate");
95        WELL_KNOWN_SHORT_MIME_TYPES.put(0x39, "application/vnd.wap.signed-certificate");
96        WELL_KNOWN_SHORT_MIME_TYPES.put(0x3A, "application/vnd.wap.cert-response");
97        WELL_KNOWN_SHORT_MIME_TYPES.put(0x3B, "application/xhtml+xml");
98        WELL_KNOWN_SHORT_MIME_TYPES.put(0x3C, "application/wml+xml");
99        WELL_KNOWN_SHORT_MIME_TYPES.put(0x3D, "text/css");
100        WELL_KNOWN_SHORT_MIME_TYPES.put(0x3E, "application/vnd.wap.mms-message");
101        WELL_KNOWN_SHORT_MIME_TYPES.put(0x3F, "application/vnd.wap.rollover-certificate");
102        WELL_KNOWN_SHORT_MIME_TYPES.put(0x40, "application/vnd.wap.locc+wbxml");
103        WELL_KNOWN_SHORT_MIME_TYPES.put(0x41, "application/vnd.wap.loc+xml");
104        WELL_KNOWN_SHORT_MIME_TYPES.put(0x42, "application/vnd.syncml.dm+wbxml");
105        WELL_KNOWN_SHORT_MIME_TYPES.put(0x43, "application/vnd.syncml.dm+xml");
106        WELL_KNOWN_SHORT_MIME_TYPES.put(0x44, "application/vnd.syncml.notification");
107        WELL_KNOWN_SHORT_MIME_TYPES.put(0x45, "application/vnd.wap.xhtml+xml");
108        WELL_KNOWN_SHORT_MIME_TYPES.put(0x46, "application/vnd.wv.csp.cir");
109        WELL_KNOWN_SHORT_MIME_TYPES.put(0x47, "application/vnd.oma.dd+xml");
110        WELL_KNOWN_SHORT_MIME_TYPES.put(0x48, "application/vnd.oma.drm.message");
111        WELL_KNOWN_SHORT_MIME_TYPES.put(0x49, "application/vnd.oma.drm.content");
112        WELL_KNOWN_SHORT_MIME_TYPES.put(0x4A, "application/vnd.oma.drm.rights+xml");
113        WELL_KNOWN_SHORT_MIME_TYPES.put(0x4B, "application/vnd.oma.drm.rights+wbxml");
114        WELL_KNOWN_SHORT_MIME_TYPES.put(0x4C, "application/vnd.wv.csp+xml");
115        WELL_KNOWN_SHORT_MIME_TYPES.put(0x4D, "application/vnd.wv.csp+wbxml");
116        WELL_KNOWN_SHORT_MIME_TYPES.put(0x4E, "application/vnd.syncml.ds.notification");
117        WELL_KNOWN_SHORT_MIME_TYPES.put(0x4F, "audio/*");
118        WELL_KNOWN_SHORT_MIME_TYPES.put(0x50, "video/*");
119        WELL_KNOWN_SHORT_MIME_TYPES.put(0x51, "application/vnd.oma.dd2+xml");
120        WELL_KNOWN_SHORT_MIME_TYPES.put(0x52, "application/mikey");
121        WELL_KNOWN_SHORT_MIME_TYPES.put(0x53, "application/vnd.oma.dcd");
122        WELL_KNOWN_SHORT_MIME_TYPES.put(0x54, "application/vnd.oma.dcdc");
123
124        WELL_KNOWN_LONG_MIME_TYPES.put(0x0201, "application/vnd.uplanet.cacheop-wbxml");
125        WELL_KNOWN_LONG_MIME_TYPES.put(0x0202, "application/vnd.uplanet.signal");
126        WELL_KNOWN_LONG_MIME_TYPES.put(0x0203, "application/vnd.uplanet.alert-wbxml");
127        WELL_KNOWN_LONG_MIME_TYPES.put(0x0204, "application/vnd.uplanet.list-wbxml");
128        WELL_KNOWN_LONG_MIME_TYPES.put(0x0205, "application/vnd.uplanet.listcmd-wbxml");
129        WELL_KNOWN_LONG_MIME_TYPES.put(0x0206, "application/vnd.uplanet.channel-wbxml");
130        WELL_KNOWN_LONG_MIME_TYPES.put(0x0207, "application/vnd.uplanet.provisioning-status-uri");
131        WELL_KNOWN_LONG_MIME_TYPES.put(0x0208, "x-wap.multipart/vnd.uplanet.header-set");
132        WELL_KNOWN_LONG_MIME_TYPES.put(0x0209, "application/vnd.uplanet.bearer-choice-wbxml");
133        WELL_KNOWN_LONG_MIME_TYPES.put(0x020A, "application/vnd.phonecom.mmc-wbxml");
134        WELL_KNOWN_LONG_MIME_TYPES.put(0x020B, "application/vnd.nokia.syncset+wbxml");
135        WELL_KNOWN_LONG_MIME_TYPES.put(0x020C, "image/x-up-wpng");
136        WELL_KNOWN_LONG_MIME_TYPES.put(0x0300, "application/iota.mmc-wbxml");
137        WELL_KNOWN_LONG_MIME_TYPES.put(0x0301, "application/iota.mmc-xml");
138        WELL_KNOWN_LONG_MIME_TYPES.put(0x0302, "application/vnd.syncml+xml");
139        WELL_KNOWN_LONG_MIME_TYPES.put(0x0303, "application/vnd.syncml+wbxml");
140        WELL_KNOWN_LONG_MIME_TYPES.put(0x0304, "text/vnd.wap.emn+xml");
141        WELL_KNOWN_LONG_MIME_TYPES.put(0x0305, "text/calendar");
142        WELL_KNOWN_LONG_MIME_TYPES.put(0x0306, "application/vnd.omads-email+xml");
143        WELL_KNOWN_LONG_MIME_TYPES.put(0x0307, "application/vnd.omads-file+xml");
144        WELL_KNOWN_LONG_MIME_TYPES.put(0x0308, "application/vnd.omads-folder+xml");
145        WELL_KNOWN_LONG_MIME_TYPES.put(0x0309, "text/directory;profile=vCard");
146        WELL_KNOWN_LONG_MIME_TYPES.put(0x030A, "application/vnd.wap.emn+wbxml");
147        WELL_KNOWN_LONG_MIME_TYPES.put(0x030B, "application/vnd.nokia.ipdc-purchase-response");
148        WELL_KNOWN_LONG_MIME_TYPES.put(0x030C, "application/vnd.motorola.screen3+xml");
149        WELL_KNOWN_LONG_MIME_TYPES.put(0x030D, "application/vnd.motorola.screen3+gzip");
150        WELL_KNOWN_LONG_MIME_TYPES.put(0x030E, "application/vnd.cmcc.setting+wbxml");
151        WELL_KNOWN_LONG_MIME_TYPES.put(0x030F, "application/vnd.cmcc.bombing+wbxml");
152        WELL_KNOWN_LONG_MIME_TYPES.put(0x0310, "application/vnd.docomo.pf");
153        WELL_KNOWN_LONG_MIME_TYPES.put(0x0311, "application/vnd.docomo.ub");
154        WELL_KNOWN_LONG_MIME_TYPES.put(0x0312, "application/vnd.omaloc-supl-init");
155        WELL_KNOWN_LONG_MIME_TYPES.put(0x0313, "application/vnd.oma.group-usage-list+xml");
156        WELL_KNOWN_LONG_MIME_TYPES.put(0x0314, "application/oma-directory+xml");
157        WELL_KNOWN_LONG_MIME_TYPES.put(0x0315, "application/vnd.docomo.pf2");
158        WELL_KNOWN_LONG_MIME_TYPES.put(0x0316, "application/vnd.oma.drm.roap-trigger+wbxml");
159        WELL_KNOWN_LONG_MIME_TYPES.put(0x0317, "application/vnd.sbm.mid2");
160        WELL_KNOWN_LONG_MIME_TYPES.put(0x0318, "application/vnd.wmf.bootstrap");
161        WELL_KNOWN_LONG_MIME_TYPES.put(0x0319, "application/vnc.cmcc.dcd+xml");
162        WELL_KNOWN_LONG_MIME_TYPES.put(0x031A, "application/vnd.sbm.cid");
163        WELL_KNOWN_LONG_MIME_TYPES.put(0x031B, "application/vnd.oma.bcast.provisioningtrigger");
164
165        WELL_KNOWN_PARAMETERS.put(0x00, "Q");
166        WELL_KNOWN_PARAMETERS.put(0x01, "Charset");
167        WELL_KNOWN_PARAMETERS.put(0x02, "Level");
168        WELL_KNOWN_PARAMETERS.put(0x03, "Type");
169        WELL_KNOWN_PARAMETERS.put(0x07, "Differences");
170        WELL_KNOWN_PARAMETERS.put(0x08, "Padding");
171        WELL_KNOWN_PARAMETERS.put(0x09, "Type");
172        WELL_KNOWN_PARAMETERS.put(0x0E, "Max-Age");
173        WELL_KNOWN_PARAMETERS.put(0x10, "Secure");
174        WELL_KNOWN_PARAMETERS.put(0x11, "SEC");
175        WELL_KNOWN_PARAMETERS.put(0x12, "MAC");
176        WELL_KNOWN_PARAMETERS.put(0x13, "Creation-date");
177        WELL_KNOWN_PARAMETERS.put(0x14, "Modification-date");
178        WELL_KNOWN_PARAMETERS.put(0x15, "Read-date");
179        WELL_KNOWN_PARAMETERS.put(0x16, "Size");
180        WELL_KNOWN_PARAMETERS.put(0x17, "Name");
181        WELL_KNOWN_PARAMETERS.put(0x18, "Filename");
182        WELL_KNOWN_PARAMETERS.put(0x19, "Start");
183        WELL_KNOWN_PARAMETERS.put(0x1A, "Start-info");
184        WELL_KNOWN_PARAMETERS.put(0x1B, "Comment");
185        WELL_KNOWN_PARAMETERS.put(0x1C, "Domain");
186        WELL_KNOWN_PARAMETERS.put(0x1D, "Path");
187
188    }
189
190    final int WSP_DEFINED_SHORT_MIME_TYPE_COUNT = 85;
191    final int WSP_DEFINED_LONG_MIME_TYPE_COUNT = 40;
192
193    private static final byte WSP_STRING_TERMINATOR = 0x00;
194    private static final byte WSP_SHORT_INTEGER_MASK = (byte) 0x80;
195    private static final byte WSP_LENGTH_QUOTE = 0x1F;
196    private static final byte WSP_QUOTE = 0x22;
197
198    private static final short LONG_MIME_TYPE_OMA_DIRECTORY_XML = 0x0314;
199    private static final short LONG_MIME_TYPE_UNASSIGNED = 0x052C;
200
201    private static final byte SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE = 0x3F;
202    private static final byte SHORT_MIME_TYPE_UNASSIGNED = 0x60;
203
204    private static final String STRING_MIME_TYPE_ROLLOVER_CERTIFICATE
205            = "application/vnd.wap.rollover-certificate";
206
207    private static final byte TYPED_PARAM_Q = 0x00;
208    private static final byte TYPED_PARAM_DOMAIN = 0x1C;
209    private static final byte PARAM_UNASSIGNED = 0x42;
210    private static final byte PARAM_NO_VALUE = 0x00;
211    private static final byte TYPED_PARAM_SEC = 0x11;
212    private static final byte TYPED_PARAM_MAC = 0x12;
213
214    public void testHasExpectedNumberOfShortMimeTypes() {
215        assertEquals(WSP_DEFINED_SHORT_MIME_TYPE_COUNT, WELL_KNOWN_SHORT_MIME_TYPES.size());
216    }
217
218    public void testHasExpectedNumberOfLongMimeTypes() {
219        assertEquals(WSP_DEFINED_LONG_MIME_TYPE_COUNT, WELL_KNOWN_LONG_MIME_TYPES.size());
220    }
221
222    public void testWellKnownShortIntegerMimeTypeValues() {
223
224        for (int value : Wap230WspContentTypeTest.WELL_KNOWN_SHORT_MIME_TYPES.keySet()) {
225            WspTypeDecoder unit = new WspTypeDecoder(
226                    HexDump.toByteArray((byte) (value | WSP_SHORT_INTEGER_MASK)));
227            assertTrue(unit.decodeContentType(0));
228            String mimeType = unit.getValueString();
229            int wellKnownValue = (int) unit.getValue32();
230            assertEquals(Wap230WspContentTypeTest.WELL_KNOWN_SHORT_MIME_TYPES.get(value), mimeType);
231            assertEquals(value, wellKnownValue);
232            assertEquals(1, unit.getDecodedDataLength());
233        }
234    }
235
236    public void testWellKnownLongIntegerMimeTypeValues() {
237        byte headerLength = 3;
238        byte typeLength = 2;
239        for (int value : Wap230WspContentTypeTest.WELL_KNOWN_SHORT_MIME_TYPES.keySet()) {
240            byte[] data = new byte[10];
241            data[0] = headerLength;
242            data[1] = typeLength;
243            data[2] = (byte) (value >> 8);
244            data[3] = (byte) (value & 0xFF);
245            WspTypeDecoder unit = new WspTypeDecoder(data);
246            assertTrue(unit.decodeContentType(0));
247            String mimeType = unit.getValueString();
248            int wellKnownValue = (int) unit.getValue32();
249            assertEquals(Wap230WspContentTypeTest.WELL_KNOWN_SHORT_MIME_TYPES.get(value), mimeType);
250            assertEquals(value, wellKnownValue);
251            assertEquals(4, unit.getDecodedDataLength());
252        }
253    }
254
255    public void testDecodeReturnsFalse_WhenOnlyAZeroBytePresent() {
256
257        ByteArrayOutputStream out = new ByteArrayOutputStream();
258        out.write(0x00);
259        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
260        assertFalse(unit.decodeContentType(0));
261    }
262
263    public void testConstrainedMediaExtensionMedia() throws Exception {
264
265        String testType = "application/wibble";
266        ByteArrayOutputStream out = new ByteArrayOutputStream();
267        out.write(testType.getBytes("US-ASCII"));
268        out.write(WSP_STRING_TERMINATOR);
269
270        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
271        assertTrue(unit.decodeContentType(0));
272        String mimeType = unit.getValueString();
273        assertEquals(testType, mimeType);
274        assertEquals(-1, unit.getValue32());
275        assertEquals(19, unit.getDecodedDataLength());
276    }
277
278    public void testGeneralFormShortLengthExtensionMedia() throws Exception {
279
280        String testType = "12345678901234567890123456789";
281        ByteArrayOutputStream out = new ByteArrayOutputStream();
282        out.write(testType.length() + 1);
283        out.write(testType.getBytes("US-ASCII"));
284        out.write(WSP_STRING_TERMINATOR);
285
286        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
287        assertTrue(unit.decodeContentType(0));
288
289        String mimeType = unit.getValueString();
290        assertEquals(testType, mimeType);
291        assertEquals(-1, unit.getValue32());
292        assertEquals(31, unit.getDecodedDataLength());
293    }
294
295    public void testGeneralFormShortLengthWellKnownShortInteger()  {
296
297        ByteArrayOutputStream out = new ByteArrayOutputStream();
298        out.write(0x01);
299        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
300
301        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
302        assertTrue(unit.decodeContentType(0));
303
304        String mimeType = unit.getValueString();
305        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
306        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
307        assertEquals(2, unit.getDecodedDataLength());
308
309    }
310
311    public void testGeneralFormShortLengthWellKnownShortIntegerWithUnknownValue()  {
312
313        ByteArrayOutputStream out = new ByteArrayOutputStream();
314        out.write(0x01);
315        out.write(SHORT_MIME_TYPE_UNASSIGNED | WSP_SHORT_INTEGER_MASK);
316
317        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
318        assertTrue(unit.decodeContentType(0));
319
320        String mimeType = unit.getValueString();
321        assertNull(mimeType);
322        assertEquals(SHORT_MIME_TYPE_UNASSIGNED, unit.getValue32());
323        assertEquals(2, unit.getDecodedDataLength());
324
325    }
326
327    public void testGeneralFormShortLengthWellKnownLongInteger()  {
328
329        ByteArrayOutputStream out = new ByteArrayOutputStream();
330
331        out.write(0x03); // header length
332        out.write(0x02); // type length (2 octets)
333        out.write(LONG_MIME_TYPE_OMA_DIRECTORY_XML >> 8);
334        out.write(LONG_MIME_TYPE_OMA_DIRECTORY_XML & 0xFF);
335
336        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
337        assertTrue(unit.decodeContentType(0));
338
339        String mimeType = unit.getValueString();
340
341        assertEquals("application/oma-directory+xml", mimeType);
342        assertEquals(LONG_MIME_TYPE_OMA_DIRECTORY_XML, unit.getValue32());
343        assertEquals(4, unit.getDecodedDataLength());
344    }
345
346    public void testGeneralFormShortLengthWellKnownLongIntegerWithUnknownValue()  {
347
348        ByteArrayOutputStream out = new ByteArrayOutputStream();
349
350        out.write(0x03); // Value-length, short-length
351        out.write(0x02); // long-integer length (2 octets)
352        out.write(LONG_MIME_TYPE_UNASSIGNED >> 8);
353        out.write(LONG_MIME_TYPE_UNASSIGNED & 0xFF);
354
355        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
356        assertTrue(unit.decodeContentType(0));
357
358        String mimeType = unit.getValueString();
359
360        assertNull(mimeType);
361        assertEquals(LONG_MIME_TYPE_UNASSIGNED, unit.getValue32());
362        assertEquals(4, unit.getDecodedDataLength());
363
364    }
365
366    public void testGeneralFormLengthQuoteWellKnownShortInteger()  {
367
368        ByteArrayOutputStream out = new ByteArrayOutputStream();
369
370        out.write(WSP_LENGTH_QUOTE);
371        out.write(0x01); // Length as UINTVAR
372        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
373
374        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
375        assertTrue(unit.decodeContentType(0));
376
377        String mimeType = unit.getValueString();
378        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
379        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
380        assertEquals(3, unit.getDecodedDataLength());
381
382    }
383
384    public void testGeneralFormLengthQuoteWellKnownShortIntegerWithUnknownValue()  {
385
386        ByteArrayOutputStream out = new ByteArrayOutputStream();
387
388        out.write(WSP_LENGTH_QUOTE);
389        out.write(0x01); // Length as UINTVAR
390        out.write(SHORT_MIME_TYPE_UNASSIGNED | WSP_SHORT_INTEGER_MASK);
391
392        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
393        assertTrue(unit.decodeContentType(0));
394
395        String mimeType = unit.getValueString();
396        assertNull(mimeType);
397        assertEquals(SHORT_MIME_TYPE_UNASSIGNED, unit.getValue32());
398        assertEquals(3, unit.getDecodedDataLength());
399    }
400
401    public void testGeneralFormLengthQuoteWellKnownLongInteger()  {
402
403        ByteArrayOutputStream out = new ByteArrayOutputStream();
404
405        out.write(WSP_LENGTH_QUOTE);
406        out.write(0x03); // Length as UINTVAR
407        out.write(0x02); // long-integer length (2 octets)
408        out.write(LONG_MIME_TYPE_OMA_DIRECTORY_XML >> 8);
409        out.write(LONG_MIME_TYPE_OMA_DIRECTORY_XML & 0xFF);
410
411        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
412        assertTrue(unit.decodeContentType(0));
413
414        String mimeType = unit.getValueString();
415
416        assertEquals("application/oma-directory+xml", mimeType);
417        assertEquals(LONG_MIME_TYPE_OMA_DIRECTORY_XML, unit.getValue32());
418        assertEquals(5, unit.getDecodedDataLength());
419
420    }
421
422    public void testGeneralFormLengthQuoteWellKnownLongIntegerWithUnknownValue()  {
423
424        ByteArrayOutputStream out = new ByteArrayOutputStream();
425
426        out.write(WSP_LENGTH_QUOTE);
427        out.write(0x03); // Length as UINTVAR
428        out.write(0x02); // long-integer length (2 octets)
429        out.write(LONG_MIME_TYPE_UNASSIGNED >> 8);
430        out.write(LONG_MIME_TYPE_UNASSIGNED & 0xFF);
431
432        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
433        assertTrue(unit.decodeContentType(0));
434
435        String mimeType = unit.getValueString();
436
437        assertNull(mimeType);
438        assertEquals(LONG_MIME_TYPE_UNASSIGNED, unit.getValue32());
439        assertEquals(5, unit.getDecodedDataLength());
440
441    }
442
443    public void testGeneralFormLengthQuoteExtensionMedia() throws Exception {
444
445        String testType = "application/wibble";
446        ByteArrayOutputStream out = new ByteArrayOutputStream();
447
448        out.write(WSP_LENGTH_QUOTE);
449        out.write(testType.length() + 1); // Length as UINTVAR
450
451        out.write(testType.getBytes("US-ASCII"));
452        out.write(WSP_STRING_TERMINATOR);
453
454        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
455        assertTrue(unit.decodeContentType(0));
456
457        String mimeType = unit.getValueString();
458
459        assertEquals(testType, mimeType);
460        assertEquals(-1, unit.getValue32());
461        assertEquals(21, unit.getDecodedDataLength());
462
463    }
464
465    public void testGeneralFormLengthQuoteExtensionMediaWithNiceLongMimeType() throws Exception {
466
467        String testType =
468                "01234567890123456789012345678901234567890123456789012345678901234567890123456789"
469                +"01234567890123456789012345678901234567890123456789012345678901234567890123456789";
470        ByteArrayOutputStream out = new ByteArrayOutputStream();
471
472        out.write(WSP_LENGTH_QUOTE);
473        out.write(0x81); // Length as UINTVAR (161 decimal, 0xA1), 2 bytes
474        out.write(0x21);
475
476        out.write(testType.getBytes("US-ASCII"));
477        out.write(WSP_STRING_TERMINATOR);
478
479        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
480        assertTrue(unit.decodeContentType(0));
481
482        String mimeType = unit.getValueString();
483
484        assertEquals(testType, mimeType);
485        assertEquals(-1, unit.getValue32());
486        assertEquals(164, unit.getDecodedDataLength());
487
488    }
489
490    public void testConstrainedMediaExtensionMediaWithSpace() throws Exception {
491
492        String testType = " application/wibble";
493        ByteArrayOutputStream out = new ByteArrayOutputStream();
494        out.write(testType.getBytes("US-ASCII"));
495        out.write(WSP_STRING_TERMINATOR);
496
497        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
498        assertTrue(unit.decodeContentType(0));
499
500        String mimeType = unit.getValueString();
501
502        assertEquals(testType, mimeType);
503        assertEquals(-1, unit.getValue32());
504        assertEquals(20, unit.getDecodedDataLength());
505
506    }
507
508    public void testTypedParamWellKnownShortIntegerNoValue()  {
509
510        ByteArrayOutputStream out = new ByteArrayOutputStream();
511        out.write(0x03); // Value-length, short-length
512        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
513        out.write(TYPED_PARAM_DOMAIN | WSP_SHORT_INTEGER_MASK);
514        out.write(PARAM_NO_VALUE);
515
516        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
517        assertTrue(unit.decodeContentType(0));
518
519        String mimeType = unit.getValueString();
520
521        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
522        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
523
524        assertEquals(4, unit.getDecodedDataLength());
525
526        Map<String, String> params = unit.getContentParameters();
527        assertEquals(null, params.get("Domain"));
528
529    }
530
531    public void testTypedParamWellKnownShortIntegerTokenText() throws Exception {
532
533        ByteArrayOutputStream out = new ByteArrayOutputStream();
534        out.write(0x14); // Value-length, short-length
535        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
536        out.write(TYPED_PARAM_DOMAIN | WSP_SHORT_INTEGER_MASK);
537        out.write("wdstechnology.com".getBytes("US-ASCII"));
538        out.write(WSP_STRING_TERMINATOR);
539
540        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
541        assertTrue(unit.decodeContentType(0));
542
543        String mimeType = unit.getValueString();
544
545        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
546        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
547
548        assertEquals(out.toByteArray().length, unit.getDecodedDataLength());
549
550        Map<String, String> params = unit.getContentParameters();
551        assertEquals("wdstechnology.com", params.get("Domain"));
552
553    }
554
555    public void testTypedParamWellKnownLongIntegerTokenText() throws Exception {
556
557        ByteArrayOutputStream out = new ByteArrayOutputStream();
558        out.write(0x15);
559        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
560        out.write(0x01);
561        out.write(TYPED_PARAM_DOMAIN);
562        out.write("wdstechnology.com".getBytes("US-ASCII"));
563        out.write(WSP_STRING_TERMINATOR);
564
565        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
566        assertTrue(unit.decodeContentType(0));
567
568        String mimeType = unit.getValueString();
569
570        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
571        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
572
573        assertEquals(22, unit.getDecodedDataLength());
574
575        Map<String, String> params = unit.getContentParameters();
576        assertEquals("wdstechnology.com", params.get("Domain"));
577
578    }
579
580    public void testTypedParamWellKnownShortIntegerQuotedText() throws Exception {
581
582        ByteArrayOutputStream out = new ByteArrayOutputStream();
583        out.write(0x15);
584        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
585        out.write(TYPED_PARAM_DOMAIN | WSP_SHORT_INTEGER_MASK);
586        out.write(WSP_QUOTE);
587        out.write("wdstechnology.com".getBytes("US-ASCII"));
588        out.write(WSP_STRING_TERMINATOR);
589
590        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
591        assertTrue(unit.decodeContentType(0));
592
593        String mimeType = unit.getValueString();
594
595        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
596        assertEquals(0x3F, unit.getValue32());
597        assertEquals(22, unit.getDecodedDataLength());
598
599        Map<String, String> params = unit.getContentParameters();
600        assertEquals("wdstechnology.com", params.get("Domain"));
601
602    }
603
604    public void testTypedParamWellKnownShortIntegerCompactIntegerValue()  {
605
606        ByteArrayOutputStream out = new ByteArrayOutputStream();
607        out.write(0x3);
608        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
609        out.write(TYPED_PARAM_SEC | WSP_SHORT_INTEGER_MASK);
610        out.write(0x01 | WSP_SHORT_INTEGER_MASK);
611
612        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
613        assertTrue(unit.decodeContentType(0));
614
615        String mimeType = unit.getValueString();
616
617        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
618        assertEquals(0x3F, unit.getValue32());
619        assertEquals(4, unit.getDecodedDataLength());
620
621        Map<String, String> params = unit.getContentParameters();
622        assertEquals("1", params.get("SEC"));
623
624    }
625
626    public void testTypedParamWellKnownShortIntegerCompactIntegerValue_0() {
627        ByteArrayOutputStream out = new ByteArrayOutputStream();
628        out.write(0x3);
629        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
630        out.write(TYPED_PARAM_SEC | WSP_SHORT_INTEGER_MASK);
631        out.write(0x00 | WSP_SHORT_INTEGER_MASK);
632
633        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
634        assertTrue(unit.decodeContentType(0));
635
636        String mimeType = unit.getValueString();
637
638        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
639        assertEquals(0x3F, unit.getValue32());
640        assertEquals(4, unit.getDecodedDataLength());
641
642        Map<String, String> params = unit.getContentParameters();
643        assertEquals("0", params.get("SEC"));
644    }
645
646    public void testTypedParamWellKnownShortIntegerMultipleParameters() throws Exception {
647
648        ByteArrayOutputStream out = new ByteArrayOutputStream();
649        out.write(0x0B);
650        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
651        out.write(TYPED_PARAM_SEC | WSP_SHORT_INTEGER_MASK);
652        out.write(0x01 | WSP_SHORT_INTEGER_MASK);
653        out.write(TYPED_PARAM_MAC | WSP_SHORT_INTEGER_MASK);
654        out.write(WSP_QUOTE);
655        out.write("imapc".getBytes("US-ASCII"));
656        out.write(WSP_STRING_TERMINATOR);
657
658        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
659        assertTrue(unit.decodeContentType(0));
660
661        String mimeType = unit.getValueString();
662
663        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
664        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
665        assertEquals(12, unit.getDecodedDataLength());
666
667        Map<String, String> params = unit.getContentParameters();
668        assertEquals("1", params.get("SEC"));
669        assertEquals("imapc", params.get("MAC"));
670    }
671
672    public void testUntypedParamIntegerValueShortInteger() throws Exception {
673        ByteArrayOutputStream out = new ByteArrayOutputStream();
674        out.write(0x0A);
675        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
676        out.write("MYPARAM".getBytes("US-ASCII"));
677        out.write(WSP_STRING_TERMINATOR); // EOS
678        out.write(0x45 | WSP_SHORT_INTEGER_MASK);
679
680        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
681        assertTrue(unit.decodeContentType(0));
682
683        String mimeType = unit.getValueString();
684
685        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
686        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
687        assertEquals(11, unit.getDecodedDataLength());
688
689        Map<String, String> params = unit.getContentParameters();
690        assertEquals("69", params.get("MYPARAM"));
691    }
692
693    public void testUntypedParamIntegerValueLongInteger() throws Exception {
694        ByteArrayOutputStream out = new ByteArrayOutputStream();
695        out.write(0x0C);
696        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
697        out.write("MYPARAM".getBytes("US-ASCII"));
698        out.write(WSP_STRING_TERMINATOR);
699        out.write(0x02); // Short Length
700        out.write(0x42); // Long Integer byte 1
701        out.write(0x69); // Long Integer byte 2
702
703        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
704        assertTrue(unit.decodeContentType(0));
705
706        String mimeType = unit.getValueString();
707
708        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
709        assertEquals(0x3F, unit.getValue32());
710        assertEquals(13, unit.getDecodedDataLength());
711
712        Map<String, String> params = unit.getContentParameters();
713        assertEquals("17001", params.get("MYPARAM"));
714    }
715
716    public void testUntypedParamTextNoValue() throws Exception {
717        ByteArrayOutputStream out = new ByteArrayOutputStream();
718        out.write(0x0A);
719        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
720        out.write("MYPARAM".getBytes("US-ASCII"));
721        out.write(WSP_STRING_TERMINATOR);
722        out.write(PARAM_NO_VALUE);
723
724        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
725        assertTrue(unit.decodeContentType(0));
726        String mimeType = unit.getValueString();
727
728        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
729        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
730        assertEquals(11, unit.getDecodedDataLength());
731
732        Map<String, String> params = unit.getContentParameters();
733        assertEquals(null, params.get("MYPARAM"));
734
735    }
736
737    public void testUntypedParamTextTokenText() throws Exception {
738        ByteArrayOutputStream out = new ByteArrayOutputStream();
739        out.write(0x11);
740        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
741        out.write("MYPARAM".getBytes("US-ASCII"));
742        out.write(WSP_STRING_TERMINATOR);
743        out.write("myvalue".getBytes("US-ASCII"));
744        out.write(WSP_STRING_TERMINATOR);
745
746        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
747        assertTrue(unit.decodeContentType(0));
748        String mimeType = unit.getValueString();
749
750        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
751        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
752        assertEquals(18, unit.getDecodedDataLength());
753
754        Map<String, String> params = unit.getContentParameters();
755        assertEquals("myvalue", params.get("MYPARAM"));
756    }
757
758    public void testUntypedParamTextQuotedString() throws Exception {
759        ByteArrayOutputStream out = new ByteArrayOutputStream();
760        out.write(0x11);
761        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
762        out.write("MYPARAM".getBytes("US-ASCII"));
763        out.write(WSP_STRING_TERMINATOR);
764        out.write(WSP_QUOTE);
765        out.write("myvalue".getBytes("US-ASCII"));
766        out.write(WSP_STRING_TERMINATOR);
767
768        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
769        assertTrue(unit.decodeContentType(0));
770        String mimeType = unit.getValueString();
771
772        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
773        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
774        assertEquals(19, unit.getDecodedDataLength());
775
776        Map<String, String> params = unit.getContentParameters();
777        assertEquals("myvalue", params.get("MYPARAM"));
778
779    }
780
781    public void testDecodesReturnsFalse_ForParamWithMissingValue() throws Exception {
782        ByteArrayOutputStream out = new ByteArrayOutputStream();
783        out.write(0x09);
784        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
785        out.write("MYPARAM".getBytes("US-ASCII"));
786        out.write(WSP_STRING_TERMINATOR);
787
788        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
789        assertFalse(unit.decodeContentType(0));
790    }
791
792    public void testTypedParamTextQValue()  {
793        ByteArrayOutputStream out = new ByteArrayOutputStream();
794        out.write(0x04);
795        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
796        out.write(TYPED_PARAM_Q);
797        out.write(0x83); // Q value byte 1
798        out.write(0x31); // Q value byte 2
799
800        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
801        assertTrue(unit.decodeContentType(0));
802        String mimeType = unit.getValueString();
803
804        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
805        assertEquals(0x3F, unit.getValue32());
806        assertEquals(5, unit.getDecodedDataLength());
807
808        Map<String, String> params = unit.getContentParameters();
809        assertEquals("433", params.get("Q"));
810
811    }
812
813    public void testTypedParamUnassignedWellKnownShortIntegerTokenText() throws Exception {
814
815        ByteArrayOutputStream out = new ByteArrayOutputStream();
816        out.write(0x14);
817        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
818        out.write(PARAM_UNASSIGNED | WSP_SHORT_INTEGER_MASK);
819        out.write("wdstechnology.com".getBytes("US-ASCII"));
820        out.write(WSP_STRING_TERMINATOR);
821
822        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
823        assertTrue(unit.decodeContentType(0));
824
825        String mimeType = unit.getValueString();
826
827        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
828        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
829
830        assertEquals(21, unit.getDecodedDataLength());
831
832        Map<String, String> params = unit.getContentParameters();
833        assertEquals("wdstechnology.com", params.get("unassigned/0x42"));
834
835    }
836
837    public void testTypedParamUnassignedWellKnownLongIntegerTokenText() throws Exception {
838
839        ByteArrayOutputStream out = new ByteArrayOutputStream();
840        out.write(0x15);
841        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
842        out.write(0x01); // Short-length of well-known parameter token
843        out.write(PARAM_UNASSIGNED);
844        out.write("wdstechnology.com".getBytes("US-ASCII"));
845        out.write(WSP_STRING_TERMINATOR);
846
847        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
848        assertTrue(unit.decodeContentType(0));
849
850        String mimeType = unit.getValueString();
851
852        assertEquals(STRING_MIME_TYPE_ROLLOVER_CERTIFICATE, mimeType);
853        assertEquals(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE, unit.getValue32());
854
855        assertEquals(22, unit.getDecodedDataLength());
856
857        Map<String, String> params = unit.getContentParameters();
858        assertEquals("wdstechnology.com", params.get("unassigned/0x42"));
859    }
860
861    public void testDecodesReturnsFalse_WhenParamValueNotTerminated() throws Exception {
862
863        ByteArrayOutputStream out = new ByteArrayOutputStream();
864        out.write(0x15);
865        out.write(SHORT_MIME_TYPE_ROLLOVER_CERTIFICATE | WSP_SHORT_INTEGER_MASK);
866        out.write(0x01);
867        out.write(PARAM_UNASSIGNED);
868        out.write("wdstechnology.com".getBytes("US-ASCII"));
869
870        WspTypeDecoder unit = new WspTypeDecoder(out.toByteArray());
871        assertFalse(unit.decodeContentType(0));
872    }
873}
874