2 * Copyright (C) 2006 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com
.android
.internal
.telephony
.cdma
.sms
;
19 import android
.telephony
.TelephonyManager
;
20 import android
.test
.AndroidTestCase
;
21 import android
.test
.suitebuilder
.annotation
.SmallTest
;
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
;
28 import java
.util
.ArrayList
;
29 import java
.util
.Arrays
;
31 public class CdmaSmsTest
extends AndroidTestCase
{
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";
43 // "Hello, world" in Japanese.
44 private static final String sHelloWorldJa
= "\u3053\u3093\u306b\u3061\u306f\u4e16\u754c";
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
]);
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
]);
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
]);
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
]);
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
]);
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);
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
);
125 public void testUserData7bitAscii() throws Exception
{
126 String pdu
= "0003100160010610262d5ab500";
127 BearerData bearerData
= BearerData
.decode(HexDump
.hexStringToByteArray(pdu
));
128 assertEquals("bjjj", bearerData
.userData
.payloadStr
);
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
);
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
);
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
);
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" +
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
);
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
);
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");
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");
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);
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);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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);
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");
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
);
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
);
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
);
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
);
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
);
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");
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);
825 public void testShiftJis() throws Exception
{
826 encodeDecodeAssertEquals(sHelloWorldJa
, null, UserData
.ENCODING_UNICODE_16
);
827 encodeDecodeAssertEquals(sHelloWorldJa
, null, UserData
.ENCODING_SHIFT_JIS
);
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
);
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
);
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
);
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
);
864 // Return a user data header for a concatenated message
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
;
876 // Return a user data header of odd length to verify correct UTF-16 header padding
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
);
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;
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
));
908 assertFalse(revBearerData
.hasUserDataHeader
);
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);
925 ArrayList
<String
> fragments
= android
.telephony
.SmsMessage
.fragmentText(text1
);
926 assertEquals(fragments
.size(), 1);
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
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);
945 ArrayList<String> fragments = android.telephony.SmsMessage.fragmentText(text2);
946 assertEquals(fragments.size(), 1);
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
);
961 ArrayList
<String
> fragments
= android
.telephony
.SmsMessage
.fragmentText(text2
);
962 assertEquals(3, fragments
.size());
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);
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
);
979 ArrayList
<String
> fragments
= android
.telephony
.SmsMessage
.fragmentText(text3
);
980 assertEquals(3, fragments
.size());
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);