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