1/*
2 * Copyright (C) 2006 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.cdma.sms;
18
19import android.telephony.TelephonyManager;
20import android.test.AndroidTestCase;
21import android.test.suitebuilder.annotation.SmallTest;
22
23import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails;
24import com.android.internal.telephony.SmsHeader;
25import com.android.internal.telephony.cdma.SmsMessage;
26import com.android.internal.util.HexDump;
27
28import java.util.ArrayList;
29import java.util.Arrays;
30
31public class CdmaSmsTest extends AndroidTestCase {
32
33    // CJK ideographs, Hiragana, Katakana, full width letters, Cyrillic, etc.
34    private static final String sUnicodeChars = "\u4e00\u4e01\u4e02\u4e03" +
35            "\u4e04\u4e05\u4e06\u4e07\u4e08\u4e09\u4e0a\u4e0b\u4e0c\u4e0d" +
36            "\u4e0e\u4e0f\u3041\u3042\u3043\u3044\u3045\u3046\u3047\u3048" +
37            "\u30a1\u30a2\u30a3\u30a4\u30a5\u30a6\u30a7\u30a8" +
38            "\uff10\uff11\uff12\uff13\uff14\uff15\uff16\uff17\uff18" +
39            "\uff70\uff71\uff72\uff73\uff74\uff75\uff76\uff77\uff78" +
40            "\u0400\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408" +
41            "\u00a2\u00a9\u00ae\u2122";
42
43    @SmallTest
44    public void testCdmaSmsAddrParsing() throws Exception {
45        CdmaSmsAddress addr = CdmaSmsAddress.parse("6502531000");
46        assertEquals(addr.ton, CdmaSmsAddress.TON_UNKNOWN);
47        assertEquals(addr.digitMode, CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF);
48        assertEquals(addr.numberMode, CdmaSmsAddress.NUMBER_MODE_NOT_DATA_NETWORK);
49        assertEquals(addr.numberOfDigits, 10);
50        assertEquals(addr.origBytes.length, 10);
51        byte[] data = {6, 5, 10, 2, 5, 3, 1, 10, 10, 10};
52        for (int i = 0; i < data.length; i++) {
53            assertEquals(addr.origBytes[i], data[i]);
54        }
55        addr = CdmaSmsAddress.parse("(650) 253-1000");
56        assertEquals(addr.ton, CdmaSmsAddress.TON_UNKNOWN);
57        assertEquals(addr.digitMode, CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF);
58        assertEquals(addr.numberMode, CdmaSmsAddress.NUMBER_MODE_NOT_DATA_NETWORK);
59        assertEquals(addr.numberOfDigits, 10);
60        assertEquals(addr.origBytes.length, 10);
61        byte[] data2 = {6, 5, 10, 2, 5, 3, 1, 10, 10, 10};
62        for (int i = 0; i < data2.length; i++) {
63            assertEquals(addr.origBytes[i], data2[i]);
64        }
65        addr = CdmaSmsAddress.parse("650.253.1000");
66        assertEquals(addr.ton, CdmaSmsAddress.TON_UNKNOWN);
67        assertEquals(addr.digitMode, CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF);
68        assertEquals(addr.numberMode, CdmaSmsAddress.NUMBER_MODE_NOT_DATA_NETWORK);
69        assertEquals(addr.numberOfDigits, 10);
70        assertEquals(addr.origBytes.length, 10);
71        byte[] data5 = {6, 5, 10, 2, 5, 3, 1, 10, 10, 10};
72        for (int i = 0; i < data2.length; i++) {
73            assertEquals(addr.origBytes[i], data5[i]);
74        }
75        addr = CdmaSmsAddress.parse("(+886) 917 222 555");
76        assertEquals(addr.ton, CdmaSmsAddress.TON_INTERNATIONAL_OR_IP);
77        assertEquals(addr.digitMode, CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF);
78        assertEquals(addr.numberMode, CdmaSmsAddress.NUMBER_MODE_NOT_DATA_NETWORK);
79        assertEquals(addr.numberOfDigits, 12);
80        assertEquals(addr.origBytes.length, 12);
81        byte[] data3 = {8, 8, 6, 9, 1, 7, 2, 2, 2, 5, 5, 5};
82        for (int i = 0; i < data3.length; i++) {
83            assertEquals(addr.origBytes[i], data3[i]);
84        }
85        addr = CdmaSmsAddress.parse("(650) *253-1000 #600");
86        byte[] data4 = {6, 5, 10, 11, 2, 5, 3, 1, 10, 10, 10, 12, 6, 10, 10};
87        for (int i = 0; i < data4.length; i++) {
88            assertEquals(addr.origBytes[i], data4[i]);
89        }
90        String input = "x@y.com,a@b.com";
91        addr = CdmaSmsAddress.parse(input);
92        assertEquals(addr.ton, CdmaSmsAddress.TON_NATIONAL_OR_EMAIL);
93        assertEquals(addr.digitMode, CdmaSmsAddress.DIGIT_MODE_8BIT_CHAR);
94        assertEquals(addr.numberMode, CdmaSmsAddress.NUMBER_MODE_DATA_NETWORK);
95        assertEquals(addr.numberOfDigits, 15);
96        assertEquals(addr.origBytes.length, 15);
97        assertEquals(new String(addr.origBytes), input);
98        addr = CdmaSmsAddress.parse("foo bar");
99        assertEquals(addr.ton, CdmaSmsAddress.TON_UNKNOWN);
100        assertEquals(addr.digitMode, CdmaSmsAddress.DIGIT_MODE_8BIT_CHAR);
101        assertEquals(addr.numberMode, CdmaSmsAddress.NUMBER_MODE_DATA_NETWORK);
102        assertEquals(addr.numberOfDigits, 6);
103        assertEquals(addr.origBytes.length, 6);
104        assertEquals(new String(addr.origBytes), "foobar");
105        addr = CdmaSmsAddress.parse("f\noo\tb   a\rr");
106        assertEquals(new String(addr.origBytes), "foobar");
107        assertEquals(CdmaSmsAddress.parse("f\u0000oo bar"), null);
108        assertEquals(CdmaSmsAddress.parse("f\u0007oo bar"), null);
109        assertEquals(CdmaSmsAddress.parse("f\u0080oo bar"), null);
110        assertEquals(CdmaSmsAddress.parse("f\u1ECFboo\u001fbar"), null);
111        assertEquals(CdmaSmsAddress.parse("f\u0080oo bar"), null);
112    }
113
114    @SmallTest
115    public void testUserData7bitGsm() throws Exception {
116        String pdu = "00031040900112488ea794e074d69e1b7392c270326cde9e98";
117        BearerData bearerData = BearerData.decode(HexDump.hexStringToByteArray(pdu));
118        assertEquals("Test standard SMS", bearerData.userData.payloadStr);
119    }
120
121    @SmallTest
122    public void testUserData7bitAscii() throws Exception {
123        String pdu = "0003100160010610262d5ab500";
124        BearerData bearerData = BearerData.decode(HexDump.hexStringToByteArray(pdu));
125        assertEquals("bjjj", bearerData.userData.payloadStr);
126    }
127
128    @SmallTest
129    public void testUserData7bitAsciiTwo() throws Exception {
130        String pdu = "00031001d00109104539b4d052ebb3d0";
131        BearerData bearerData = BearerData.decode(HexDump.hexStringToByteArray(pdu));
132        assertEquals("SMS Rulz", bearerData.userData.payloadStr);
133    }
134
135    @SmallTest
136    public void testUserDataIa5() throws Exception {
137        String pdu = "00031002100109184539b4d052ebb3d0";
138        BearerData bearerData = BearerData.decode(HexDump.hexStringToByteArray(pdu));
139        assertEquals("SMS Rulz", bearerData.userData.payloadStr);
140    }
141
142    @SmallTest
143    public void testUserData7bitAsciiFeedback() throws Exception {
144        BearerData bearerData = new BearerData();
145        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
146        bearerData.messageId = 0;
147        bearerData.hasUserDataHeader = false;
148        UserData userData = new UserData();
149        userData.payloadStr = "Test standard SMS";
150        userData.msgEncoding = UserData.ENCODING_7BIT_ASCII;
151        userData.msgEncodingSet = true;
152        bearerData.userData = userData;
153        byte []encodedSms = BearerData.encode(bearerData);
154        BearerData revBearerData = BearerData.decode(encodedSms);
155        assertEquals(BearerData.MESSAGE_TYPE_DELIVER, revBearerData.messageType);
156        assertEquals(0, revBearerData.messageId);
157        assertEquals(false, revBearerData.hasUserDataHeader);
158        assertEquals(userData.msgEncoding, revBearerData.userData.msgEncoding);
159        assertEquals(userData.payloadStr.length(), revBearerData.userData.numFields);
160        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
161        userData.payloadStr = "Test \u007f standard \u0000 SMS";
162        revBearerData = BearerData.decode(BearerData.encode(bearerData));
163        assertEquals("Test   standard   SMS", revBearerData.userData.payloadStr);
164        userData.payloadStr = "Test \n standard \r SMS";
165        revBearerData = BearerData.decode(BearerData.encode(bearerData));
166        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
167        userData.payloadStr = "";
168        revBearerData = BearerData.decode(BearerData.encode(bearerData));
169        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
170    }
171
172    @SmallTest
173    public void testUserData7bitGsmFeedback() throws Exception {
174        BearerData bearerData = new BearerData();
175        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
176        bearerData.messageId = 0;
177        bearerData.hasUserDataHeader = false;
178        UserData userData = new UserData();
179        userData.payloadStr = "Test standard SMS";
180        userData.msgEncoding = UserData.ENCODING_GSM_7BIT_ALPHABET;
181        userData.msgEncodingSet = true;
182        bearerData.userData = userData;
183        byte []encodedSms = BearerData.encode(bearerData);
184        BearerData revBearerData = BearerData.decode(encodedSms);
185        assertEquals(BearerData.MESSAGE_TYPE_DELIVER, revBearerData.messageType);
186        assertEquals(0, revBearerData.messageId);
187        assertEquals(false, revBearerData.hasUserDataHeader);
188        assertEquals(userData.msgEncoding, revBearerData.userData.msgEncoding);
189        assertEquals(userData.payloadStr.length(), revBearerData.userData.numFields);
190        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
191        userData.payloadStr = "1234567";
192        revBearerData = BearerData.decode(BearerData.encode(bearerData));
193        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
194        userData.payloadStr = "";
195        revBearerData = BearerData.decode(BearerData.encode(bearerData));
196        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
197        userData.payloadStr = "12345678901234567890123456789012345678901234567890" +
198                "12345678901234567890123456789012345678901234567890" +
199                "12345678901234567890123456789012345678901234567890" +
200                "1234567890";
201        revBearerData = BearerData.decode(BearerData.encode(bearerData));
202        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
203        userData.payloadStr = "Test \u007f illegal \u0000 SMS chars";
204        revBearerData = BearerData.decode(BearerData.encode(bearerData));
205        assertEquals("Test   illegal   SMS chars", revBearerData.userData.payloadStr);
206        userData.payloadStr = "More @ testing\nis great^|^~woohoo";
207        revBearerData = BearerData.decode(BearerData.encode(bearerData));
208        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
209        SmsHeader.ConcatRef concatRef = new SmsHeader.ConcatRef();
210        concatRef.refNumber = 0xEE;
211        concatRef.msgCount = 2;
212        concatRef.seqNumber = 2;
213        concatRef.isEightBits = true;
214        SmsHeader smsHeader = new SmsHeader();
215        smsHeader.concatRef = concatRef;
216        byte[] encodedHeader = SmsHeader.toByteArray(smsHeader);
217        userData.userDataHeader = smsHeader;
218        revBearerData = BearerData.decode(BearerData.encode(bearerData));
219        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
220        SmsHeader decodedHeader = revBearerData.userData.userDataHeader;
221        assertEquals(decodedHeader.concatRef.refNumber, concatRef.refNumber);
222        assertEquals(decodedHeader.concatRef.msgCount, concatRef.msgCount);
223        assertEquals(decodedHeader.concatRef.seqNumber, concatRef.seqNumber);
224    }
225
226    @SmallTest
227    public void testUserDataUtf16Feedback() throws Exception {
228        BearerData bearerData = new BearerData();
229        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
230        bearerData.messageId = 0;
231        bearerData.hasUserDataHeader = false;
232        UserData userData = new UserData();
233        userData.payloadStr = "\u0160u\u1E5B\u0301r\u1ECFg\uD835\uDC1At\u00E9\u4E002\u3042";
234        userData.msgEncoding = UserData.ENCODING_UNICODE_16;
235        userData.msgEncodingSet = true;
236        bearerData.userData = userData;
237        byte []encodedSms = BearerData.encode(bearerData);
238        BearerData revBearerData = BearerData.decode(encodedSms);
239        assertEquals(BearerData.MESSAGE_TYPE_DELIVER, revBearerData.messageType);
240        assertEquals(0, revBearerData.messageId);
241        assertEquals(false, revBearerData.hasUserDataHeader);
242        assertEquals(userData.msgEncoding, revBearerData.userData.msgEncoding);
243        assertEquals(userData.payloadStr.length(), revBearerData.userData.numFields);
244        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
245        userData.msgEncoding = UserData.ENCODING_OCTET;
246        userData.msgEncodingSet = false;
247        revBearerData = BearerData.decode(BearerData.encode(bearerData));
248        assertEquals(BearerData.MESSAGE_TYPE_DELIVER, revBearerData.messageType);
249        assertEquals(0, revBearerData.messageId);
250        assertEquals(false, revBearerData.hasUserDataHeader);
251        assertEquals(userData.msgEncoding, revBearerData.userData.msgEncoding);
252        assertEquals(userData.payloadStr.length(), revBearerData.userData.numFields);
253        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
254        userData.payloadStr = "1234567";
255        revBearerData = BearerData.decode(BearerData.encode(bearerData));
256        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
257        userData.payloadStr = "";
258        revBearerData = BearerData.decode(BearerData.encode(bearerData));
259        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
260    }
261
262    @SmallTest
263    public void testMonolithicOne() throws Exception {
264        String pdu = "0003200010010410168d2002010503060812011101590501c706069706180000000701c108" +
265                "01c00901800a01e00b01030c01c00d01070e05039acc13880f018011020566";
266        BearerData bearerData = BearerData.decode(HexDump.hexStringToByteArray(pdu));
267        assertEquals(bearerData.messageType, BearerData.MESSAGE_TYPE_SUBMIT);
268        assertEquals(bearerData.messageId, 1);
269        assertEquals(bearerData.priority, BearerData.PRIORITY_EMERGENCY);
270        assertEquals(bearerData.privacy, BearerData.PRIVACY_CONFIDENTIAL);
271        assertEquals(bearerData.userAckReq, true);
272        assertEquals(bearerData.readAckReq, true);
273        assertEquals(bearerData.deliveryAckReq, true);
274        assertEquals(bearerData.reportReq, false);
275        assertEquals(bearerData.numberOfMessages, 3);
276        assertEquals(bearerData.alert, BearerData.ALERT_HIGH_PRIO);
277        assertEquals(bearerData.language, BearerData.LANGUAGE_HEBREW);
278        assertEquals(bearerData.callbackNumber.digitMode, CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF);
279        assertEquals(bearerData.callbackNumber.numberMode,
280                     CdmaSmsAddress.NUMBER_MODE_NOT_DATA_NETWORK);
281        assertEquals(bearerData.callbackNumber.ton, CdmaSmsAddress.TON_UNKNOWN);
282        assertEquals(bearerData.callbackNumber.numberPlan, CdmaSmsAddress.NUMBERING_PLAN_UNKNOWN);
283        assertEquals(bearerData.callbackNumber.numberOfDigits, 7);
284        assertEquals(bearerData.callbackNumber.address, "3598271");
285        assertEquals(bearerData.displayMode, BearerData.DISPLAY_MODE_USER);
286        assertEquals(bearerData.depositIndex, 1382);
287        assertEquals(bearerData.userResponseCode, 5);
288        assertEquals(bearerData.msgCenterTimeStamp.year, 2008);
289        assertEquals(bearerData.msgCenterTimeStamp.month, 11);
290        assertEquals(bearerData.msgCenterTimeStamp.monthDay, 1);
291        assertEquals(bearerData.msgCenterTimeStamp.hour, 11);
292        assertEquals(bearerData.msgCenterTimeStamp.minute, 1);
293        assertEquals(bearerData.msgCenterTimeStamp.second, 59);
294        assertEquals(bearerData.validityPeriodAbsolute, null);
295        assertEquals(bearerData.validityPeriodRelative, 193);
296        assertEquals(bearerData.deferredDeliveryTimeAbsolute.year, 1997);
297        assertEquals(bearerData.deferredDeliveryTimeAbsolute.month, 5);
298        assertEquals(bearerData.deferredDeliveryTimeAbsolute.monthDay, 18);
299        assertEquals(bearerData.deferredDeliveryTimeAbsolute.hour, 0);
300        assertEquals(bearerData.deferredDeliveryTimeAbsolute.minute, 0);
301        assertEquals(bearerData.deferredDeliveryTimeAbsolute.second, 0);
302        assertEquals(bearerData.deferredDeliveryTimeRelative, 199);
303        assertEquals(bearerData.hasUserDataHeader, false);
304        assertEquals(bearerData.userData.msgEncoding, UserData.ENCODING_7BIT_ASCII);
305        assertEquals(bearerData.userData.numFields, 2);
306        assertEquals(bearerData.userData.payloadStr, "hi");
307    }
308
309    @SmallTest
310    public void testMonolithicTwo() throws Exception {
311        String pdu = "0003200010010410168d200201050306081201110159050192060697061800000007013d0" +
312                "801c00901800a01e00b01030c01c00d01070e05039acc13880f018011020566";
313        BearerData bearerData = BearerData.decode(HexDump.hexStringToByteArray(pdu));
314        assertEquals(bearerData.messageType, BearerData.MESSAGE_TYPE_SUBMIT);
315        assertEquals(bearerData.messageId, 1);
316        assertEquals(bearerData.priority, BearerData.PRIORITY_EMERGENCY);
317        assertEquals(bearerData.privacy, BearerData.PRIVACY_CONFIDENTIAL);
318        assertEquals(bearerData.userAckReq, true);
319        assertEquals(bearerData.readAckReq, true);
320        assertEquals(bearerData.deliveryAckReq, true);
321        assertEquals(bearerData.reportReq, false);
322        assertEquals(bearerData.numberOfMessages, 3);
323        assertEquals(bearerData.alert, BearerData.ALERT_HIGH_PRIO);
324        assertEquals(bearerData.language, BearerData.LANGUAGE_HEBREW);
325        assertEquals(bearerData.callbackNumber.digitMode, CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF);
326        assertEquals(bearerData.callbackNumber.numberMode,
327                     CdmaSmsAddress.NUMBER_MODE_NOT_DATA_NETWORK);
328        assertEquals(bearerData.callbackNumber.ton, CdmaSmsAddress.TON_UNKNOWN);
329        assertEquals(bearerData.callbackNumber.numberPlan, CdmaSmsAddress.NUMBERING_PLAN_UNKNOWN);
330        assertEquals(bearerData.callbackNumber.numberOfDigits, 7);
331        assertEquals(bearerData.callbackNumber.address, "3598271");
332        assertEquals(bearerData.displayMode, BearerData.DISPLAY_MODE_USER);
333        assertEquals(bearerData.depositIndex, 1382);
334        assertEquals(bearerData.userResponseCode, 5);
335        assertEquals(bearerData.msgCenterTimeStamp.year, 2008);
336        assertEquals(bearerData.msgCenterTimeStamp.month, 11);
337        assertEquals(bearerData.msgCenterTimeStamp.monthDay, 1);
338        assertEquals(bearerData.msgCenterTimeStamp.hour, 11);
339        assertEquals(bearerData.msgCenterTimeStamp.minute, 1);
340        assertEquals(bearerData.msgCenterTimeStamp.second, 59);
341        assertEquals(bearerData.validityPeriodAbsolute, null);
342        assertEquals(bearerData.validityPeriodRelative, 61);
343        assertEquals(bearerData.deferredDeliveryTimeAbsolute.year, 1997);
344        assertEquals(bearerData.deferredDeliveryTimeAbsolute.month, 5);
345        assertEquals(bearerData.deferredDeliveryTimeAbsolute.monthDay, 18);
346        assertEquals(bearerData.deferredDeliveryTimeAbsolute.hour, 0);
347        assertEquals(bearerData.deferredDeliveryTimeAbsolute.minute, 0);
348        assertEquals(bearerData.deferredDeliveryTimeAbsolute.second, 0);
349        assertEquals(bearerData.deferredDeliveryTimeRelative, 146);
350        assertEquals(bearerData.hasUserDataHeader, false);
351        assertEquals(bearerData.userData.msgEncoding, UserData.ENCODING_7BIT_ASCII);
352        assertEquals(bearerData.userData.numFields, 2);
353        assertEquals(bearerData.userData.payloadStr, "hi");
354    }
355
356    @SmallTest
357    public void testUserDataHeaderConcatRefFeedback() throws Exception {
358        BearerData bearerData = new BearerData();
359        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
360        bearerData.messageId = 55;
361        SmsHeader.ConcatRef concatRef = new SmsHeader.ConcatRef();
362        concatRef.refNumber = 0xEE;
363        concatRef.msgCount = 2;
364        concatRef.seqNumber = 2;
365        concatRef.isEightBits = true;
366        SmsHeader smsHeader = new SmsHeader();
367        smsHeader.concatRef = concatRef;
368        byte[] encodedHeader = SmsHeader.toByteArray(smsHeader);
369        SmsHeader decodedHeader = SmsHeader.fromByteArray(encodedHeader);
370        assertEquals(decodedHeader.concatRef.refNumber, concatRef.refNumber);
371        assertEquals(decodedHeader.concatRef.msgCount, concatRef.msgCount);
372        assertEquals(decodedHeader.concatRef.seqNumber, concatRef.seqNumber);
373        assertEquals(decodedHeader.concatRef.isEightBits, concatRef.isEightBits);
374        assertEquals(decodedHeader.portAddrs, null);
375        UserData userData = new UserData();
376        userData.payloadStr = "User Data Header (UDH) feedback test";
377        userData.userDataHeader = smsHeader;
378        bearerData.userData = userData;
379        byte[] encodedSms = BearerData.encode(bearerData);
380        BearerData revBearerData = BearerData.decode(encodedSms);
381        decodedHeader = revBearerData.userData.userDataHeader;
382        assertEquals(decodedHeader.concatRef.refNumber, concatRef.refNumber);
383        assertEquals(decodedHeader.concatRef.msgCount, concatRef.msgCount);
384        assertEquals(decodedHeader.concatRef.seqNumber, concatRef.seqNumber);
385        assertEquals(decodedHeader.concatRef.isEightBits, concatRef.isEightBits);
386        assertEquals(decodedHeader.portAddrs, null);
387    }
388
389    @SmallTest
390    public void testUserDataHeaderIllegalConcatRef() throws Exception {
391        BearerData bearerData = new BearerData();
392        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
393        bearerData.messageId = 55;
394        SmsHeader.ConcatRef concatRef = new SmsHeader.ConcatRef();
395        concatRef.refNumber = 0x10;
396        concatRef.msgCount = 0;
397        concatRef.seqNumber = 2;
398        concatRef.isEightBits = true;
399        SmsHeader smsHeader = new SmsHeader();
400        smsHeader.concatRef = concatRef;
401        byte[] encodedHeader = SmsHeader.toByteArray(smsHeader);
402        SmsHeader decodedHeader = SmsHeader.fromByteArray(encodedHeader);
403        assertEquals(decodedHeader.concatRef, null);
404        concatRef.isEightBits = false;
405        encodedHeader = SmsHeader.toByteArray(smsHeader);
406        decodedHeader = SmsHeader.fromByteArray(encodedHeader);
407        assertEquals(decodedHeader.concatRef, null);
408        concatRef.msgCount = 1;
409        concatRef.seqNumber = 2;
410        encodedHeader = SmsHeader.toByteArray(smsHeader);
411        decodedHeader = SmsHeader.fromByteArray(encodedHeader);
412        assertEquals(decodedHeader.concatRef, null);
413        concatRef.msgCount = 1;
414        concatRef.seqNumber = 0;
415        encodedHeader = SmsHeader.toByteArray(smsHeader);
416        decodedHeader = SmsHeader.fromByteArray(encodedHeader);
417        assertEquals(decodedHeader.concatRef, null);
418        concatRef.msgCount = 2;
419        concatRef.seqNumber = 1;
420        encodedHeader = SmsHeader.toByteArray(smsHeader);
421        decodedHeader = SmsHeader.fromByteArray(encodedHeader);
422        assertEquals(decodedHeader.concatRef.msgCount, 2);
423        assertEquals(decodedHeader.concatRef.seqNumber, 1);
424    }
425
426    @SmallTest
427    public void testUserDataHeaderMixedFeedback() throws Exception {
428        BearerData bearerData = new BearerData();
429        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
430        bearerData.messageId = 42;
431        SmsHeader.ConcatRef concatRef = new SmsHeader.ConcatRef();
432        concatRef.refNumber = 0x34;
433        concatRef.msgCount = 5;
434        concatRef.seqNumber = 2;
435        concatRef.isEightBits = false;
436        SmsHeader.PortAddrs portAddrs = new SmsHeader.PortAddrs();
437        portAddrs.destPort = 88;
438        portAddrs.origPort = 66;
439        portAddrs.areEightBits = false;
440        SmsHeader smsHeader = new SmsHeader();
441        smsHeader.concatRef = concatRef;
442        smsHeader.portAddrs = portAddrs;
443        byte[] encodedHeader = SmsHeader.toByteArray(smsHeader);
444        SmsHeader decodedHeader = SmsHeader.fromByteArray(encodedHeader);
445        assertEquals(decodedHeader.concatRef.refNumber, concatRef.refNumber);
446        assertEquals(decodedHeader.concatRef.msgCount, concatRef.msgCount);
447        assertEquals(decodedHeader.concatRef.seqNumber, concatRef.seqNumber);
448        assertEquals(decodedHeader.concatRef.isEightBits, concatRef.isEightBits);
449        assertEquals(decodedHeader.portAddrs.destPort, portAddrs.destPort);
450        assertEquals(decodedHeader.portAddrs.origPort, portAddrs.origPort);
451        assertEquals(decodedHeader.portAddrs.areEightBits, portAddrs.areEightBits);
452        UserData userData = new UserData();
453        userData.payloadStr = "User Data Header (UDH) feedback test";
454        userData.userDataHeader = smsHeader;
455        bearerData.userData = userData;
456        byte[] encodedSms = BearerData.encode(bearerData);
457        BearerData revBearerData = BearerData.decode(encodedSms);
458        decodedHeader = revBearerData.userData.userDataHeader;
459        assertEquals(decodedHeader.concatRef.refNumber, concatRef.refNumber);
460        assertEquals(decodedHeader.concatRef.msgCount, concatRef.msgCount);
461        assertEquals(decodedHeader.concatRef.seqNumber, concatRef.seqNumber);
462        assertEquals(decodedHeader.concatRef.isEightBits, concatRef.isEightBits);
463        assertEquals(decodedHeader.portAddrs.destPort, portAddrs.destPort);
464        assertEquals(decodedHeader.portAddrs.origPort, portAddrs.origPort);
465        assertEquals(decodedHeader.portAddrs.areEightBits, portAddrs.areEightBits);
466    }
467
468    @SmallTest
469    public void testReplyOption() throws Exception {
470        String pdu1 = "0003104090011648b6a794e0705476bf77bceae934fe5f6d94d87450080a0180";
471        BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
472        assertEquals("Test Acknowledgement 1", bd1.userData.payloadStr);
473        assertEquals(true, bd1.userAckReq);
474        assertEquals(false, bd1.deliveryAckReq);
475        assertEquals(false, bd1.readAckReq);
476        assertEquals(false, bd1.reportReq);
477        String pdu2 = "0003104090011648b6a794e0705476bf77bceae934fe5f6d94d87490080a0140";
478        BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
479        assertEquals("Test Acknowledgement 2", bd2.userData.payloadStr);
480        assertEquals(false, bd2.userAckReq);
481        assertEquals(true, bd2.deliveryAckReq);
482        assertEquals(false, bd2.readAckReq);
483        assertEquals(false, bd2.reportReq);
484        String pdu3 = "0003104090011648b6a794e0705476bf77bceae934fe5f6d94d874d0080a0120";
485        BearerData bd3 = BearerData.decode(HexDump.hexStringToByteArray(pdu3));
486        assertEquals("Test Acknowledgement 3", bd3.userData.payloadStr);
487        assertEquals(false, bd3.userAckReq);
488        assertEquals(false, bd3.deliveryAckReq);
489        assertEquals(true, bd3.readAckReq);
490        assertEquals(false, bd3.reportReq);
491        String pdu4 = "0003104090011648b6a794e0705476bf77bceae934fe5f6d94d87510080a0110";
492        BearerData bd4 = BearerData.decode(HexDump.hexStringToByteArray(pdu4));
493        assertEquals("Test Acknowledgement 4", bd4.userData.payloadStr);
494        assertEquals(false, bd4.userAckReq);
495        assertEquals(false, bd4.deliveryAckReq);
496        assertEquals(false, bd4.readAckReq);
497        assertEquals(true, bd4.reportReq);
498    }
499
500    @SmallTest
501    public void testReplyOptionFeedback() throws Exception {
502        BearerData bearerData = new BearerData();
503        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
504        bearerData.messageId = 0;
505        bearerData.hasUserDataHeader = false;
506        UserData userData = new UserData();
507        userData.payloadStr = "test reply option";
508        bearerData.userData = userData;
509        bearerData.userAckReq = true;
510        byte []encodedSms = BearerData.encode(bearerData);
511        BearerData revBearerData = BearerData.decode(encodedSms);
512        assertEquals(true, revBearerData.userAckReq);
513        assertEquals(false, revBearerData.deliveryAckReq);
514        assertEquals(false, revBearerData.readAckReq);
515        assertEquals(false, revBearerData.reportReq);
516        bearerData.userAckReq = false;
517        bearerData.deliveryAckReq = true;
518        encodedSms = BearerData.encode(bearerData);
519        revBearerData = BearerData.decode(encodedSms);
520        assertEquals(false, revBearerData.userAckReq);
521        assertEquals(true, revBearerData.deliveryAckReq);
522        assertEquals(false, revBearerData.readAckReq);
523        assertEquals(false, revBearerData.reportReq);
524        bearerData.deliveryAckReq = false;
525        bearerData.readAckReq = true;
526        encodedSms = BearerData.encode(bearerData);
527        revBearerData = BearerData.decode(encodedSms);
528        assertEquals(false, revBearerData.userAckReq);
529        assertEquals(false, revBearerData.deliveryAckReq);
530        assertEquals(true, revBearerData.readAckReq);
531        assertEquals(false, revBearerData.reportReq);
532        bearerData.readAckReq = false;
533        bearerData.reportReq = true;
534        encodedSms = BearerData.encode(bearerData);
535        revBearerData = BearerData.decode(encodedSms);
536        assertEquals(false, revBearerData.userAckReq);
537        assertEquals(false, revBearerData.deliveryAckReq);
538        assertEquals(false, revBearerData.readAckReq);
539        assertEquals(true, revBearerData.reportReq);
540    }
541
542    @SmallTest
543    public void testNumberOfMessages() throws Exception {
544        // Note that the message text below does not properly reflect
545        // the message count.  The author of these messages was
546        // apparently unaware that the values are bcd encoded, and the
547        // values being tested against (not the ones in the message
548        // text) are actually correct.
549        String pdu1 = "000310409001124896a794e07595f69f199540ea759a0dc8e00b0163";
550        BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
551        assertEquals("Test Voice mail 99", bd1.userData.payloadStr);
552        assertEquals(63, bd1.numberOfMessages);
553        String pdu2 = "00031040900113489ea794e07595f69f199540ea759a0988c0600b0164";
554        BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
555        assertEquals("Test Voice mail 100", bd2.userData.payloadStr);
556        assertEquals(64, bd2.numberOfMessages);
557    }
558
559    @SmallTest
560    public void testCallbackNum() throws Exception {
561        String pdu1 = "00031040900112488ea794e070d436cb638bc5e035ce2f97900e06910431323334";
562        BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
563        assertEquals("Test Callback nbr", bd1.userData.payloadStr);
564        assertEquals(CdmaSmsAddress.DIGIT_MODE_8BIT_CHAR, bd1.callbackNumber.digitMode);
565        assertEquals(CdmaSmsAddress.TON_INTERNATIONAL_OR_IP, bd1.callbackNumber.ton);
566        assertEquals(CdmaSmsAddress.NUMBER_MODE_NOT_DATA_NETWORK, bd1.callbackNumber.numberMode);
567        assertEquals(CdmaSmsAddress.NUMBERING_PLAN_ISDN_TELEPHONY, bd1.callbackNumber.numberPlan);
568        assertEquals("1234", bd1.callbackNumber.address);
569    }
570
571    @SmallTest
572    public void testCallbackNumDtmf() throws Exception {
573        String pdu1 = "00031002300109104539b4d052ebb3d00e07052d4c90a55080";
574        BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
575        assertEquals("SMS Rulz", bd1.userData.payloadStr);
576        assertEquals(CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF, bd1.callbackNumber.digitMode);
577        assertEquals(CdmaSmsAddress.TON_UNKNOWN, bd1.callbackNumber.ton);
578        assertEquals(CdmaSmsAddress.NUMBER_MODE_NOT_DATA_NETWORK, bd1.callbackNumber.numberMode);
579        assertEquals(CdmaSmsAddress.NUMBERING_PLAN_UNKNOWN, bd1.callbackNumber.numberPlan);
580        assertEquals("5099214001", bd1.callbackNumber.address);
581    }
582
583    @SmallTest
584    public void testCallbackNumFeedback() throws Exception {
585        BearerData bearerData = new BearerData();
586        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
587        bearerData.messageId = 0;
588        bearerData.hasUserDataHeader = false;
589        UserData userData = new UserData();
590        userData.payloadStr = "test callback number";
591        bearerData.userData = userData;
592        CdmaSmsAddress addr = new CdmaSmsAddress();
593        addr.digitMode = CdmaSmsAddress.DIGIT_MODE_8BIT_CHAR;
594        addr.ton = CdmaSmsAddress.TON_NATIONAL_OR_EMAIL;
595        addr.numberMode = CdmaSmsAddress.NUMBER_MODE_NOT_DATA_NETWORK;
596        addr.numberPlan = CdmaSmsAddress.NUMBERING_PLAN_UNKNOWN;
597        addr.address = "8005551212";
598        addr.numberOfDigits = (byte)addr.address.length();
599        bearerData.callbackNumber = addr;
600        byte []encodedSms = BearerData.encode(bearerData);
601        BearerData revBearerData = BearerData.decode(encodedSms);
602        CdmaSmsAddress revAddr = revBearerData.callbackNumber;
603        assertEquals(addr.digitMode, revAddr.digitMode);
604        assertEquals(addr.ton, revAddr.ton);
605        assertEquals(addr.numberMode, revAddr.numberMode);
606        assertEquals(addr.numberPlan, revAddr.numberPlan);
607        assertEquals(addr.numberOfDigits, revAddr.numberOfDigits);
608        assertEquals(addr.address, revAddr.address);
609        addr.address = "8*55#1012";
610        addr.numberOfDigits = (byte)addr.address.length();
611        addr.digitMode = CdmaSmsAddress.DIGIT_MODE_4BIT_DTMF;
612        encodedSms = BearerData.encode(bearerData);
613        revBearerData = BearerData.decode(encodedSms);
614        revAddr = revBearerData.callbackNumber;
615        assertEquals(addr.digitMode, revAddr.digitMode);
616        assertEquals(addr.numberOfDigits, revAddr.numberOfDigits);
617        assertEquals(addr.address, revAddr.address);
618    }
619
620    @SmallTest
621    public void testPrivacyIndicator() throws Exception {
622        String pdu1 = "0003104090010c485f4194dfea34becf61b840090140";
623        BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
624        assertEquals(bd1.privacy, BearerData.PRIVACY_RESTRICTED);
625        String pdu2 = "0003104090010c485f4194dfea34becf61b840090180";
626        BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
627        assertEquals(bd2.privacy, BearerData.PRIVACY_CONFIDENTIAL);
628        String pdu3 = "0003104090010c485f4194dfea34becf61b8400901c0";
629        BearerData bd3 = BearerData.decode(HexDump.hexStringToByteArray(pdu3));
630        assertEquals(bd3.privacy, BearerData.PRIVACY_SECRET);
631    }
632
633    @SmallTest
634    public void testPrivacyIndicatorFeedback() throws Exception {
635        BearerData bearerData = new BearerData();
636        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
637        bearerData.messageId = 0;
638        bearerData.hasUserDataHeader = false;
639        UserData userData = new UserData();
640        userData.payloadStr = "test privacy indicator";
641        bearerData.userData = userData;
642        bearerData.privacy = BearerData.PRIVACY_SECRET;
643        bearerData.privacyIndicatorSet = true;
644        byte []encodedSms = BearerData.encode(bearerData);
645        BearerData revBearerData = BearerData.decode(encodedSms);
646        assertEquals(revBearerData.userData.payloadStr, userData.payloadStr);
647        assertEquals(revBearerData.privacyIndicatorSet, true);
648        assertEquals(revBearerData.privacy, BearerData.PRIVACY_SECRET);
649        bearerData.privacy = BearerData.PRIVACY_RESTRICTED;
650        encodedSms = BearerData.encode(bearerData);
651        revBearerData = BearerData.decode(encodedSms);
652        assertEquals(revBearerData.privacy, BearerData.PRIVACY_RESTRICTED);
653    }
654
655    @SmallTest
656    public void testMsgDeliveryAlert() throws Exception {
657        String pdu1 = "0003104090010d4866a794e07055965b91d040300c0100";
658        BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
659        assertEquals(bd1.alert, 0);
660        assertEquals(bd1.userData.payloadStr, "Test Alert 0");
661        String pdu2 = "0003104090010d4866a794e07055965b91d140300c0140";
662        BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
663        assertEquals(bd2.alert, 1);
664        assertEquals(bd2.userData.payloadStr, "Test Alert 1");
665        String pdu3 = "0003104090010d4866a794e07055965b91d240300c0180";
666        BearerData bd3 = BearerData.decode(HexDump.hexStringToByteArray(pdu3));
667        assertEquals(bd3.alert, 2);
668        assertEquals(bd3.userData.payloadStr, "Test Alert 2");
669        String pdu4 = "0003104090010d4866a794e07055965b91d340300c01c0";
670        BearerData bd4 = BearerData.decode(HexDump.hexStringToByteArray(pdu4));
671        assertEquals(bd4.alert, 3);
672        assertEquals(bd4.userData.payloadStr, "Test Alert 3");
673        String pdu5 = "00031000000126114F4CBCFA20DB979F3C39F2A0C9976" +
674            "69ED979794187665E5D1028EFA7A6840E1062D3D39A900C028000";
675        BearerData bd5 = BearerData.decode(HexDump.hexStringToByteArray(pdu5));
676        assertEquals(bd5.alert, BearerData.ALERT_MEDIUM_PRIO);
677        assertEquals(bd5.userData.payloadStr, "test message delivery alert (with 8 bits)");
678        String pdu6 = "00031000000126114F4CBCFA20DB979F3C39F2A0C9976" +
679            "69ED979794187665E5D1028EFA7A6840C1062D3D39A900C00";
680        BearerData bd6 = BearerData.decode(HexDump.hexStringToByteArray(pdu6));
681        assertEquals(bd6.userData.payloadStr, "test message delivery alert (with 0 bits)");
682        assertEquals(bd6.alertIndicatorSet, false);
683    }
684
685    @SmallTest
686    public void testMiscParams() throws Exception {
687        String pdu1 = "00031002400109104539b4d052ebb3d00c0180";
688        BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
689        assertEquals(bd1.alert, BearerData.ALERT_MEDIUM_PRIO);
690        assertEquals(bd1.userData.payloadStr, "SMS Rulz");
691        String pdu2 = "00031002500109104539b4d052ebb3d00801800901c0";
692        BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
693        assertEquals(bd2.priority, BearerData.PRIORITY_URGENT);
694        assertEquals(bd2.privacy, BearerData.PRIVACY_SECRET);
695        assertEquals(bd2.userData.payloadStr, "SMS Rulz");
696        String pdu3 = "00031002600109104539b4d052ebb3d00901400c01c0";
697        BearerData bd3 = BearerData.decode(HexDump.hexStringToByteArray(pdu3));
698        assertEquals(bd3.privacy, BearerData.PRIVACY_RESTRICTED);
699        assertEquals(bd3.alert, BearerData.ALERT_HIGH_PRIO);
700        assertEquals(bd3.userData.payloadStr, "SMS Rulz");
701        String pdu4 = "00031002700109104539b4d052ebb3d00f0105";
702        BearerData bd4 = BearerData.decode(HexDump.hexStringToByteArray(pdu4));
703        assertEquals(bd4.displayMode, BearerData.DISPLAY_MODE_IMMEDIATE);
704        assertEquals(bd4.userData.payloadStr, "SMS Rulz");
705    }
706   @SmallTest
707    public void testMsgDeliveryAlertFeedback() throws Exception {
708        BearerData bearerData = new BearerData();
709        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
710        bearerData.messageId = 0;
711        bearerData.hasUserDataHeader = false;
712        UserData userData = new UserData();
713        userData.payloadStr = "test message delivery alert";
714        bearerData.userData = userData;
715        bearerData.alert = BearerData.ALERT_MEDIUM_PRIO;
716        bearerData.alertIndicatorSet = true;
717        byte []encodedSms = BearerData.encode(bearerData);
718        BearerData revBearerData = BearerData.decode(encodedSms);
719        assertEquals(revBearerData.userData.payloadStr, userData.payloadStr);
720        assertEquals(revBearerData.alertIndicatorSet, true);
721        assertEquals(revBearerData.alert, bearerData.alert);
722        bearerData.alert = BearerData.ALERT_HIGH_PRIO;
723        encodedSms = BearerData.encode(bearerData);
724        revBearerData = BearerData.decode(encodedSms);
725        assertEquals(revBearerData.userData.payloadStr, userData.payloadStr);
726        assertEquals(revBearerData.alertIndicatorSet, true);
727        assertEquals(revBearerData.alert, bearerData.alert);
728    }
729
730    @SmallTest
731    public void testLanguageIndicator() throws Exception {
732        String pdu1 = "0003104090011748bea794e0731436ef3bd7c2e0352eef27a1c263fe58080d0101";
733        BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
734        assertEquals(bd1.userData.payloadStr, "Test Language indicator");
735        assertEquals(bd1.language, BearerData.LANGUAGE_ENGLISH);
736        String pdu2 = "0003104090011748bea794e0731436ef3bd7c2e0352eef27a1c263fe58080d0106";
737        BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
738        assertEquals(bd2.userData.payloadStr, "Test Language indicator");
739        assertEquals(bd2.language, BearerData.LANGUAGE_CHINESE);
740    }
741
742    @SmallTest
743    public void testLanguageIndicatorFeedback() throws Exception {
744        BearerData bearerData = new BearerData();
745        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
746        bearerData.messageId = 0;
747        bearerData.hasUserDataHeader = false;
748        UserData userData = new UserData();
749        userData.payloadStr = "test language indicator";
750        bearerData.userData = userData;
751        bearerData.language = BearerData.LANGUAGE_ENGLISH;
752        bearerData.languageIndicatorSet = true;
753        byte []encodedSms = BearerData.encode(bearerData);
754        BearerData revBearerData = BearerData.decode(encodedSms);
755        assertEquals(revBearerData.userData.payloadStr, userData.payloadStr);
756        assertEquals(revBearerData.languageIndicatorSet, true);
757        assertEquals(revBearerData.language, bearerData.language);
758        bearerData.language = BearerData.LANGUAGE_KOREAN;
759        encodedSms = BearerData.encode(bearerData);
760        revBearerData = BearerData.decode(encodedSms);
761        assertEquals(revBearerData.userData.payloadStr, userData.payloadStr);
762        assertEquals(revBearerData.languageIndicatorSet, true);
763        assertEquals(revBearerData.language, bearerData.language);
764    }
765
766    @SmallTest
767    public void testDisplayMode() throws Exception {
768        String pdu1 = "0003104090010c485f4194dfea34becf61b8400f0100";
769        BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
770        assertEquals(bd1.displayMode, BearerData.DISPLAY_MODE_IMMEDIATE);
771        String pdu2 = "0003104090010c485f4194dfea34becf61b8400f0140";
772        BearerData bd2 = BearerData.decode(HexDump.hexStringToByteArray(pdu2));
773        assertEquals(bd2.displayMode, BearerData.DISPLAY_MODE_DEFAULT);
774        String pdu3 = "0003104090010c485f4194dfea34becf61b8400f0180";
775        BearerData bd3 = BearerData.decode(HexDump.hexStringToByteArray(pdu3));
776        assertEquals(bd3.displayMode, BearerData.DISPLAY_MODE_USER);
777    }
778
779    @SmallTest
780    public void testDisplayModeFeedback() throws Exception {
781        BearerData bearerData = new BearerData();
782        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
783        bearerData.messageId = 0;
784        bearerData.hasUserDataHeader = false;
785        UserData userData = new UserData();
786        userData.payloadStr = "test display mode";
787        bearerData.userData = userData;
788        bearerData.displayMode = BearerData.DISPLAY_MODE_IMMEDIATE;
789        bearerData.displayModeSet = true;
790        byte []encodedSms = BearerData.encode(bearerData);
791        BearerData revBearerData = BearerData.decode(encodedSms);
792        assertEquals(revBearerData.userData.payloadStr, userData.payloadStr);
793        assertEquals(revBearerData.displayModeSet, true);
794        assertEquals(revBearerData.displayMode, bearerData.displayMode);
795        bearerData.displayMode = BearerData.DISPLAY_MODE_USER;
796        encodedSms = BearerData.encode(bearerData);
797        revBearerData = BearerData.decode(encodedSms);
798        assertEquals(revBearerData.userData.payloadStr, userData.payloadStr);
799        assertEquals(revBearerData.displayModeSet, true);
800        assertEquals(revBearerData.displayMode, bearerData.displayMode);
801    }
802
803    @SmallTest
804    public void testIs91() throws Exception {
805        String pdu1 = "000320001001070c2039acc13880";
806        BearerData bd1 = BearerData.decode(HexDump.hexStringToByteArray(pdu1));
807        assertEquals(bd1.callbackNumber.address, "3598271");
808        String pdu4 = "000320001001080c283c314724b34e";
809        BearerData bd4 = BearerData.decode(HexDump.hexStringToByteArray(pdu4));
810        assertEquals(bd4.userData.payloadStr, "ABCDEFG");
811    }
812
813    @SmallTest
814    public void testUserDataHeaderWithEightCharMsg() throws Exception {
815        encodeDecodeAssertEquals("01234567", 2, 2, false);
816    }
817
818    private void encodeDecodeAssertEquals(String payload, int index, int total,
819            boolean oddLengthHeader) throws Exception {
820        BearerData bearerData = new BearerData();
821        bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER;
822        bearerData.messageId = 55;
823        SmsHeader smsHeader = new SmsHeader();
824        if (oddLengthHeader) {
825            // Odd length header to verify correct UTF-16 header padding
826            SmsHeader.MiscElt miscElt = new SmsHeader.MiscElt();
827            miscElt.id = 0x27;  // reserved for future use; ignored on decode
828            miscElt.data = new byte[]{0x12, 0x34};
829            smsHeader.miscEltList.add(miscElt);
830        } else {
831            // Even length header normally generated for concatenated SMS.
832            SmsHeader.ConcatRef concatRef = new SmsHeader.ConcatRef();
833            concatRef.refNumber = 0xEE;
834            concatRef.msgCount = total;
835            concatRef.seqNumber = index;
836            concatRef.isEightBits = true;
837            smsHeader.concatRef = concatRef;
838        }
839        byte[] encodeHeader = SmsHeader.toByteArray(smsHeader);
840        if (oddLengthHeader) {
841            assertEquals(4, encodeHeader.length);     // 5 bytes with UDH length
842        } else {
843            assertEquals(5, encodeHeader.length);     // 6 bytes with UDH length
844        }
845        UserData userData = new UserData();
846        userData.payloadStr = payload;
847        userData.userDataHeader = smsHeader;
848        bearerData.userData = userData;
849        byte[] encodedSms = BearerData.encode(bearerData);
850        BearerData revBearerData = BearerData.decode(encodedSms);
851        assertEquals(userData.payloadStr, revBearerData.userData.payloadStr);
852        assertTrue(revBearerData.hasUserDataHeader);
853        byte[] header = SmsHeader.toByteArray(revBearerData.userData.userDataHeader);
854        if (oddLengthHeader) {
855            assertEquals(4, header.length);     // 5 bytes with UDH length
856        } else {
857            assertEquals(5, header.length);     // 6 bytes with UDH length
858        }
859        assertTrue(Arrays.equals(encodeHeader, header));
860    }
861
862    @SmallTest
863    public void testFragmentText() throws Exception {
864        boolean isCdmaPhone = (TelephonyManager.getDefault().getPhoneType() ==
865                TelephonyManager.PHONE_TYPE_CDMA);
866        // Valid 160 character ASCII text.
867        String text1 = "123456789012345678901234567890123456789012345678901234567890" +
868                "1234567890123456789012345678901234567890123456789012345678901234567890" +
869                "12345678901234567890123456789[";
870        TextEncodingDetails ted = SmsMessage.calculateLength(text1, false);
871        assertEquals(ted.msgCount, 1);
872        assertEquals(ted.codeUnitCount, 160);
873        assertEquals(ted.codeUnitSize, 1);
874        if (isCdmaPhone) {
875            ArrayList<String> fragments = android.telephony.SmsMessage.fragmentText(text1);
876            assertEquals(fragments.size(), 1);
877        }
878
879        /*
880           This is not a valid test: we will never encode a single-segment
881           EMS message.  Leaving this here, since we may try to support
882           this in the future.
883
884        // Valid 160 character GSM text -- the last character is
885        // non-ASCII, and so this will currently generate a singleton
886        // EMS message, which is not necessarily supported by Verizon.
887        String text2 = "123456789012345678901234567890123456789012345678901234567890" +
888                "1234567890123456789012345678901234567890123456789012345678901234567890" +
889                "12345678901234567890123456789\u00a3";  // Trailing pound-currency sign.
890        ted = SmsMessage.calculateLength(text2, false);
891        assertEquals(ted.msgCount, 1);
892        assertEquals(ted.codeUnitCount, 160);
893        assertEquals(ted.codeUnitSize, 1);
894        if (isCdmaPhone) {
895            ArrayList<String> fragments = android.telephony.SmsMessage.fragmentText(text2);
896            assertEquals(fragments.size(), 1);
897        }
898        */
899
900        // *IF* we supported single-segment EMS, this text would result in a
901        // single fragment with 7-bit encoding. But we don't, so this text
902        // results in three fragments of 16-bit encoding.
903        String text2 = "123456789012345678901234567890123456789012345678901234567890" +
904                "1234567890123456789012345678901234567890123456789012345678901234567890" +
905                "12345678901234567890123456789\u00a3";  // Trailing pound-currency sign.
906        ted = SmsMessage.calculateLength(text2, false);
907        assertEquals(3, ted.msgCount);
908        assertEquals(160, ted.codeUnitCount);
909        assertEquals(3, ted.codeUnitSize);
910        if (isCdmaPhone) {
911            ArrayList<String> fragments = android.telephony.SmsMessage.fragmentText(text2);
912            assertEquals(3, fragments.size());
913
914            for (int i = 0; i < 3; i++) {
915                encodeDecodeAssertEquals(fragments.get(i), i + 1, 3, false);
916                encodeDecodeAssertEquals(fragments.get(i), i + 1, 3, true);
917            }
918        }
919
920        // Test case for multi-part UTF-16 message.
921        String text3 = sUnicodeChars + sUnicodeChars + sUnicodeChars;
922        ted = SmsMessage.calculateLength(text3, false);
923        assertEquals(3, ted.msgCount);
924        assertEquals(189, ted.codeUnitCount);
925        assertEquals(3, ted.codeUnitSize);
926        if (isCdmaPhone) {
927            ArrayList<String> fragments = android.telephony.SmsMessage.fragmentText(text3);
928            assertEquals(3, fragments.size());
929
930            for (int i = 0; i < 3; i++) {
931                encodeDecodeAssertEquals(fragments.get(i), i + 1, 3, false);
932                encodeDecodeAssertEquals(fragments.get(i), i + 1, 3, true);
933            }
934        }
935    }
936}
937