1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.smspush.unitTests; 18 19 import android.app.Activity; 20 import android.content.ComponentName; 21 import android.content.Context; 22 import android.content.Intent; 23 import android.content.ServiceConnection; 24 import android.os.IBinder; 25 import android.os.RemoteException; 26 import android.provider.Telephony.Sms.Intents; 27 import android.test.ServiceTestCase; 28 import android.util.Log; 29 30 import com.android.internal.telephony.IccUtils; 31 import com.android.internal.telephony.IWapPushManager; 32 import com.android.internal.telephony.WapPushManagerParams; 33 import com.android.internal.telephony.WspTypeDecoder; 34 import com.android.internal.util.HexDump; 35 import com.android.smspush.WapPushManager; 36 37 import java.util.Random; 38 39 /** 40 * This is a simple framework for a test of a Service. See {@link android.test.ServiceTestCase 41 * ServiceTestCase} for more information on how to write and extend service tests. 42 * 43 * To run this test, you can type: 44 * adb shell am instrument -w \ 45 * -e class com.android.smspush.unitTests.WapPushTest \ 46 * com.android.smspush.unitTests/android.test.InstrumentationTestRunner 47 */ 48 public class WapPushTest extends ServiceTestCase<WapPushManager> { 49 private static final String LOG_TAG = "WAP PUSH"; 50 private static final boolean LOCAL_LOGV = false; 51 private static final int TIME_WAIT = 100; 52 53 protected int mAppIdValue = 0x8002; 54 protected String mAppIdName = "x-wap-application:*"; 55 protected int mContentTypeValue = 0x030a; 56 protected String mContentTypeName = "application/vnd.wap.sic"; 57 58 protected String mPackageName; 59 protected String mClassName; 60 61 protected byte[] mGsmHeader = { 62 (byte) 0x00, // sc address 63 (byte) 0x40, // TP-MTI 64 (byte) 0x04, // sender address length? 65 (byte) 0x81, (byte) 0x55, (byte) 0x45, // sender address? 66 (byte) 0x00, // data schema 67 (byte) 0x00, // proto ID 68 (byte) 0x01, (byte) 0x60, (byte) 0x12, (byte) 0x31, 69 (byte) 0x74, (byte) 0x34, (byte) 0x63 // time stamp 70 }; 71 72 protected byte[] mUserDataHeader = { 73 (byte) 0x07, // UDH len 74 (byte) 0x06, // header len 75 (byte) 0x05, // port addressing type? 76 (byte) 0x00, // dummy 77 (byte) 0x0B, (byte) 0x84, // dest port 78 (byte) 0x23, (byte) 0xF0 // src port 79 }; 80 81 protected byte[] mWspHeader; 82 83 protected byte[] mMessageBody = { 84 (byte) 0x00, 85 (byte) 0x01, 86 (byte) 0x02, 87 (byte) 0x03, 88 (byte) 0x04, 89 (byte) 0x05, 90 (byte) 0x06, 91 (byte) 0x07, 92 (byte) 0x08, 93 (byte) 0x09, 94 (byte) 0x0a, 95 (byte) 0x0b, 96 (byte) 0x0c, 97 (byte) 0x0d, 98 (byte) 0x0e, 99 (byte) 0x0f 100 }; 101 102 protected int mWspHeaderStart; 103 protected int mWspHeaderLen; 104 protected int mWspContentTypeStart; 105 106 /** 107 * OMA application ID in binary form 108 * http://www.openmobilealliance.org/tech/omna/omna-push-app-id.aspx 109 */ 110 final int[] OMA_APPLICATION_ID_VALUES = new int[] { 111 0x00, 112 0x01, 113 0x02, 114 0x03, 115 0x04, 116 0x05, 117 0x06, 118 0x07, 119 0x08, 120 0x09, 121 0x0A, 122 0x8000, 123 0x8001, 124 0x8002, 125 0x8003, 126 0x8004, 127 0x8005, 128 0x8006, 129 0x8007, 130 0x8008, 131 0x8009, 132 0x800B, 133 0x8010 134 }; 135 136 /** 137 * OMA application ID in string form 138 * http://www.openmobilealliance.org/tech/omna/omna-push-app-id.aspx 139 */ 140 final String[] OMA_APPLICATION_ID_NAMES = new String[] { 141 "x-wap-application:*", 142 "x-wap-application:push.sia", 143 "x-wap-application:wml.ua", 144 "x-wap-application:wta.ua", 145 "x-wap-application:mms.ua", 146 "x-wap-application:push.syncml", 147 "x-wap-application:loc.ua", 148 "x-wap-application:syncml.dm", 149 "x-wap-application:drm.ua", 150 "x-wap-application:emn.ua", 151 "x-wap-application:wv.ua", 152 "x-wap-microsoft:localcontent.ua", 153 "x-wap-microsoft:IMclient.ua", 154 "x-wap-docomo:imode.mail.ua", 155 "x-wap-docomo:imode.mr.ua", 156 "x-wap-docomo:imode.mf.ua", 157 "x-motorola:location.ua", 158 "x-motorola:now.ua", 159 "x-motorola:otaprov.ua", 160 "x-motorola:browser.ua", 161 "x-motorola:splash.ua", 162 "x-wap-nai:mvsw.command", 163 "x-wap-openwave:iota.ua" 164 }; 165 166 /** 167 * OMA content type in binary form 168 * http://www.openmobilealliance.org/tech/omna/omna-wsp-content-type.aspx 169 */ 170 final int[] OMA_CONTENT_TYPE_VALUES = new int[] { 171 0x00, 172 0x01, 173 0x02, 174 0x03, 175 0x04, 176 0x05, 177 0x06, 178 0x07, 179 0x08, 180 0x09, 181 0x0A, 182 0x0B, 183 0x0C, 184 0x0D, 185 0x0E, 186 0x0F, 187 0x10, 188 0x11, 189 0x12, 190 0x13, 191 0x14, 192 0x15, 193 0x16, 194 0x17, 195 0x18, 196 0x19, 197 0x1A, 198 0x1B, 199 0x1C, 200 0x1D, 201 0x1E, 202 0x1F, 203 0x20, 204 0x21, 205 0x22, 206 0x23, 207 0x24, 208 0x25, 209 0x26, 210 0x27, 211 0x28, 212 0x29, 213 0x2A, 214 0x2B, 215 0x2C, 216 0x2D, 217 0x2E, 218 0x2F, 219 0x30, 220 0x31, 221 0x32, 222 0x33, 223 0x34, 224 0x35, 225 0x36, 226 0x37, 227 0x38, 228 0x39, 229 0x3A, 230 0x3B, 231 0x3C, 232 0x3D, 233 0x3E, 234 0x3F, 235 0x40, 236 0x41, 237 0x42, 238 0x43, 239 0x44, 240 0x45, 241 0x46, 242 0x47, 243 0x48, 244 0x49, 245 0x4A, 246 0x4B, 247 0x4C, 248 0x4D, 249 0x4E, 250 0x4F, 251 0x50, 252 0x51, 253 0x52, 254 0x53, 255 0x54, 256 // 0x55, 257 // 0x56, 258 // 0x57, 259 // 0x58, 260 0x0201, 261 0x0202, 262 0x0203, 263 0x0204, 264 0x0205, 265 0x0206, 266 0x0207, 267 0x0208, 268 0x0209, 269 0x020A, 270 0x020B, 271 0x020C, 272 0x0300, 273 0x0301, 274 0x0302, 275 0x0303, 276 0x0304, 277 0x0305, 278 0x0306, 279 0x0307, 280 0x0308, 281 0x0309, 282 0x030A, 283 0x030B, 284 0x030C, 285 0x030D, 286 0x030E, 287 0x030F, 288 0x0310, 289 0x0311, 290 0x0312, 291 0x0313, 292 0x0314, 293 0x0315, 294 0x0316, 295 0x0317, 296 0x0318, 297 0x0319, 298 0x031A, 299 0x031B 300 /*0x031C, 301 0x031D*/ 302 }; 303 304 /** 305 * OMA content type in string form 306 * http://www.openmobilealliance.org/tech/omna/omna-wsp-content-type.aspx 307 */ 308 final String[] OMA_CONTENT_TYPE_NAMES = new String[] { 309 "*/*", 310 "text/*", 311 "text/html", 312 "text/plain", 313 "text/x-hdml", 314 "text/x-ttml", 315 "text/x-vCalendar", 316 "text/x-vCard", 317 "text/vnd.wap.wml", 318 "text/vnd.wap.wmlscript", 319 "text/vnd.wap.wta-event", 320 "multipart/*", 321 "multipart/mixed", 322 "multipart/form-data", 323 "multipart/byterantes", 324 "multipart/alternative", 325 "application/*", 326 "application/java-vm", 327 "application/x-www-form-urlencoded", 328 "application/x-hdmlc", 329 "application/vnd.wap.wmlc", 330 "application/vnd.wap.wmlscriptc", 331 "application/vnd.wap.wta-eventc", 332 "application/vnd.wap.uaprof", 333 "application/vnd.wap.wtls-ca-certificate", 334 "application/vnd.wap.wtls-user-certificate", 335 "application/x-x509-ca-cert", 336 "application/x-x509-user-cert", 337 "image/*", 338 "image/gif", 339 "image/jpeg", 340 "image/tiff", 341 "image/png", 342 "image/vnd.wap.wbmp", 343 "application/vnd.wap.multipart.*", 344 "application/vnd.wap.multipart.mixed", 345 "application/vnd.wap.multipart.form-data", 346 "application/vnd.wap.multipart.byteranges", 347 "application/vnd.wap.multipart.alternative", 348 "application/xml", 349 "text/xml", 350 "application/vnd.wap.wbxml", 351 "application/x-x968-cross-cert", 352 "application/x-x968-ca-cert", 353 "application/x-x968-user-cert", 354 "text/vnd.wap.si", 355 "application/vnd.wap.sic", 356 "text/vnd.wap.sl", 357 "application/vnd.wap.slc", 358 "text/vnd.wap.co", 359 "application/vnd.wap.coc", 360 "application/vnd.wap.multipart.related", 361 "application/vnd.wap.sia", 362 "text/vnd.wap.connectivity-xml", 363 "application/vnd.wap.connectivity-wbxml", 364 "application/pkcs7-mime", 365 "application/vnd.wap.hashed-certificate", 366 "application/vnd.wap.signed-certificate", 367 "application/vnd.wap.cert-response", 368 "application/xhtml+xml", 369 "application/wml+xml", 370 "text/css", 371 "application/vnd.wap.mms-message", 372 "application/vnd.wap.rollover-certificate", 373 "application/vnd.wap.locc+wbxml", 374 "application/vnd.wap.loc+xml", 375 "application/vnd.syncml.dm+wbxml", 376 "application/vnd.syncml.dm+xml", 377 "application/vnd.syncml.notification", 378 "application/vnd.wap.xhtml+xml", 379 "application/vnd.wv.csp.cir", 380 "application/vnd.oma.dd+xml", 381 "application/vnd.oma.drm.message", 382 "application/vnd.oma.drm.content", 383 "application/vnd.oma.drm.rights+xml", 384 "application/vnd.oma.drm.rights+wbxml", 385 "application/vnd.wv.csp+xml", 386 "application/vnd.wv.csp+wbxml", 387 "application/vnd.syncml.ds.notification", 388 "audio/*", 389 "video/*", 390 "application/vnd.oma.dd2+xml", 391 "application/mikey", 392 "application/vnd.oma.dcd", 393 "application/vnd.oma.dcdc", 394 // "text/x-vMessage", 395 // "application/vnd.omads-email+wbxml", 396 // "text/x-vBookmark", 397 // "application/vnd.syncml.dm.notification", 398 "application/vnd.uplanet.cacheop-wbxml", 399 "application/vnd.uplanet.signal", 400 "application/vnd.uplanet.alert-wbxml", 401 "application/vnd.uplanet.list-wbxml", 402 "application/vnd.uplanet.listcmd-wbxml", 403 "application/vnd.uplanet.channel-wbxml", 404 "application/vnd.uplanet.provisioning-status-uri", 405 "x-wap.multipart/vnd.uplanet.header-set", 406 "application/vnd.uplanet.bearer-choice-wbxml", 407 "application/vnd.phonecom.mmc-wbxml", 408 "application/vnd.nokia.syncset+wbxml", 409 "image/x-up-wpng", 410 "application/iota.mmc-wbxml", 411 "application/iota.mmc-xml", 412 "application/vnd.syncml+xml", 413 "application/vnd.syncml+wbxml", 414 "text/vnd.wap.emn+xml", 415 "text/calendar", 416 "application/vnd.omads-email+xml", 417 "application/vnd.omads-file+xml", 418 "application/vnd.omads-folder+xml", 419 "text/directory;profile=vCard", 420 "application/vnd.wap.emn+wbxml", 421 "application/vnd.nokia.ipdc-purchase-response", 422 "application/vnd.motorola.screen3+xml", 423 "application/vnd.motorola.screen3+gzip", 424 "application/vnd.cmcc.setting+wbxml", 425 "application/vnd.cmcc.bombing+wbxml", 426 "application/vnd.docomo.pf", 427 "application/vnd.docomo.ub", 428 "application/vnd.omaloc-supl-init", 429 "application/vnd.oma.group-usage-list+xml", 430 "application/oma-directory+xml", 431 "application/vnd.docomo.pf2", 432 "application/vnd.oma.drm.roap-trigger+wbxml", 433 "application/vnd.sbm.mid2", 434 "application/vnd.wmf.bootstrap", 435 "application/vnc.cmcc.dcd+xml", 436 "application/vnd.sbm.cid", 437 "application/vnd.oma.bcast.provisioningtrigger", 438 /*"application/vnd.docomo.dm", 439 "application/vnd.oma.scidm.messages+xml"*/ 440 }; 441 442 private IDataVerify mIVerify = null; 443 444 ServiceConnection mConn = new ServiceConnection() { 445 public void onServiceConnected(ComponentName name, IBinder service) { 446 Log.v(LOG_TAG, "data verify interface connected."); 447 mIVerify = IDataVerify.Stub.asInterface(service); 448 } 449 public void onServiceDisconnected(ComponentName name) { 450 } 451 }; 452 453 /** 454 * Main WapPushManager test module constructor 455 */ 456 public WapPushTest() { 457 super(WapPushManager.class); 458 mClassName = this.getClass().getName(); 459 mPackageName = this.getClass().getPackage().getName(); 460 } 461 462 /** 463 * Initialize the verifier 464 */ 465 @Override 466 public void setUp() { 467 try { 468 super.setUp(); 469 // get verifier 470 getContext().bindService(new Intent(IDataVerify.class.getName()), 471 mConn, Context.BIND_AUTO_CREATE); 472 } catch (Exception e) { 473 Log.w(LOG_TAG, "super exception"); 474 } 475 // Log.d(LOG_TAG, "test setup"); 476 } 477 478 private IWapPushManager mWapPush = null; 479 IWapPushManager getInterface() { 480 if (mWapPush != null) return mWapPush; 481 Intent startIntent = new Intent(); 482 startIntent.setClass(getContext(), WapPushManager.class); 483 IBinder service = bindService(startIntent); 484 485 mWapPush = IWapPushManager.Stub.asInterface(service); 486 return mWapPush; 487 } 488 489 /* 490 * All methods need to start with 'test'. 491 * Use various assert methods to pass/fail the test case. 492 */ 493 protected void utAddPackage(boolean need_sig, boolean more_proc) { 494 IWapPushManager iwapman = getInterface(); 495 496 // insert new data 497 try { 498 assertTrue(iwapman.addPackage( 499 Integer.toString(mAppIdValue), 500 Integer.toString(mContentTypeValue), 501 mPackageName, mClassName, 502 WapPushManagerParams.APP_TYPE_SERVICE, need_sig, more_proc)); 503 } catch (RemoteException e) { 504 assertTrue(false); 505 } 506 507 // verify the data 508 WapPushManager wpman = getService(); 509 assertTrue(wpman.verifyData(Integer.toString(mAppIdValue), 510 Integer.toString(mContentTypeValue), 511 mPackageName, mClassName, 512 WapPushManagerParams.APP_TYPE_SERVICE, need_sig, more_proc)); 513 } 514 515 /** 516 * Add package test 517 */ 518 public void testAddPackage1() { 519 int originalAppIdValue = mAppIdValue; 520 int originalContentTypeValue = mContentTypeValue; 521 522 utAddPackage(true, true); 523 mAppIdValue += 10; 524 utAddPackage(true, false); 525 mContentTypeValue += 20; 526 utAddPackage(false, true); 527 mContentTypeValue += 20; 528 utAddPackage(false, false); 529 530 mAppIdValue = originalAppIdValue; 531 mContentTypeValue = originalContentTypeValue; 532 533 // clean up data 534 try { 535 IWapPushManager iwapman = getInterface(); 536 iwapman.deletePackage(Integer.toString(mAppIdValue), 537 Integer.toString(mContentTypeValue), mPackageName, mClassName); 538 mAppIdValue += 10; 539 iwapman.deletePackage(Integer.toString(mAppIdValue), 540 Integer.toString(mContentTypeValue), mPackageName, mClassName); 541 mContentTypeValue += 20; 542 iwapman.deletePackage(Integer.toString(mAppIdValue), 543 Integer.toString(mContentTypeValue), mPackageName, mClassName); 544 mContentTypeValue += 20; 545 iwapman.deletePackage(Integer.toString(mAppIdValue), 546 Integer.toString(mContentTypeValue), mPackageName, mClassName); 547 } catch (RemoteException e) { 548 assertTrue(false); 549 } 550 mAppIdValue = originalAppIdValue; 551 mContentTypeValue = originalContentTypeValue; 552 } 553 554 /** 555 * Add duprecated package test. 556 */ 557 public void testAddPackage2() { 558 try { 559 IWapPushManager iwapman = getInterface(); 560 561 // set up data 562 iwapman.addPackage(Integer.toString(mAppIdValue), 563 Integer.toString(mContentTypeValue), mPackageName, mClassName, 0, 564 false, false); 565 iwapman.addPackage(Integer.toString(mAppIdValue + 10), 566 Integer.toString(mContentTypeValue), mPackageName, mClassName, 0, 567 false, false); 568 iwapman.addPackage(Integer.toString(mAppIdValue), 569 Integer.toString(mContentTypeValue + 10), mPackageName, mClassName, 0, 570 false, false); 571 572 assertFalse(iwapman.addPackage(Integer.toString(mAppIdValue), 573 Integer.toString(mContentTypeValue), mPackageName, mClassName, 0, 574 false, false)); 575 assertFalse(iwapman.addPackage(Integer.toString(mAppIdValue + 10), 576 Integer.toString(mContentTypeValue), mPackageName, mClassName, 0, 577 false, false)); 578 assertFalse(iwapman.addPackage(Integer.toString(mAppIdValue), 579 Integer.toString(mContentTypeValue + 10), mPackageName, mClassName, 0, 580 false, false)); 581 582 // clean up data 583 iwapman.deletePackage(Integer.toString(mAppIdValue), 584 Integer.toString(mContentTypeValue), mPackageName, mClassName); 585 iwapman.deletePackage(Integer.toString(mAppIdValue + 10), 586 Integer.toString(mContentTypeValue), mPackageName, mClassName); 587 iwapman.deletePackage(Integer.toString(mAppIdValue), 588 Integer.toString(mContentTypeValue + 10), mPackageName, mClassName); 589 } catch (RemoteException e) { 590 assertTrue(false); 591 } 592 } 593 594 protected void utUpdatePackage(boolean need_sig, boolean more_proc) { 595 IWapPushManager iwapman = getInterface(); 596 597 // insert new data 598 try { 599 assertTrue(iwapman.updatePackage( 600 Integer.toString(mAppIdValue), 601 Integer.toString(mContentTypeValue), 602 mPackageName, mClassName, 603 WapPushManagerParams.APP_TYPE_SERVICE, need_sig, more_proc)); 604 } catch (RemoteException e) { 605 assertTrue(false); 606 } 607 608 // verify the data 609 WapPushManager wpman = getService(); 610 assertTrue(wpman.verifyData( 611 Integer.toString(mAppIdValue), 612 Integer.toString(mContentTypeValue), 613 mPackageName, mClassName, 614 WapPushManagerParams.APP_TYPE_SERVICE, need_sig, more_proc)); 615 } 616 617 /** 618 * Updating package test 619 */ 620 public void testUpdatePackage1() { 621 int originalAppIdValue = mAppIdValue; 622 int originalContentTypeValue = mContentTypeValue; 623 624 // set up data 625 try { 626 IWapPushManager iwapman = getInterface(); 627 628 iwapman.addPackage(Integer.toString(mAppIdValue), 629 Integer.toString(mContentTypeValue), mPackageName, mClassName, 630 0, false, false); 631 mAppIdValue += 10; 632 iwapman.addPackage(Integer.toString(mAppIdValue), 633 Integer.toString(mContentTypeValue), mPackageName, mClassName, 634 0, false, false); 635 mContentTypeValue += 20; 636 iwapman.addPackage(Integer.toString(mAppIdValue), 637 Integer.toString(mContentTypeValue), mPackageName, mClassName, 638 0, false, false); 639 mContentTypeValue += 20; 640 iwapman.addPackage(Integer.toString(mAppIdValue), 641 Integer.toString(mContentTypeValue), mPackageName, mClassName, 642 0, false, false); 643 } catch (RemoteException e) { 644 assertTrue(false); 645 } 646 647 mAppIdValue = originalAppIdValue; 648 mContentTypeValue = originalContentTypeValue; 649 utUpdatePackage(false, false); 650 mAppIdValue += 10; 651 utUpdatePackage(false, true); 652 mContentTypeValue += 20; 653 utUpdatePackage(true, false); 654 mContentTypeValue += 20; 655 utUpdatePackage(true, true); 656 657 mAppIdValue = originalAppIdValue; 658 mContentTypeValue = originalContentTypeValue; 659 660 // clean up data 661 try { 662 IWapPushManager iwapman = getInterface(); 663 664 iwapman.deletePackage(Integer.toString(mAppIdValue), 665 Integer.toString(mContentTypeValue), mPackageName, mClassName); 666 mAppIdValue += 10; 667 iwapman.deletePackage(Integer.toString(mAppIdValue), 668 Integer.toString(mContentTypeValue), mPackageName, mClassName); 669 mContentTypeValue += 20; 670 iwapman.deletePackage(Integer.toString(mAppIdValue), 671 Integer.toString(mContentTypeValue), mPackageName, mClassName); 672 mContentTypeValue += 20; 673 iwapman.deletePackage(Integer.toString(mAppIdValue), 674 Integer.toString(mContentTypeValue), mPackageName, mClassName); 675 } catch (RemoteException e) { 676 assertTrue(false); 677 } 678 mAppIdValue = originalAppIdValue; 679 mContentTypeValue = originalContentTypeValue; 680 } 681 682 /** 683 * Updating invalid package test 684 */ 685 public void testUpdatePackage2() { 686 int originalAppIdValue = mAppIdValue; 687 int originalContentTypeValue = mContentTypeValue; 688 689 try { 690 // set up data 691 IWapPushManager iwapman = getInterface(); 692 693 iwapman.addPackage(Integer.toString(mAppIdValue), 694 Integer.toString(mContentTypeValue), mPackageName, mClassName, 695 0, false, false); 696 assertFalse(iwapman.updatePackage( 697 Integer.toString(mAppIdValue + 10), 698 Integer.toString(mContentTypeValue), 699 mPackageName, mClassName, 0, false, false)); 700 assertFalse(iwapman.updatePackage( 701 Integer.toString(mAppIdValue), 702 Integer.toString(mContentTypeValue + 10), 703 mPackageName, mClassName, 0, false, false)); 704 assertTrue(iwapman.updatePackage( 705 Integer.toString(mAppIdValue), 706 Integer.toString(mContentTypeValue), 707 mPackageName + "dummy_data", mClassName, 0, false, false)); 708 assertTrue(iwapman.updatePackage( 709 Integer.toString(mAppIdValue), 710 Integer.toString(mContentTypeValue), 711 mPackageName, mClassName + "dummy_data", 0, false, false)); 712 // clean up data 713 iwapman.deletePackage(Integer.toString(mAppIdValue), 714 Integer.toString(mContentTypeValue), mPackageName, mClassName); 715 iwapman.deletePackage(Integer.toString(mAppIdValue), 716 Integer.toString(mContentTypeValue), mPackageName, 717 mClassName + "dummy_data"); 718 } catch (RemoteException e) { 719 assertTrue(false); 720 } 721 } 722 723 protected void utDeletePackage() { 724 IWapPushManager iwapman = getInterface(); 725 726 try { 727 assertTrue(iwapman.deletePackage( 728 Integer.toString(mAppIdValue), 729 Integer.toString(mContentTypeValue), 730 mPackageName, mClassName)); 731 } catch (RemoteException e) { 732 assertTrue(false); 733 } 734 735 // verify the data 736 WapPushManager wpman = getService(); 737 assertTrue(!wpman.isDataExist( 738 Integer.toString(mAppIdValue), 739 Integer.toString(mContentTypeValue), 740 mPackageName, mClassName)); 741 } 742 743 /** 744 * Deleting package test 745 */ 746 public void testDeletePackage1() { 747 int originalAppIdValue = mAppIdValue; 748 int originalContentTypeValue = mContentTypeValue; 749 750 // set up data 751 try { 752 IWapPushManager iwapman = getInterface(); 753 754 iwapman.addPackage(Integer.toString(mAppIdValue), 755 Integer.toString(mContentTypeValue), mPackageName, mClassName, 756 0, false, false); 757 mAppIdValue += 10; 758 iwapman.addPackage(Integer.toString(mAppIdValue), 759 Integer.toString(mContentTypeValue), mPackageName, mClassName, 760 0, false, false); 761 mContentTypeValue += 20; 762 iwapman.addPackage(Integer.toString(mAppIdValue), 763 Integer.toString(mContentTypeValue), mPackageName, mClassName, 764 0, false, false); 765 mContentTypeValue += 20; 766 iwapman.addPackage(Integer.toString(mAppIdValue), 767 Integer.toString(mContentTypeValue), mPackageName, mClassName, 768 0, false, false); 769 } catch (RemoteException e) { 770 assertTrue(false); 771 } 772 773 mAppIdValue = originalAppIdValue; 774 mContentTypeValue = originalContentTypeValue; 775 utDeletePackage(); 776 mAppIdValue += 10; 777 utDeletePackage(); 778 mContentTypeValue += 20; 779 utDeletePackage(); 780 mContentTypeValue += 20; 781 utDeletePackage(); 782 783 mAppIdValue = originalAppIdValue; 784 mContentTypeValue = originalContentTypeValue; 785 } 786 787 /** 788 * Deleting invalid package test 789 */ 790 public void testDeletePackage2() { 791 int originalAppIdValue = mAppIdValue; 792 int originalContentTypeValue = mContentTypeValue; 793 794 try { 795 // set up data 796 IWapPushManager iwapman = getInterface(); 797 798 iwapman.addPackage(Integer.toString(mAppIdValue), 799 Integer.toString(mContentTypeValue), mPackageName, mClassName, 800 0, false, false); 801 802 assertFalse(iwapman.deletePackage(Integer.toString(mAppIdValue + 10), 803 Integer.toString(mContentTypeValue), mPackageName, mClassName)); 804 assertFalse(iwapman.deletePackage(Integer.toString(mAppIdValue), 805 Integer.toString(mContentTypeValue + 20), mPackageName, mClassName)); 806 assertFalse(iwapman.deletePackage(Integer.toString(mAppIdValue + 10), 807 Integer.toString(mContentTypeValue + 20), mPackageName, mClassName)); 808 809 iwapman.deletePackage(Integer.toString(mAppIdValue), 810 Integer.toString(mContentTypeValue), mPackageName, mClassName); 811 812 } catch (RemoteException e) { 813 assertTrue(false); 814 } 815 } 816 817 818 protected int encodeUint32(int uint32Val, byte[] arr, int start) { 819 int bit = 1; 820 int topbit = 0; 821 int encodeLen; 822 int tmpVal; 823 824 assertTrue(uint32Val >= 0); 825 for (int i = 0; i < 31; i++) { 826 if ((bit & uint32Val) > 0) topbit = i; 827 bit = (bit << 1); 828 } 829 encodeLen = topbit/7 + 1; 830 if (arr == null) return encodeLen; 831 832 //Log.d(LOG_TAG, "uint32Val = " + Integer.toHexString(uint32Val) + ", topbit = " 833 // + topbit + ", encodeLen = " + encodeLen); 834 835 tmpVal = uint32Val; 836 for (int i = encodeLen - 1; i >= 0; i--) { 837 long val = 0; 838 if (i < encodeLen - 1) val = 0x80; 839 val |= tmpVal & 0x7f; 840 arr[start + i] = (byte) (val & 0xFF); 841 tmpVal = (tmpVal >> 7); 842 } 843 return encodeLen; 844 } 845 846 protected int encodeShortInt(int sintVal, byte[] arr, int start) { 847 int encodeLen = 0; 848 849 if (sintVal >= 0x80) return encodeLen; 850 encodeLen = 1; 851 arr[start] = (byte) (sintVal | 0x80); 852 return encodeLen; 853 } 854 855 856 /** 857 * Generate Random WSP header with integer application ID 858 */ 859 protected void createRandomWspHeader(byte[] arr, Random rd, int headerStart, 860 boolean noAppId) { 861 862 boolean appIdAdded = false; 863 864 Log.d(LOG_TAG, "headerStart = " + headerStart + ", appId = " + mAppIdValue 865 + "(" + Integer.toHexString(mAppIdValue) + ")"); 866 Log.d(LOG_TAG, "random arr length:" + arr.length); 867 String typename[] = new String[] { "short int", "long int", "string", "uint32"}; 868 869 while (!appIdAdded) { 870 int type; 871 int index = headerStart; 872 int len = arr.length; 873 int i; 874 boolean addAppid = false; 875 int tmpVal = 0; 876 int tmpVal2 = 0; 877 878 while (true) { 879 int add; 880 881 /* 882 * field name 883 * 0: short int 884 * 1: long int 885 * 2: text 886 * (no uint for param value) 887 */ 888 type = rd.nextInt(3); 889 switch (type) { 890 case 0: // header short integer 891 if (index > 100 && !appIdAdded) addAppid = true; 892 add = 1; 893 break; 894 case 1: // header long int 895 add = 1 + rd.nextInt(29); 896 break; 897 default: // header string 898 add = 2 + rd.nextInt(10); 899 break; 900 } 901 if (index + add >= len) break; 902 903 // fill header name 904 switch (type) { 905 case 0: // header short integer 906 if (!addAppid) { 907 do { 908 arr[index] = (byte) (0x80 | rd.nextInt(128)); 909 } while (arr[index] == (byte) 0xaf); 910 } else { 911 Log.d(LOG_TAG, "appId added."); 912 arr[index] = (byte) 0xaf; 913 // if noAppId case, appId fld must be decieved. 914 if (noAppId) arr[index]++; 915 } 916 break; 917 case 1: // header long int 918 arr[index] = (byte) (add - 1); 919 tmpVal2 = 0; 920 for (i = 1; i < add; i++) { 921 tmpVal = rd.nextInt(255); 922 tmpVal2 = (tmpVal2 << 8) | tmpVal; 923 arr[index + i] = (byte) tmpVal; 924 } 925 // don't set application id 926 if (tmpVal2 == 0x2f) arr[index + 1]++; 927 break; 928 default: // header string 929 for (i = 0; i < add - 1; i++) { 930 tmpVal = rd.nextInt(127); 931 if (tmpVal < 32) tmpVal= (32 + tmpVal); 932 arr[index + i] = (byte) tmpVal; 933 } 934 arr[index + i] = (byte) 0x0; 935 break; 936 } 937 938 if (LOCAL_LOGV) { 939 Log.d(LOG_TAG, "field name index:" + index); 940 Log.d(LOG_TAG, "type:" + typename[type] + ", add:" + add); 941 if (type != 2) { 942 for (i = index; i< index + add; i++) { 943 System.out.print(Integer.toHexString(0xff & arr[i])); 944 System.out.print(' '); 945 } 946 } else { 947 System.out.print(Integer.toHexString(0xff & arr[index])); 948 System.out.print(' '); 949 String str = new String(arr, index + 1, add - 2); 950 for (i = 0; i < str.length(); i++) { 951 System.out.print(str.charAt(i)); 952 System.out.print(' '); 953 } 954 } 955 System.out.print('\n'); 956 } 957 index += add; 958 959 960 /* 961 * field value 962 * 0: short int 963 * 1: long int 964 * 2: text 965 * 3: uint 966 */ 967 if (addAppid) { 968 type = 1; 969 } else { 970 type = rd.nextInt(4); 971 } 972 switch (type) { 973 case 0: // header short integer 974 add = 1; 975 break; 976 case 1: // header long int 977 if (addAppid) { 978 int bit = 1; 979 int topBit = 0; 980 981 for (i = 0; i < 31; i++) { 982 if ((mAppIdValue & bit) > 0) topBit = i; 983 bit = (bit << 1); 984 } 985 add = 2 + topBit/8; 986 } else { 987 add = 1 + rd.nextInt(29); 988 } 989 break; 990 case 2: // header string 991 add = 2 + rd.nextInt(10); 992 break; 993 default: // uint32 994 add = 6; 995 } 996 if (index + add >= len) break; 997 998 // fill field value 999 switch (type) { 1000 case 0: // header short int 1001 arr[index] = (byte) (0x80 | rd.nextInt(128)); 1002 break; 1003 case 1: // header long int 1004 if (addAppid) { 1005 addAppid = false; 1006 appIdAdded = true; 1007 1008 arr[index] = (byte) (add - 1); 1009 tmpVal = mAppIdValue; 1010 for (i = add; i > 1; i--) { 1011 arr[index + i - 1] = (byte) (tmpVal & 0xff); 1012 tmpVal = (tmpVal >> 8); 1013 } 1014 } else { 1015 arr[index] = (byte) (add - 1); 1016 for (i = 1; i < add; i++) { 1017 arr[index + i] = (byte) rd.nextInt(255); 1018 } 1019 } 1020 break; 1021 case 2:// header string 1022 for (i = 0; i < add - 1; i++) { 1023 tmpVal = rd.nextInt(127); 1024 if (tmpVal < 32) tmpVal= (32 + tmpVal); 1025 arr[index + i] = (byte) tmpVal; 1026 } 1027 arr[index + i] = (byte) 0x0; 1028 break; 1029 default: // header uvarint 1030 arr[index] = (byte) 31; 1031 tmpVal = rd.nextInt(0x0FFFFFFF); 1032 add = 1 + encodeUint32(tmpVal, null, index + 1); 1033 encodeUint32(tmpVal, arr, index + 1); 1034 break; 1035 1036 } 1037 1038 if (LOCAL_LOGV) { 1039 Log.d(LOG_TAG, "field value index:" + index); 1040 Log.d(LOG_TAG, "type:" + typename[type] + ", add:" + add); 1041 if (type != 2) { 1042 for (i = index; i< index + add; i++) { 1043 System.out.print(Integer.toHexString(0xff & arr[i])); 1044 System.out.print(' '); 1045 } 1046 } else { 1047 System.out.print(Integer.toHexString(0xff & arr[index])); 1048 System.out.print(' '); 1049 String str = new String(arr, index + 1, add - 2); 1050 for (i = 0; i < str.length(); i++) { 1051 System.out.print(str.charAt(i)); 1052 System.out.print(' '); 1053 } 1054 } 1055 System.out.print('\n'); 1056 } 1057 index += add; 1058 } 1059 if (noAppId) break; 1060 } 1061 1062 Log.d(LOG_TAG, HexDump.dumpHexString(arr)); 1063 } 1064 1065 /** 1066 * Generate Random WSP header with string application ID 1067 */ 1068 protected void createRandomWspHeaderStrAppId(byte[] arr, Random rd, int headerStart, 1069 boolean randomStr) { 1070 1071 boolean appIdAdded = false; 1072 1073 Log.d(LOG_TAG, "random arr length:" + arr.length); 1074 String typename[] = new String[] { "short int", "long int", "string", "uint32"}; 1075 1076 while (!appIdAdded) { 1077 int type; 1078 int index = headerStart; 1079 int len = arr.length; 1080 int i; 1081 boolean addAppid = false; 1082 int tmpVal = 0; 1083 int tmpVal2 = 0; 1084 1085 while (true) { 1086 int add; 1087 1088 /* 1089 * field name 1090 * 0: short int 1091 * 1: long int 1092 * 2: text 1093 * (no uint for param value) 1094 */ 1095 type = rd.nextInt(3); 1096 switch (type) { 1097 case 0: // header short integer 1098 if (index > 100 && !appIdAdded) addAppid = true; 1099 add = 1; 1100 break; 1101 case 1: // header long int 1102 add = 1 + rd.nextInt(29); 1103 break; 1104 default: // header string 1105 add = 2 + rd.nextInt(10); 1106 break; 1107 } 1108 if (index + add >= len) break; 1109 1110 // fill header name 1111 switch (type) { 1112 case 0: // header short integer 1113 if (!addAppid) { 1114 do { 1115 arr[index] = (byte) (0x80 | rd.nextInt(128)); 1116 } while (arr[index] == (byte) 0xaf); 1117 } else { 1118 Log.d(LOG_TAG, "appId added."); 1119 arr[index] = (byte) 0xaf; 1120 } 1121 break; 1122 case 1: // header long int 1123 arr[index] = (byte) (add - 1); 1124 tmpVal2 = 0; 1125 for (i = 1; i < add; i++) { 1126 tmpVal = rd.nextInt(255); 1127 tmpVal2 = (tmpVal2 << 8) | tmpVal; 1128 arr[index + i] = (byte) tmpVal; 1129 } 1130 // don't set application id 1131 if (tmpVal2 == 0x2f) arr[index + 1]++; 1132 break; 1133 default: // header string 1134 for (i = 0; i < add - 1; i++) { 1135 tmpVal = rd.nextInt(127); 1136 if (tmpVal < 32) tmpVal= (32 + tmpVal); 1137 arr[index + i] = (byte) tmpVal; 1138 } 1139 arr[index + i] = (byte) 0x0; 1140 break; 1141 } 1142 1143 if (LOCAL_LOGV) { 1144 Log.d(LOG_TAG, "field name index:" + index); 1145 Log.d(LOG_TAG, "type:" + typename[type] + ", add:" + add); 1146 if (type != 2) { 1147 for (i = index; i < index + add; i++) { 1148 System.out.print(Integer.toHexString(0xff & arr[i])); 1149 System.out.print(' '); 1150 } 1151 } else { 1152 System.out.print(Integer.toHexString(0xff & arr[index])); 1153 System.out.print(' '); 1154 String str = new String(arr, index + 1, add - 2); 1155 for (i = 0; i < str.length(); i++) { 1156 System.out.print(str.charAt(i)); 1157 System.out.print(' '); 1158 } 1159 } 1160 System.out.print('\n'); 1161 } 1162 index += add; 1163 1164 1165 /* 1166 * field value 1167 * 0: short int 1168 * 1: long int 1169 * 2: text 1170 * 3: uint 1171 */ 1172 if (addAppid) { 1173 type = 2; 1174 } else { 1175 type = rd.nextInt(4); 1176 } 1177 switch (type) { 1178 case 0: // header short integer 1179 add = 1; 1180 break; 1181 case 1: // header long int 1182 add = 1 + rd.nextInt(29); 1183 break; 1184 case 2: // header string 1185 if (addAppid) { 1186 if (randomStr) { 1187 add = 1 + rd.nextInt(10); 1188 byte[] randStr= new byte[add]; 1189 for (i = 0; i < add; i++) { 1190 tmpVal = rd.nextInt(127); 1191 if (tmpVal < 32) tmpVal= (32 + tmpVal); 1192 randStr[i] = (byte) tmpVal; 1193 } 1194 mAppIdName = new String(randStr); 1195 } 1196 add = mAppIdName.length() + 1; 1197 } else { 1198 add = 2 + rd.nextInt(10); 1199 } 1200 break; 1201 default: // uint32 1202 add = 6; 1203 } 1204 if (index + add >= len) break; 1205 1206 // fill field value 1207 switch (type) { 1208 case 0: // header short int 1209 arr[index] = (byte) (0x80 | rd.nextInt(128)); 1210 break; 1211 case 1: // header long int 1212 arr[index] = (byte) (add - 1); 1213 for (i = 1; i < add; i++) 1214 arr[index + i] = (byte) rd.nextInt(255); 1215 break; 1216 case 2:// header string 1217 if (addAppid) { 1218 addAppid = false; 1219 appIdAdded = true; 1220 for (i = 0; i < add - 1; i++) { 1221 arr[index + i] = (byte) (mAppIdName.charAt(i)); 1222 } 1223 Log.d(LOG_TAG, "mAppIdName added [" + mAppIdName + "]"); 1224 } else { 1225 for (i = 0; i < add - 1; i++) { 1226 tmpVal = rd.nextInt(127); 1227 if (tmpVal < 32) tmpVal= (32 + tmpVal); 1228 arr[index + i] = (byte) tmpVal; 1229 } 1230 } 1231 arr[index + i] = (byte) 0x0; 1232 break; 1233 default: // header uvarint 1234 arr[index] = (byte) 31; 1235 tmpVal = rd.nextInt(0x0FFFFFFF); 1236 add = 1 + encodeUint32(tmpVal, null, index + 1); 1237 encodeUint32(tmpVal, arr, index + 1); 1238 break; 1239 1240 } 1241 1242 if (LOCAL_LOGV) { 1243 Log.d(LOG_TAG, "field value index:" + index); 1244 Log.d(LOG_TAG, "type:" + typename[type] + ", add:" + add); 1245 if (type != 2) { 1246 for (i = index; i < index + add; i++) { 1247 System.out.print(Integer.toHexString(0xff & arr[i])); 1248 System.out.print(' '); 1249 } 1250 } else { 1251 System.out.print(Integer.toHexString(0xff & arr[index])); 1252 System.out.print(' '); 1253 String str = new String(arr, index + 1, add - 2); 1254 for (i = 0; i < str.length(); i++) { 1255 System.out.print(str.charAt(i)); 1256 System.out.print(' '); 1257 } 1258 } 1259 System.out.print('\n'); 1260 } 1261 index += add; 1262 } 1263 } 1264 1265 Log.d(LOG_TAG, "headerStart = " + headerStart + ", mAppIdName = " + mAppIdName); 1266 Log.d(LOG_TAG, HexDump.dumpHexString(arr)); 1267 } 1268 1269 protected byte[] createPDU(int testNum) { 1270 byte[] array = null; 1271 // byte[] wsp = null; 1272 1273 switch (testNum) { 1274 // sample pdu 1275 case 1: 1276 byte[] array1 = { 1277 (byte) 0x00, // TID 1278 (byte) 0x06, // Type = wap push 1279 (byte) 0x00, // Length to be set later. 1280 1281 // Content-Type 1282 (byte) 0x03, (byte) 0x02, 1283 (byte) ((mContentTypeValue >> 8) & 0xff), 1284 (byte) (mContentTypeValue & 0xff), 1285 1286 // Application-id 1287 (byte) 0xaf, (byte) 0x02, 1288 (byte) ((mAppIdValue >> 8) & 0xff), 1289 (byte) (mAppIdValue& 0xff) 1290 }; 1291 array1[2] = (byte) (array1.length - 3); 1292 mWspHeader = array1; 1293 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length + 7; 1294 mWspHeaderLen = array1.length; 1295 break; 1296 1297 // invalid wsp header 1298 case 2: 1299 byte[] array2 = { 1300 (byte) 0x00, // invalid data 1301 }; 1302 mWspHeader = array2; 1303 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length; 1304 mWspHeaderLen = array2.length; 1305 break; 1306 1307 // random wsp header 1308 case 3: 1309 Random rd = new Random(); 1310 int arrSize = 150 + rd.nextInt(100); 1311 byte[] array3 = new byte[arrSize]; 1312 int hdrEncodeLen; 1313 1314 array3[0] = (byte) 0x0; 1315 array3[1] = (byte) 0x6; 1316 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1317 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1318 array3[hdrEncodeLen + 2] = (byte) 0x3; 1319 array3[hdrEncodeLen + 3] = (byte) 0x2; 1320 array3[hdrEncodeLen + 4] = (byte) ((mContentTypeValue >> 8) & 0xff); 1321 array3[hdrEncodeLen + 5] = (byte) (mContentTypeValue & 0xff); 1322 createRandomWspHeader(array3, rd, hdrEncodeLen + 6, false); 1323 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length + hdrEncodeLen + 6; 1324 mWspHeaderLen = array3.length; 1325 1326 Log.d(LOG_TAG, "mContentTypeValue = " + mContentTypeValue 1327 + "(" + Integer.toHexString(mContentTypeValue) + ")"); 1328 1329 mWspHeader = array3; 1330 break; 1331 1332 // random wsp header w/o appid 1333 case 4: 1334 rd = new Random(); 1335 arrSize = 150 + rd.nextInt(100); 1336 array3 = new byte[arrSize]; 1337 1338 array3[0] = (byte) 0x0; 1339 array3[1] = (byte) 0x6; 1340 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1341 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1342 array3[hdrEncodeLen + 2] = (byte) 0x3; 1343 array3[hdrEncodeLen + 3] = (byte) 0x2; 1344 array3[hdrEncodeLen + 4] = (byte) ((mContentTypeValue >> 8) & 0xff); 1345 array3[hdrEncodeLen + 5] = (byte) (mContentTypeValue & 0xff); 1346 createRandomWspHeader(array3, rd, hdrEncodeLen + 6, true); 1347 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length + hdrEncodeLen + 6; 1348 mWspHeaderLen = array3.length; 1349 1350 Log.d(LOG_TAG, "mContentTypeValue = " + mContentTypeValue 1351 + "(" + Integer.toHexString(mContentTypeValue) + ")"); 1352 1353 mWspHeader = array3; 1354 break; 1355 1356 // random wsp header w/ random appid string 1357 case 5: 1358 rd = new Random(); 1359 arrSize = 150 + rd.nextInt(100); 1360 array3 = new byte[arrSize]; 1361 1362 array3[0] = (byte) 0x0; 1363 array3[1] = (byte) 0x6; 1364 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1365 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1366 array3[hdrEncodeLen + 2] = (byte) 0x3; 1367 array3[hdrEncodeLen + 3] = (byte) 0x2; 1368 array3[hdrEncodeLen + 4] = (byte) ((mContentTypeValue >> 8) & 0xff); 1369 array3[hdrEncodeLen + 5] = (byte) (mContentTypeValue & 0xff); 1370 createRandomWspHeaderStrAppId(array3, rd, hdrEncodeLen + 6, true); 1371 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length + hdrEncodeLen + 6; 1372 mWspHeaderLen = array3.length; 1373 1374 Log.d(LOG_TAG, "mContentTypeValue = " + mContentTypeValue 1375 + "(" + Integer.toHexString(mContentTypeValue) + ")"); 1376 1377 mWspHeader = array3; 1378 break; 1379 1380 // random wsp header w/ OMA appid string 1381 case 6: 1382 rd = new Random(); 1383 arrSize = 150 + rd.nextInt(100); 1384 array3 = new byte[arrSize]; 1385 1386 array3[0] = (byte) 0x0; 1387 array3[1] = (byte) 0x6; 1388 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1389 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1390 array3[hdrEncodeLen + 2] = (byte) 0x3; 1391 array3[hdrEncodeLen + 3] = (byte) 0x2; 1392 array3[hdrEncodeLen + 4] = (byte) ((mContentTypeValue >> 8) & 0xff); 1393 array3[hdrEncodeLen + 5] = (byte) (mContentTypeValue & 0xff); 1394 createRandomWspHeaderStrAppId(array3, rd, hdrEncodeLen + 6, false); 1395 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length + hdrEncodeLen + 6; 1396 mWspHeaderLen = array3.length; 1397 1398 Log.d(LOG_TAG, "mContentTypeValue = " + mContentTypeValue 1399 + "(" + Integer.toHexString(mContentTypeValue) + ")"); 1400 1401 mWspHeader = array3; 1402 break; 1403 1404 // random wsp header w/ OMA content type 1405 case 7: 1406 rd = new Random(); 1407 arrSize = 150 + rd.nextInt(100); 1408 array3 = new byte[arrSize]; 1409 1410 array3[0] = (byte) 0x0; 1411 array3[1] = (byte) 0x6; 1412 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1413 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1414 1415 // encode content type 1416 int contentLen = mContentTypeName.length(); 1417 int next = 2 + hdrEncodeLen; 1418 mWspContentTypeStart = mGsmHeader.length + mUserDataHeader.length + next; 1419 // next += encodeUint32(contentLen, array3, next); 1420 int i; 1421 Log.d(LOG_TAG, "mContentTypeName = " + mContentTypeName 1422 + ", contentLen = " + contentLen); 1423 1424 for (i = 0; i < contentLen; i++) { 1425 array3[next + i] = (byte) mContentTypeName.charAt(i); 1426 } 1427 array3[next + i] = (byte) 0x0; 1428 1429 createRandomWspHeader(array3, rd, next + contentLen + 1, false); 1430 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length 1431 + next + contentLen + 1; 1432 mWspHeaderLen = array3.length; 1433 1434 mWspHeader = array3; 1435 break; 1436 1437 // random wsp header w/ OMA content type, OMA app ID 1438 case 8: 1439 rd = new Random(); 1440 arrSize = 150 + rd.nextInt(100); 1441 array3 = new byte[arrSize]; 1442 1443 array3[0] = (byte) 0x0; 1444 array3[1] = (byte) 0x6; 1445 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1446 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1447 1448 // encode content type 1449 contentLen = mContentTypeName.length(); 1450 next = 2 + hdrEncodeLen; 1451 mWspContentTypeStart = mGsmHeader.length + mUserDataHeader.length + next; 1452 // next += encodeUint32(contentLen, array3, next); 1453 Log.d(LOG_TAG, "mContentTypeName = " + mContentTypeName 1454 + ", contentLen = " + contentLen); 1455 1456 for (i = 0; i < contentLen; i++) { 1457 array3[next + i] = (byte) mContentTypeName.charAt(i); 1458 } 1459 array3[next + i] = (byte) 0x0; 1460 1461 createRandomWspHeaderStrAppId(array3, rd, next + contentLen + 1, false); 1462 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length 1463 + next + contentLen + 1; 1464 mWspHeaderLen = array3.length; 1465 1466 mWspHeader = array3; 1467 break; 1468 1469 default: 1470 return null; 1471 } 1472 array = new byte[mGsmHeader.length + mUserDataHeader.length + mWspHeader.length 1473 + mMessageBody.length]; 1474 System.arraycopy(mGsmHeader, 0, array, 0, mGsmHeader.length); 1475 System.arraycopy(mUserDataHeader, 0, array, 1476 mGsmHeader.length, mUserDataHeader.length); 1477 System.arraycopy(mWspHeader, 0, array, 1478 mGsmHeader.length + mUserDataHeader.length, mWspHeader.length); 1479 System.arraycopy(mMessageBody, 0, array, 1480 mGsmHeader.length + mUserDataHeader.length + mWspHeader.length, 1481 mMessageBody.length); 1482 return array; 1483 1484 } 1485 1486 Intent createIntent(int pduType, int tranId) { 1487 Intent intent = new Intent(); 1488 intent.putExtra("transactionId", tranId); 1489 intent.putExtra("pduType", pduType); 1490 intent.putExtra("header", mGsmHeader); 1491 intent.putExtra("data", mMessageBody); 1492 // intent.putExtra("contentTypeParameters", null); 1493 return intent; 1494 } 1495 1496 /** 1497 * Message processing test, start activity 1498 */ 1499 public void testProcessMsg1() { 1500 byte[] pdu = createPDU(1); 1501 int headerLen = pdu.length - 1502 (mGsmHeader.length + mUserDataHeader.length + mMessageBody.length); 1503 int pduType = 6; 1504 int tranId = 0; 1505 String originalPackageName = mPackageName; 1506 String originalClassName = mClassName; 1507 1508 try { 1509 1510 mClassName = "com.android.smspush.unitTests.ReceiverActivity"; 1511 1512 // set up data 1513 IWapPushManager iwapman = getInterface(); 1514 iwapman.addPackage(Integer.toString(mAppIdValue), 1515 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1516 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 1517 1518 assertTrue((iwapman.processMessage( 1519 Integer.toString(mAppIdValue), 1520 Integer.toString(mContentTypeValue), 1521 createIntent(pduType, tranId)) 1522 & WapPushManagerParams.MESSAGE_HANDLED) == 1523 WapPushManagerParams.MESSAGE_HANDLED); 1524 1525 // clean up data 1526 iwapman.deletePackage(Integer.toString(mAppIdValue), 1527 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1528 1529 } catch (RemoteException e) { 1530 assertTrue(false); 1531 } 1532 1533 mPackageName = originalPackageName; 1534 mClassName = originalClassName; 1535 } 1536 1537 /** 1538 * Message processing test, start service 1539 */ 1540 public void testProcessMsg2() { 1541 byte[] pdu = createPDU(1); 1542 int headerLen = pdu.length - (mGsmHeader.length + 1543 mUserDataHeader.length + mMessageBody.length); 1544 int pduType = 6; 1545 int tranId = 0; 1546 String originalPackageName = mPackageName; 1547 String originalClassName = mClassName; 1548 1549 try { 1550 1551 mClassName = "com.android.smspush.unitTests.ReceiverService"; 1552 1553 // set up data 1554 IWapPushManager iwapman = getInterface(); 1555 1556 iwapman.addPackage(Integer.toString(mAppIdValue), 1557 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1558 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 1559 1560 assertTrue((iwapman.processMessage( 1561 Integer.toString(mAppIdValue), 1562 Integer.toString(mContentTypeValue), 1563 createIntent(pduType, tranId)) 1564 & WapPushManagerParams.MESSAGE_HANDLED) == 1565 WapPushManagerParams.MESSAGE_HANDLED); 1566 1567 // clean up data 1568 iwapman.deletePackage(Integer.toString(mAppIdValue), 1569 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1570 1571 } catch (RemoteException e) { 1572 assertTrue(false); 1573 } 1574 1575 mPackageName = originalPackageName; 1576 mClassName = originalClassName; 1577 } 1578 1579 /** 1580 * Message processing test, no signature 1581 */ 1582 public void testProcessMsg3() { 1583 byte[] pdu = createPDU(1); 1584 int headerLen = pdu.length - 1585 (mGsmHeader.length + mUserDataHeader.length + mMessageBody.length); 1586 int pduType = 6; 1587 int tranId = 0; 1588 String originalPackageName = mPackageName; 1589 String originalClassName = mClassName; 1590 1591 try { 1592 1593 mPackageName = "com.android.development"; 1594 mClassName = "com.android.development.Development"; 1595 1596 // set up data 1597 IWapPushManager iwapman = getInterface(); 1598 1599 iwapman.addPackage(Integer.toString(mAppIdValue), 1600 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1601 WapPushManagerParams.APP_TYPE_SERVICE, true, false); 1602 1603 assertFalse((iwapman.processMessage( 1604 Integer.toString(mAppIdValue), 1605 Integer.toString(mContentTypeValue), 1606 createIntent(pduType, tranId)) 1607 & WapPushManagerParams.MESSAGE_HANDLED) == 1608 WapPushManagerParams.MESSAGE_HANDLED); 1609 1610 // clean up data 1611 iwapman.deletePackage(Integer.toString(mAppIdValue), 1612 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1613 1614 } catch (RemoteException e) { 1615 assertTrue(false); 1616 } 1617 1618 mPackageName = originalPackageName; 1619 mClassName = originalClassName; 1620 } 1621 1622 IDataVerify getVerifyInterface() { 1623 while (mIVerify == null) { 1624 // wait for the activity receive data. 1625 try { 1626 Thread.sleep(TIME_WAIT); 1627 } catch (InterruptedException e) {} 1628 } 1629 return mIVerify; 1630 } 1631 1632 1633 /** 1634 * Message processing test, received body data verification test 1635 */ 1636 public void testProcessMsg4() { 1637 byte[] originalMessageBody = mMessageBody; 1638 mMessageBody = new byte[] { 1639 (byte) 0xee, 1640 (byte) 0xff, 1641 (byte) 0xee, 1642 (byte) 0xff, 1643 (byte) 0xee, 1644 (byte) 0xff, 1645 (byte) 0xee, 1646 (byte) 0xff, 1647 (byte) 0xee, 1648 (byte) 0xff, 1649 (byte) 0xee, 1650 (byte) 0xff, 1651 }; 1652 1653 byte[] pdu = createPDU(1); 1654 int headerLen = pdu.length - 1655 (mGsmHeader.length + mUserDataHeader.length + mMessageBody.length); 1656 int pduType = 6; 1657 int tranId = 0; 1658 String originalPackageName = mPackageName; 1659 String originalClassName = mClassName; 1660 1661 try { 1662 IWapPushManager iwapman = getInterface(); 1663 IDataVerify dataverify = getVerifyInterface(); 1664 1665 dataverify.resetData(); 1666 1667 // set up data 1668 mClassName = "com.android.smspush.unitTests.ReceiverActivity"; 1669 iwapman.addPackage(Integer.toString(mAppIdValue), 1670 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1671 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 1672 1673 iwapman.processMessage( 1674 Integer.toString(mAppIdValue), 1675 Integer.toString(mContentTypeValue), 1676 createIntent(pduType, tranId)); 1677 1678 // clean up data 1679 iwapman.deletePackage(Integer.toString(mAppIdValue), 1680 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1681 1682 assertTrue(dataverify.verifyData(mMessageBody)); 1683 1684 // set up data 1685 dataverify.resetData(); 1686 mClassName = "com.android.smspush.unitTests.ReceiverService"; 1687 mMessageBody = new byte[] { 1688 (byte) 0xaa, 1689 (byte) 0xbb, 1690 (byte) 0x11, 1691 (byte) 0x22, 1692 (byte) 0xaa, 1693 (byte) 0xbb, 1694 (byte) 0x11, 1695 (byte) 0x22, 1696 (byte) 0xaa, 1697 (byte) 0xbb, 1698 (byte) 0x11, 1699 (byte) 0x22, 1700 (byte) 0xaa, 1701 (byte) 0xbb, 1702 (byte) 0x11, 1703 (byte) 0x22, 1704 (byte) 0xaa, 1705 (byte) 0xbb, 1706 (byte) 0x11, 1707 (byte) 0x22, 1708 (byte) 0xaa, 1709 (byte) 0xbb, 1710 (byte) 0x11, 1711 (byte) 0x22, 1712 }; 1713 pdu = createPDU(1); 1714 iwapman.addPackage(Integer.toString(mAppIdValue), 1715 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1716 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 1717 1718 iwapman.processMessage( 1719 Integer.toString(mAppIdValue), 1720 Integer.toString(mContentTypeValue), 1721 createIntent(pduType, tranId)); 1722 1723 // clean up data 1724 iwapman.deletePackage(Integer.toString(mAppIdValue), 1725 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1726 1727 // Log.d(LOG_TAG, HexDump.dumpHexString(mMessageBody)); 1728 assertTrue(dataverify.verifyData(mMessageBody)); 1729 } catch (RemoteException e) { 1730 assertTrue(false); 1731 } 1732 1733 mPackageName = originalPackageName; 1734 mClassName = originalClassName; 1735 mMessageBody = originalMessageBody; 1736 } 1737 1738 /** 1739 * Message processing test, send invalid sms data 1740 */ 1741 public void testProcessMsg5() { 1742 byte[] pdu = createPDU(2); 1743 int headerLen = pdu.length - 1744 (mGsmHeader.length + mUserDataHeader.length + mMessageBody.length); 1745 int pduType = 6; 1746 int tranId = 0; 1747 String originalPackageName = mPackageName; 1748 String originalClassName = mClassName; 1749 1750 try { 1751 1752 mClassName = "com.android.smspush.unitTests.ReceiverActivity"; 1753 1754 // set up data 1755 IWapPushManager iwapman = getInterface(); 1756 iwapman.addPackage(Integer.toString(mAppIdValue), 1757 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1758 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 1759 1760 assertTrue((iwapman.processMessage( 1761 Integer.toString(mAppIdValue), 1762 Integer.toString(mContentTypeValue), 1763 createIntent(pduType, tranId)) 1764 & WapPushManagerParams.MESSAGE_HANDLED) == 1765 WapPushManagerParams.MESSAGE_HANDLED); 1766 1767 // clean up data 1768 iwapman.deletePackage(Integer.toString(mAppIdValue), 1769 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1770 1771 } catch (RemoteException e) { 1772 assertTrue(false); 1773 } 1774 1775 mPackageName = originalPackageName; 1776 mClassName = originalClassName; 1777 } 1778 1779 /** 1780 * Message processing test, no receiver application 1781 */ 1782 public void testProcessMsg6() { 1783 byte[] pdu = createPDU(1); 1784 int headerLen = pdu.length - 1785 (mGsmHeader.length + mUserDataHeader.length + mMessageBody.length); 1786 int pduType = 6; 1787 int tranId = 0; 1788 String originalPackageName = mPackageName; 1789 String originalClassName = mClassName; 1790 1791 try { 1792 1793 mClassName = "com.android.smspush.unitTests.NoReceiver"; 1794 1795 // set up data 1796 IWapPushManager iwapman = getInterface(); 1797 iwapman.addPackage(Integer.toString(mAppIdValue), 1798 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1799 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 1800 1801 assertFalse((iwapman.processMessage( 1802 Integer.toString(mAppIdValue), 1803 Integer.toString(mContentTypeValue), 1804 createIntent(pduType, tranId)) 1805 & WapPushManagerParams.MESSAGE_HANDLED) == 1806 WapPushManagerParams.MESSAGE_HANDLED); 1807 1808 // clean up data 1809 iwapman.deletePackage(Integer.toString(mAppIdValue), 1810 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1811 1812 // set up data 1813 iwapman.addPackage(Integer.toString(mAppIdValue), 1814 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1815 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 1816 1817 assertFalse((iwapman.processMessage( 1818 Integer.toString(mAppIdValue), 1819 Integer.toString(mContentTypeValue), 1820 createIntent(pduType, tranId)) 1821 & WapPushManagerParams.MESSAGE_HANDLED) == 1822 WapPushManagerParams.MESSAGE_HANDLED); 1823 1824 // clean up data 1825 iwapman.deletePackage(Integer.toString(mAppIdValue), 1826 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1827 1828 } catch (RemoteException e) { 1829 assertTrue(false); 1830 } 1831 1832 mPackageName = originalPackageName; 1833 mClassName = originalClassName; 1834 } 1835 1836 /** 1837 * WspTypeDecoder test, normal pdu 1838 */ 1839 public void testDecoder1() { 1840 boolean res; 1841 int originalAppIdValue = mAppIdValue; 1842 Random rd = new Random(); 1843 1844 for (int i = 0; i < 10; i++) { 1845 mAppIdValue = rd.nextInt(0xFFFF); 1846 byte[] pdu = createPDU(1); 1847 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 1848 1849 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 1850 mWspHeaderStart + mWspHeaderLen - 1); 1851 assertTrue(res); 1852 1853 int index = (int) pduDecoder.getValue32(); 1854 res = pduDecoder.decodeXWapApplicationId(index); 1855 assertTrue(res); 1856 1857 Log.d(LOG_TAG, "mAppIdValue: " + mAppIdValue 1858 + ", val: " + pduDecoder.getValue32()); 1859 assertTrue(mAppIdValue == (int) pduDecoder.getValue32()); 1860 } 1861 1862 mAppIdValue = originalAppIdValue; 1863 } 1864 1865 /** 1866 * WspTypeDecoder test, no header 1867 */ 1868 public void testDecoder2() { 1869 boolean res; 1870 int originalAppIdValue = mAppIdValue; 1871 Random rd = new Random(); 1872 1873 mAppIdValue = rd.nextInt(0xFFFF); 1874 byte[] pdu = createPDU(2); 1875 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 1876 1877 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 1878 mWspHeaderStart + mWspHeaderLen - 1); 1879 assertFalse(res); 1880 1881 mAppIdValue = originalAppIdValue; 1882 } 1883 1884 /** 1885 * WspTypeDecoder test, decode appid test 1886 */ 1887 public void testDecoder3() { 1888 boolean res; 1889 int originalAppIdValue = mAppIdValue; 1890 int originalContentTypeValue = mContentTypeValue; 1891 Random rd = new Random(); 1892 1893 for (int i = 0; i < 100; i++) { 1894 mAppIdValue = rd.nextInt(0x0FFFFFFF); 1895 mContentTypeValue = rd.nextInt(0x0FFF); 1896 byte[] pdu = createPDU(3); 1897 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 1898 1899 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 1900 mWspHeaderStart + mWspHeaderLen - 1); 1901 assertTrue(res); 1902 1903 int index = (int) pduDecoder.getValue32(); 1904 res = pduDecoder.decodeXWapApplicationId(index); 1905 assertTrue(res); 1906 1907 Log.d(LOG_TAG, "mAppIdValue: " + mAppIdValue 1908 + ", val: " + pduDecoder.getValue32()); 1909 assertTrue(mAppIdValue == (int) pduDecoder.getValue32()); 1910 } 1911 1912 mAppIdValue = originalAppIdValue; 1913 mContentTypeValue = originalContentTypeValue; 1914 } 1915 1916 /* 1917 public void testEnc() { 1918 byte[] arr = new byte[20]; 1919 int index = 0; 1920 index += encodeUint32(0x87a5, arr, index); 1921 index += encodeUint32(0x1, arr, index); 1922 index += encodeUint32(0x9b, arr, index); 1923 index += encodeUint32(0x10, arr, index); 1924 index += encodeUint32(0xe0887, arr, index); 1925 index += encodeUint32(0x791a23d0, arr, index); 1926 1927 Log.d(LOG_TAG, HexDump.dumpHexString(arr)); 1928 } 1929 */ 1930 1931 /** 1932 * WspTypeDecoder test, no appid test 1933 */ 1934 public void testDecoder4() { 1935 boolean res; 1936 int originalAppIdValue = mAppIdValue; 1937 int originalContentTypeValue = mContentTypeValue; 1938 Random rd = new Random(); 1939 1940 for (int i = 0; i < 100; i++) { 1941 mAppIdValue = rd.nextInt(0x0FFFFFFF); 1942 mContentTypeValue = rd.nextInt(0x0FFF); 1943 byte[] pdu = createPDU(4); 1944 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 1945 1946 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 1947 mWspHeaderStart + mWspHeaderLen - 1); 1948 assertFalse(res); 1949 1950 } 1951 1952 mAppIdValue = originalAppIdValue; 1953 mContentTypeValue = originalContentTypeValue; 1954 } 1955 1956 /** 1957 * WspTypeDecoder test, decode string appid test 1958 */ 1959 public void testDecoder5() { 1960 boolean res; 1961 String originalAppIdName = mAppIdName; 1962 int originalContentTypeValue = mContentTypeValue; 1963 Random rd = new Random(); 1964 1965 for (int i = 0; i < 10; i++) { 1966 mAppIdValue = rd.nextInt(0x0FFFFFFF); 1967 mContentTypeValue = rd.nextInt(0x0FFF); 1968 byte[] pdu = createPDU(5); 1969 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 1970 1971 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 1972 mWspHeaderStart + mWspHeaderLen - 1); 1973 assertTrue(res); 1974 1975 int index = (int) pduDecoder.getValue32(); 1976 res = pduDecoder.decodeXWapApplicationId(index); 1977 assertTrue(res); 1978 1979 Log.d(LOG_TAG, "mAppIdValue: [" + mAppIdName + "], val: [" 1980 + pduDecoder.getValueString() + "]"); 1981 assertTrue(mAppIdName.equals(pduDecoder.getValueString())); 1982 } 1983 1984 mAppIdName = originalAppIdName; 1985 mContentTypeValue = originalContentTypeValue; 1986 } 1987 1988 /** 1989 * WspTypeDecoder test, decode string appid test 1990 */ 1991 public void testDecoder6() { 1992 boolean res; 1993 String originalAppIdName = mAppIdName; 1994 int originalContentTypeValue = mContentTypeValue; 1995 Random rd = new Random(); 1996 1997 for (int i = 0; i < OMA_APPLICATION_ID_NAMES.length; i++) { 1998 mAppIdName = OMA_APPLICATION_ID_NAMES[i]; 1999 mContentTypeValue = rd.nextInt(0x0FFF); 2000 byte[] pdu = createPDU(6); 2001 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 2002 2003 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 2004 mWspHeaderStart + mWspHeaderLen - 1); 2005 assertTrue(res); 2006 2007 int index = (int) pduDecoder.getValue32(); 2008 res = pduDecoder.decodeXWapApplicationId(index); 2009 assertTrue(res); 2010 2011 Log.d(LOG_TAG, "mAppIdValue: [" + mAppIdName + "], val: [" 2012 + pduDecoder.getValueString() + "]"); 2013 assertTrue(mAppIdName.equals(pduDecoder.getValueString())); 2014 } 2015 2016 mAppIdName = originalAppIdName; 2017 mContentTypeValue = originalContentTypeValue; 2018 } 2019 2020 /** 2021 * WspTypeDecoder test, decode OMA content type 2022 */ 2023 public void testDecoder7() { 2024 boolean res; 2025 String originalAppIdName = mAppIdName; 2026 int originalContentTypeValue = mContentTypeValue; 2027 Random rd = new Random(); 2028 2029 for (int i = 0; i < OMA_CONTENT_TYPE_NAMES.length; i++) { 2030 mContentTypeName = OMA_CONTENT_TYPE_NAMES[i]; 2031 byte[] pdu = createPDU(7); 2032 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 2033 2034 res = pduDecoder.decodeContentType(mWspContentTypeStart); 2035 assertTrue(res); 2036 2037 Log.d(LOG_TAG, "mContentTypeName: [" + mContentTypeName + "], val: [" 2038 + pduDecoder.getValueString() + "]"); 2039 assertTrue(mContentTypeName.equals(pduDecoder.getValueString())); 2040 } 2041 2042 mAppIdName = originalAppIdName; 2043 mContentTypeValue = originalContentTypeValue; 2044 } 2045 2046 2047 /** 2048 * Copied from WapPushOverSms. 2049 * The code flow is not changed from the original. 2050 */ 2051 public int dispatchWapPdu(byte[] pdu, IWapPushManager wapPushMan) { 2052 2053 if (false) Log.d(LOG_TAG, "Rx: " + IccUtils.bytesToHexString(pdu)); 2054 2055 int index = 0; 2056 int transactionId = pdu[index++] & 0xFF; 2057 int pduType = pdu[index++] & 0xFF; 2058 int headerLength = 0; 2059 2060 if ((pduType != WspTypeDecoder.PDU_TYPE_PUSH) && 2061 (pduType != WspTypeDecoder.PDU_TYPE_CONFIRMED_PUSH)) { 2062 if (false) Log.w(LOG_TAG, "Received non-PUSH WAP PDU. Type = " + pduType); 2063 return Intents.RESULT_SMS_HANDLED; 2064 } 2065 2066 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 2067 2068 /** 2069 * Parse HeaderLen(unsigned integer). 2070 * From wap-230-wsp-20010705-a section 8.1.2 2071 * The maximum size of a uintvar is 32 bits. 2072 * So it will be encoded in no more than 5 octets. 2073 */ 2074 if (pduDecoder.decodeUintvarInteger(index) == false) { 2075 if (false) Log.w(LOG_TAG, "Received PDU. Header Length error."); 2076 return Intents.RESULT_SMS_GENERIC_ERROR; 2077 } 2078 headerLength = (int) pduDecoder.getValue32(); 2079 index += pduDecoder.getDecodedDataLength(); 2080 2081 int headerStartIndex = index; 2082 2083 /** 2084 * Parse Content-Type. 2085 * From wap-230-wsp-20010705-a section 8.4.2.24 2086 * 2087 * Content-type-value = Constrained-media | Content-general-form 2088 * Content-general-form = Value-length Media-type 2089 * Media-type = (Well-known-media | Extension-Media) *(Parameter) 2090 * Value-length = Short-length | (Length-quote Length) 2091 * Short-length = <Any octet 0-30> (octet <= WAP_PDU_SHORT_LENGTH_MAX) 2092 * Length-quote = <Octet 31> (WAP_PDU_LENGTH_QUOTE) 2093 * Length = Uintvar-integer 2094 */ 2095 if (pduDecoder.decodeContentType(index) == false) { 2096 if (false) Log.w(LOG_TAG, "Received PDU. Header Content-Type error."); 2097 return Intents.RESULT_SMS_GENERIC_ERROR; 2098 } 2099 2100 String mimeType = pduDecoder.getValueString(); 2101 long binaryContentType = pduDecoder.getValue32(); 2102 index += pduDecoder.getDecodedDataLength(); 2103 2104 byte[] header = new byte[headerLength]; 2105 System.arraycopy(pdu, headerStartIndex, header, 0, header.length); 2106 2107 byte[] intentData; 2108 2109 if (mimeType != null && mimeType.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { 2110 intentData = pdu; 2111 } else { 2112 int dataIndex = headerStartIndex + headerLength; 2113 intentData = new byte[pdu.length - dataIndex]; 2114 System.arraycopy(pdu, dataIndex, intentData, 0, intentData.length); 2115 } 2116 2117 /** 2118 * Seek for application ID field in WSP header. 2119 * If application ID is found, WapPushManager substitute the message 2120 * processing. Since WapPushManager is optional module, if WapPushManager 2121 * is not found, legacy message processing will be continued. 2122 */ 2123 if (pduDecoder.seekXWapApplicationId(index, index + headerLength - 1)) { 2124 index = (int) pduDecoder.getValue32(); 2125 pduDecoder.decodeXWapApplicationId(index); 2126 String wapAppId = pduDecoder.getValueString(); 2127 if (wapAppId == null) { 2128 wapAppId = Integer.toString((int) pduDecoder.getValue32()); 2129 } 2130 2131 String contentType = ((mimeType == null) ? 2132 Long.toString(binaryContentType) : mimeType); 2133 if (false) Log.v(LOG_TAG, "appid found: " + wapAppId + ":" + contentType); 2134 2135 try { 2136 boolean processFurther = true; 2137 // IWapPushManager wapPushMan = mWapConn.getWapPushManager(); 2138 if (wapPushMan == null) { 2139 if (false) Log.w(LOG_TAG, "wap push manager not found!"); 2140 } else { 2141 Intent intent = new Intent(); 2142 intent.putExtra("transactionId", transactionId); 2143 intent.putExtra("pduType", pduType); 2144 intent.putExtra("header", header); 2145 intent.putExtra("data", intentData); 2146 intent.putExtra("contentTypeParameters", 2147 pduDecoder.getContentParameters()); 2148 2149 int procRet = wapPushMan.processMessage(wapAppId, contentType, intent); 2150 if (false) Log.v(LOG_TAG, "procRet:" + procRet); 2151 if ((procRet & WapPushManagerParams.MESSAGE_HANDLED) > 0 2152 && (procRet & WapPushManagerParams.FURTHER_PROCESSING) == 0) { 2153 processFurther = false; 2154 } 2155 } 2156 if (!processFurther) { 2157 return Intents.RESULT_SMS_HANDLED; 2158 } 2159 } catch (RemoteException e) { 2160 if (false) Log.w(LOG_TAG, "remote func failed..."); 2161 } 2162 } 2163 if (false) Log.v(LOG_TAG, "fall back to existing handler"); 2164 2165 return Activity.RESULT_OK; 2166 } 2167 2168 protected byte[] retrieveWspBody() { 2169 byte[] array = new byte[mWspHeader.length + mMessageBody.length]; 2170 2171 System.arraycopy(mWspHeader, 0, array, 0, mWspHeader.length); 2172 System.arraycopy(mMessageBody, 0, array, mWspHeader.length, mMessageBody.length); 2173 return array; 2174 } 2175 2176 protected String getContentTypeName(int ctypeVal) { 2177 int i; 2178 2179 for (i = 0; i < OMA_CONTENT_TYPE_VALUES.length; i++) { 2180 if (ctypeVal == OMA_CONTENT_TYPE_VALUES[i]) { 2181 return OMA_CONTENT_TYPE_NAMES[i]; 2182 } 2183 } 2184 return null; 2185 } 2186 2187 protected boolean isContentTypeMapped(int ctypeVal) { 2188 int i; 2189 2190 for (i = 0; i < OMA_CONTENT_TYPE_VALUES.length; i++) { 2191 if (ctypeVal == OMA_CONTENT_TYPE_VALUES[i]) return true; 2192 } 2193 return false; 2194 } 2195 2196 /** 2197 * Integration test 1, simple case 2198 */ 2199 public void testIntegration1() { 2200 boolean res; 2201 int originalAppIdValue = mAppIdValue; 2202 int originalContentTypeValue = mContentTypeValue; 2203 String originalAppIdName = mAppIdName; 2204 String originalContentTypeName = mContentTypeName; 2205 String originalClassName = mClassName; 2206 byte[] originalMessageBody = mMessageBody; 2207 Random rd = new Random(); 2208 2209 mMessageBody = new byte[100 + rd.nextInt(100)]; 2210 rd.nextBytes(mMessageBody); 2211 2212 byte[] pdu = createPDU(1); 2213 byte[] wappushPdu = retrieveWspBody(); 2214 2215 2216 mClassName = "com.android.smspush.unitTests.ReceiverActivity"; 2217 // Phone dummy = new DummyPhone(getContext()); 2218 // Phone gsm = PhoneFactory.getGsmPhone(); 2219 // GSMPhone gsm = new GSMPhone(getContext(), new SimulatedCommands(), null, true); 2220 // WapPushOverSms dispatcher = new WapPushOverSms(dummy, null); 2221 2222 try { 2223 // set up data 2224 IWapPushManager iwapman = getInterface(); 2225 IDataVerify dataverify = getVerifyInterface(); 2226 2227 dataverify.resetData(); 2228 2229 if (isContentTypeMapped(mContentTypeValue)) { 2230 // content type is mapped 2231 mContentTypeName = getContentTypeName(mContentTypeValue); 2232 Log.d(LOG_TAG, "mContentTypeValue mapping " 2233 + mContentTypeName + ":" + mContentTypeValue); 2234 } else { 2235 mContentTypeName = Integer.toString(mContentTypeValue); 2236 } 2237 iwapman.addPackage(Integer.toString(mAppIdValue), 2238 mContentTypeName, mPackageName, mClassName, 2239 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 2240 2241 dispatchWapPdu(wappushPdu, iwapman); 2242 2243 // clean up data 2244 iwapman.deletePackage(Integer.toString(mAppIdValue), 2245 mContentTypeName, mPackageName, mClassName); 2246 2247 assertTrue(dataverify.verifyData(mMessageBody)); 2248 } catch (RemoteException e) { 2249 } 2250 2251 2252 mClassName = originalClassName; 2253 mAppIdName = originalAppIdName; 2254 mContentTypeName = originalContentTypeName; 2255 mAppIdValue = originalAppIdValue; 2256 mContentTypeValue = originalContentTypeValue; 2257 mMessageBody = originalMessageBody; 2258 } 2259 2260 /** 2261 * Integration test 2, random mAppIdValue(int), all OMA content type 2262 */ 2263 public void testIntegration2() { 2264 boolean res; 2265 int originalAppIdValue = mAppIdValue; 2266 int originalContentTypeValue = mContentTypeValue; 2267 String originalAppIdName = mAppIdName; 2268 String originalContentTypeName = mContentTypeName; 2269 String originalClassName = mClassName; 2270 byte[] originalMessageBody = mMessageBody; 2271 Random rd = new Random(); 2272 2273 IWapPushManager iwapman = getInterface(); 2274 IDataVerify dataverify = getVerifyInterface(); 2275 mClassName = "com.android.smspush.unitTests.ReceiverActivity"; 2276 2277 for (int i = 0; i < OMA_CONTENT_TYPE_NAMES.length; i++) { 2278 mContentTypeName = OMA_CONTENT_TYPE_NAMES[i]; 2279 mAppIdValue = rd.nextInt(0x0FFFFFFF); 2280 2281 mMessageBody = new byte[100 + rd.nextInt(100)]; 2282 rd.nextBytes(mMessageBody); 2283 2284 byte[] pdu = createPDU(7); 2285 byte[] wappushPdu = retrieveWspBody(); 2286 2287 try { 2288 dataverify.resetData(); 2289 // set up data 2290 iwapman.addPackage(Integer.toString(mAppIdValue), 2291 mContentTypeName, mPackageName, mClassName, 2292 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 2293 2294 dispatchWapPdu(wappushPdu, iwapman); 2295 2296 // clean up data 2297 iwapman.deletePackage(Integer.toString(mAppIdValue), 2298 mContentTypeName, mPackageName, mClassName); 2299 2300 if (mContentTypeName.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { 2301 assertTrue(dataverify.verifyData(wappushPdu)); 2302 } else { 2303 assertTrue(dataverify.verifyData(mMessageBody)); 2304 } 2305 } catch (RemoteException e) { 2306 } 2307 } 2308 2309 2310 mClassName = originalClassName; 2311 mAppIdName = originalAppIdName; 2312 mContentTypeName = originalContentTypeName; 2313 mAppIdValue = originalAppIdValue; 2314 mContentTypeValue = originalContentTypeValue; 2315 mMessageBody = originalMessageBody; 2316 } 2317 2318 /** 2319 * Integration test 3, iterate OmaApplication ID, random binary content type 2320 */ 2321 public void testIntegration3() { 2322 boolean res; 2323 int originalAppIdValue = mAppIdValue; 2324 int originalContentTypeValue = mContentTypeValue; 2325 String originalAppIdName = mAppIdName; 2326 String originalContentTypeName = mContentTypeName; 2327 String originalClassName = mClassName; 2328 byte[] originalMessageBody = mMessageBody; 2329 Random rd = new Random(); 2330 2331 IWapPushManager iwapman = getInterface(); 2332 IDataVerify dataverify = getVerifyInterface(); 2333 mClassName = "com.android.smspush.unitTests.ReceiverService"; 2334 2335 for (int i = 0; i < OMA_APPLICATION_ID_NAMES.length; i++) { 2336 mAppIdName = OMA_APPLICATION_ID_NAMES[i]; 2337 mContentTypeValue = rd.nextInt(0x0FFF); 2338 2339 mMessageBody = new byte[100 + rd.nextInt(100)]; 2340 rd.nextBytes(mMessageBody); 2341 2342 byte[] pdu = createPDU(6); 2343 byte[] wappushPdu = retrieveWspBody(); 2344 2345 try { 2346 dataverify.resetData(); 2347 // set up data 2348 if (isContentTypeMapped(mContentTypeValue)) { 2349 // content type is mapped to integer value 2350 mContentTypeName = getContentTypeName(mContentTypeValue); 2351 Log.d(LOG_TAG, "mContentTypeValue mapping " 2352 + mContentTypeValue + ":" + mContentTypeName); 2353 } else { 2354 mContentTypeName = Integer.toString(mContentTypeValue); 2355 } 2356 2357 iwapman.addPackage(mAppIdName, 2358 mContentTypeName, mPackageName, mClassName, 2359 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 2360 2361 dispatchWapPdu(wappushPdu, iwapman); 2362 2363 // clean up data 2364 iwapman.deletePackage(mAppIdName, 2365 mContentTypeName, mPackageName, mClassName); 2366 2367 if (mContentTypeName.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { 2368 assertTrue(dataverify.verifyData(wappushPdu)); 2369 } else { 2370 assertTrue(dataverify.verifyData(mMessageBody)); 2371 } 2372 } catch (RemoteException e) { 2373 } 2374 } 2375 2376 mClassName = originalClassName; 2377 mAppIdName = originalAppIdName; 2378 mContentTypeName = originalContentTypeName; 2379 mAppIdValue = originalAppIdValue; 2380 mContentTypeValue = originalContentTypeValue; 2381 mMessageBody = originalMessageBody; 2382 } 2383 2384 /** 2385 * Integration test 4, iterate OmaApplication ID, Oma content type 2386 */ 2387 public void testIntegration4() { 2388 boolean res; 2389 int originalAppIdValue = mAppIdValue; 2390 int originalContentTypeValue = mContentTypeValue; 2391 String originalAppIdName = mAppIdName; 2392 String originalContentTypeName = mContentTypeName; 2393 String originalClassName = mClassName; 2394 byte[] originalMessageBody = mMessageBody; 2395 Random rd = new Random(); 2396 2397 IWapPushManager iwapman = getInterface(); 2398 IDataVerify dataverify = getVerifyInterface(); 2399 mClassName = "com.android.smspush.unitTests.ReceiverService"; 2400 2401 for (int i = 0; i < OMA_APPLICATION_ID_NAMES.length 2402 + OMA_CONTENT_TYPE_NAMES.length; i++) { 2403 mAppIdName = OMA_APPLICATION_ID_NAMES[rd.nextInt(OMA_APPLICATION_ID_NAMES.length)]; 2404 int contIndex = rd.nextInt(OMA_CONTENT_TYPE_NAMES.length); 2405 mContentTypeName = OMA_CONTENT_TYPE_NAMES[contIndex]; 2406 2407 mMessageBody = new byte[100 + rd.nextInt(100)]; 2408 rd.nextBytes(mMessageBody); 2409 2410 byte[] pdu = createPDU(8); 2411 byte[] wappushPdu = retrieveWspBody(); 2412 2413 try { 2414 dataverify.resetData(); 2415 // set up data 2416 iwapman.addPackage(mAppIdName, 2417 mContentTypeName, mPackageName, mClassName, 2418 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 2419 2420 dispatchWapPdu(wappushPdu, iwapman); 2421 2422 // clean up data 2423 iwapman.deletePackage(mAppIdName, 2424 mContentTypeName, mPackageName, mClassName); 2425 2426 if (mContentTypeName.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { 2427 assertTrue(dataverify.verifyData(wappushPdu)); 2428 } else { 2429 assertTrue(dataverify.verifyData(mMessageBody)); 2430 } 2431 } catch (RemoteException e) { 2432 } 2433 } 2434 2435 mClassName = originalClassName; 2436 mAppIdName = originalAppIdName; 2437 mContentTypeName = originalContentTypeName; 2438 mAppIdValue = originalAppIdValue; 2439 mContentTypeValue = originalContentTypeValue; 2440 mMessageBody = originalMessageBody; 2441 } 2442 2443 /** 2444 * Integration test 5, iterate binary OmaApplication ID, Oma binary content type 2445 */ 2446 public void testIntegration5() { 2447 boolean res; 2448 int originalAppIdValue = mAppIdValue; 2449 int originalContentTypeValue = mContentTypeValue; 2450 String originalAppIdName = mAppIdName; 2451 String originalContentTypeName = mContentTypeName; 2452 String originalClassName = mClassName; 2453 byte[] originalMessageBody = mMessageBody; 2454 Random rd = new Random(); 2455 2456 IWapPushManager iwapman = getInterface(); 2457 IDataVerify dataverify = getVerifyInterface(); 2458 mClassName = "com.android.smspush.unitTests.ReceiverService"; 2459 2460 for (int i = 0; i < OMA_APPLICATION_ID_VALUES.length + 2461 OMA_CONTENT_TYPE_VALUES.length; i++) { 2462 mAppIdValue = OMA_APPLICATION_ID_VALUES[rd.nextInt( 2463 OMA_APPLICATION_ID_VALUES.length)]; 2464 mContentTypeValue = 2465 OMA_CONTENT_TYPE_VALUES[rd.nextInt(OMA_CONTENT_TYPE_VALUES.length)]; 2466 2467 mMessageBody = new byte[100 + rd.nextInt(100)]; 2468 rd.nextBytes(mMessageBody); 2469 2470 byte[] pdu = createPDU(3); 2471 byte[] wappushPdu = retrieveWspBody(); 2472 2473 try { 2474 dataverify.resetData(); 2475 // set up data 2476 if (isContentTypeMapped(mContentTypeValue)) { 2477 // content type is mapped to integer value 2478 mContentTypeName = getContentTypeName(mContentTypeValue); 2479 Log.d(LOG_TAG, "mContentTypeValue mapping " 2480 + mContentTypeValue + ":" + mContentTypeName); 2481 } else { 2482 mContentTypeName = Integer.toString(mContentTypeValue); 2483 } 2484 2485 iwapman.addPackage(Integer.toString(mAppIdValue), 2486 mContentTypeName, mPackageName, mClassName, 2487 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 2488 2489 dispatchWapPdu(wappushPdu, iwapman); 2490 2491 // clean up data 2492 iwapman.deletePackage(Integer.toString(mAppIdValue), 2493 mContentTypeName, mPackageName, mClassName); 2494 2495 if (mContentTypeName.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { 2496 assertTrue(dataverify.verifyData(wappushPdu)); 2497 } else { 2498 assertTrue(dataverify.verifyData(mMessageBody)); 2499 } 2500 } catch (RemoteException e) { 2501 } 2502 } 2503 2504 mClassName = originalClassName; 2505 mAppIdName = originalAppIdName; 2506 mContentTypeName = originalContentTypeName; 2507 mAppIdValue = originalAppIdValue; 2508 mContentTypeValue = originalContentTypeValue; 2509 mMessageBody = originalMessageBody; 2510 } 2511 2512 } 2513