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