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.IWapPushManager; 31 import com.android.internal.telephony.WapPushManagerParams; 32 import com.android.internal.telephony.WspTypeDecoder; 33 import com.android.internal.telephony.uicc.IccUtils; 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 sqlite injection test 556 */ 557 public void testAddPackage0() { 558 String inject = "' union select 0,'com.android.settings','com.android.settings.Settings',0,0,0--"; 559 560 // insert new data 561 IWapPushManager iwapman = getInterface(); 562 try { 563 assertFalse(iwapman.addPackage( 564 inject, 565 Integer.toString(mContentTypeValue), 566 mPackageName, mClassName, 567 WapPushManagerParams.APP_TYPE_SERVICE, true, true)); 568 } catch (RemoteException e) { 569 assertTrue(false); 570 } 571 } 572 573 /** 574 * Add duprecated package test. 575 */ 576 public void testAddPackage2() { 577 try { 578 IWapPushManager iwapman = getInterface(); 579 580 // set up data 581 iwapman.addPackage(Integer.toString(mAppIdValue), 582 Integer.toString(mContentTypeValue), mPackageName, mClassName, 0, 583 false, false); 584 iwapman.addPackage(Integer.toString(mAppIdValue + 10), 585 Integer.toString(mContentTypeValue), mPackageName, mClassName, 0, 586 false, false); 587 iwapman.addPackage(Integer.toString(mAppIdValue), 588 Integer.toString(mContentTypeValue + 10), mPackageName, mClassName, 0, 589 false, false); 590 591 assertFalse(iwapman.addPackage(Integer.toString(mAppIdValue), 592 Integer.toString(mContentTypeValue), mPackageName, mClassName, 0, 593 false, false)); 594 assertFalse(iwapman.addPackage(Integer.toString(mAppIdValue + 10), 595 Integer.toString(mContentTypeValue), mPackageName, mClassName, 0, 596 false, false)); 597 assertFalse(iwapman.addPackage(Integer.toString(mAppIdValue), 598 Integer.toString(mContentTypeValue + 10), mPackageName, mClassName, 0, 599 false, false)); 600 601 // clean up data 602 iwapman.deletePackage(Integer.toString(mAppIdValue), 603 Integer.toString(mContentTypeValue), mPackageName, mClassName); 604 iwapman.deletePackage(Integer.toString(mAppIdValue + 10), 605 Integer.toString(mContentTypeValue), mPackageName, mClassName); 606 iwapman.deletePackage(Integer.toString(mAppIdValue), 607 Integer.toString(mContentTypeValue + 10), mPackageName, mClassName); 608 } catch (RemoteException e) { 609 assertTrue(false); 610 } 611 } 612 613 protected void utUpdatePackage(boolean need_sig, boolean more_proc) { 614 IWapPushManager iwapman = getInterface(); 615 616 // insert new data 617 try { 618 assertTrue(iwapman.updatePackage( 619 Integer.toString(mAppIdValue), 620 Integer.toString(mContentTypeValue), 621 mPackageName, mClassName, 622 WapPushManagerParams.APP_TYPE_SERVICE, need_sig, more_proc)); 623 } catch (RemoteException e) { 624 assertTrue(false); 625 } 626 627 // verify the data 628 WapPushManager wpman = getService(); 629 assertTrue(wpman.verifyData( 630 Integer.toString(mAppIdValue), 631 Integer.toString(mContentTypeValue), 632 mPackageName, mClassName, 633 WapPushManagerParams.APP_TYPE_SERVICE, need_sig, more_proc)); 634 } 635 636 /** 637 * Updating package test 638 */ 639 public void testUpdatePackage1() { 640 int originalAppIdValue = mAppIdValue; 641 int originalContentTypeValue = mContentTypeValue; 642 643 // set up data 644 try { 645 IWapPushManager iwapman = getInterface(); 646 647 iwapman.addPackage(Integer.toString(mAppIdValue), 648 Integer.toString(mContentTypeValue), mPackageName, mClassName, 649 0, false, false); 650 mAppIdValue += 10; 651 iwapman.addPackage(Integer.toString(mAppIdValue), 652 Integer.toString(mContentTypeValue), mPackageName, mClassName, 653 0, false, false); 654 mContentTypeValue += 20; 655 iwapman.addPackage(Integer.toString(mAppIdValue), 656 Integer.toString(mContentTypeValue), mPackageName, mClassName, 657 0, false, false); 658 mContentTypeValue += 20; 659 iwapman.addPackage(Integer.toString(mAppIdValue), 660 Integer.toString(mContentTypeValue), mPackageName, mClassName, 661 0, false, false); 662 } catch (RemoteException e) { 663 assertTrue(false); 664 } 665 666 mAppIdValue = originalAppIdValue; 667 mContentTypeValue = originalContentTypeValue; 668 utUpdatePackage(false, false); 669 mAppIdValue += 10; 670 utUpdatePackage(false, true); 671 mContentTypeValue += 20; 672 utUpdatePackage(true, false); 673 mContentTypeValue += 20; 674 utUpdatePackage(true, true); 675 676 mAppIdValue = originalAppIdValue; 677 mContentTypeValue = originalContentTypeValue; 678 679 // clean up data 680 try { 681 IWapPushManager iwapman = getInterface(); 682 683 iwapman.deletePackage(Integer.toString(mAppIdValue), 684 Integer.toString(mContentTypeValue), mPackageName, mClassName); 685 mAppIdValue += 10; 686 iwapman.deletePackage(Integer.toString(mAppIdValue), 687 Integer.toString(mContentTypeValue), mPackageName, mClassName); 688 mContentTypeValue += 20; 689 iwapman.deletePackage(Integer.toString(mAppIdValue), 690 Integer.toString(mContentTypeValue), mPackageName, mClassName); 691 mContentTypeValue += 20; 692 iwapman.deletePackage(Integer.toString(mAppIdValue), 693 Integer.toString(mContentTypeValue), mPackageName, mClassName); 694 } catch (RemoteException e) { 695 assertTrue(false); 696 } 697 mAppIdValue = originalAppIdValue; 698 mContentTypeValue = originalContentTypeValue; 699 } 700 701 /** 702 * Updating invalid package test 703 */ 704 public void testUpdatePackage2() { 705 int originalAppIdValue = mAppIdValue; 706 int originalContentTypeValue = mContentTypeValue; 707 708 try { 709 // set up data 710 IWapPushManager iwapman = getInterface(); 711 712 iwapman.addPackage(Integer.toString(mAppIdValue), 713 Integer.toString(mContentTypeValue), mPackageName, mClassName, 714 0, false, false); 715 assertFalse(iwapman.updatePackage( 716 Integer.toString(mAppIdValue + 10), 717 Integer.toString(mContentTypeValue), 718 mPackageName, mClassName, 0, false, false)); 719 assertFalse(iwapman.updatePackage( 720 Integer.toString(mAppIdValue), 721 Integer.toString(mContentTypeValue + 10), 722 mPackageName, mClassName, 0, false, false)); 723 assertTrue(iwapman.updatePackage( 724 Integer.toString(mAppIdValue), 725 Integer.toString(mContentTypeValue), 726 mPackageName + "dummy_data", mClassName, 0, false, false)); 727 assertTrue(iwapman.updatePackage( 728 Integer.toString(mAppIdValue), 729 Integer.toString(mContentTypeValue), 730 mPackageName, mClassName + "dummy_data", 0, false, false)); 731 // clean up data 732 iwapman.deletePackage(Integer.toString(mAppIdValue), 733 Integer.toString(mContentTypeValue), mPackageName, mClassName); 734 iwapman.deletePackage(Integer.toString(mAppIdValue), 735 Integer.toString(mContentTypeValue), mPackageName, 736 mClassName + "dummy_data"); 737 } catch (RemoteException e) { 738 assertTrue(false); 739 } 740 } 741 742 protected void utDeletePackage() { 743 IWapPushManager iwapman = getInterface(); 744 745 try { 746 assertTrue(iwapman.deletePackage( 747 Integer.toString(mAppIdValue), 748 Integer.toString(mContentTypeValue), 749 mPackageName, mClassName)); 750 } catch (RemoteException e) { 751 assertTrue(false); 752 } 753 754 // verify the data 755 WapPushManager wpman = getService(); 756 assertTrue(!wpman.isDataExist( 757 Integer.toString(mAppIdValue), 758 Integer.toString(mContentTypeValue), 759 mPackageName, mClassName)); 760 } 761 762 /** 763 * Deleting package test 764 */ 765 public void testDeletePackage1() { 766 int originalAppIdValue = mAppIdValue; 767 int originalContentTypeValue = mContentTypeValue; 768 769 // set up data 770 try { 771 IWapPushManager iwapman = getInterface(); 772 773 iwapman.addPackage(Integer.toString(mAppIdValue), 774 Integer.toString(mContentTypeValue), mPackageName, mClassName, 775 0, false, false); 776 mAppIdValue += 10; 777 iwapman.addPackage(Integer.toString(mAppIdValue), 778 Integer.toString(mContentTypeValue), mPackageName, mClassName, 779 0, false, false); 780 mContentTypeValue += 20; 781 iwapman.addPackage(Integer.toString(mAppIdValue), 782 Integer.toString(mContentTypeValue), mPackageName, mClassName, 783 0, false, false); 784 mContentTypeValue += 20; 785 iwapman.addPackage(Integer.toString(mAppIdValue), 786 Integer.toString(mContentTypeValue), mPackageName, mClassName, 787 0, false, false); 788 } catch (RemoteException e) { 789 assertTrue(false); 790 } 791 792 mAppIdValue = originalAppIdValue; 793 mContentTypeValue = originalContentTypeValue; 794 utDeletePackage(); 795 mAppIdValue += 10; 796 utDeletePackage(); 797 mContentTypeValue += 20; 798 utDeletePackage(); 799 mContentTypeValue += 20; 800 utDeletePackage(); 801 802 mAppIdValue = originalAppIdValue; 803 mContentTypeValue = originalContentTypeValue; 804 } 805 806 /** 807 * Deleting invalid package test 808 */ 809 public void testDeletePackage2() { 810 int originalAppIdValue = mAppIdValue; 811 int originalContentTypeValue = mContentTypeValue; 812 813 try { 814 // set up data 815 IWapPushManager iwapman = getInterface(); 816 817 iwapman.addPackage(Integer.toString(mAppIdValue), 818 Integer.toString(mContentTypeValue), mPackageName, mClassName, 819 0, false, false); 820 821 assertFalse(iwapman.deletePackage(Integer.toString(mAppIdValue + 10), 822 Integer.toString(mContentTypeValue), mPackageName, mClassName)); 823 assertFalse(iwapman.deletePackage(Integer.toString(mAppIdValue), 824 Integer.toString(mContentTypeValue + 20), mPackageName, mClassName)); 825 assertFalse(iwapman.deletePackage(Integer.toString(mAppIdValue + 10), 826 Integer.toString(mContentTypeValue + 20), mPackageName, mClassName)); 827 828 iwapman.deletePackage(Integer.toString(mAppIdValue), 829 Integer.toString(mContentTypeValue), mPackageName, mClassName); 830 831 } catch (RemoteException e) { 832 assertTrue(false); 833 } 834 } 835 836 837 protected int encodeUint32(int uint32Val, byte[] arr, int start) { 838 int bit = 1; 839 int topbit = 0; 840 int encodeLen; 841 int tmpVal; 842 843 assertTrue(uint32Val >= 0); 844 for (int i = 0; i < 31; i++) { 845 if ((bit & uint32Val) > 0) topbit = i; 846 bit = (bit << 1); 847 } 848 encodeLen = topbit/7 + 1; 849 if (arr == null) return encodeLen; 850 851 //Log.d(LOG_TAG, "uint32Val = " + Integer.toHexString(uint32Val) + ", topbit = " 852 // + topbit + ", encodeLen = " + encodeLen); 853 854 tmpVal = uint32Val; 855 for (int i = encodeLen - 1; i >= 0; i--) { 856 long val = 0; 857 if (i < encodeLen - 1) val = 0x80; 858 val |= tmpVal & 0x7f; 859 arr[start + i] = (byte) (val & 0xFF); 860 tmpVal = (tmpVal >> 7); 861 } 862 return encodeLen; 863 } 864 865 protected int encodeShortInt(int sintVal, byte[] arr, int start) { 866 int encodeLen = 0; 867 868 if (sintVal >= 0x80) return encodeLen; 869 encodeLen = 1; 870 arr[start] = (byte) (sintVal | 0x80); 871 return encodeLen; 872 } 873 874 875 /** 876 * Generate Random WSP header with integer application ID 877 */ 878 protected void createRandomWspHeader(byte[] arr, Random rd, int headerStart, 879 boolean noAppId) { 880 881 boolean appIdAdded = false; 882 883 Log.d(LOG_TAG, "headerStart = " + headerStart + ", appId = " + mAppIdValue 884 + "(" + Integer.toHexString(mAppIdValue) + ")"); 885 Log.d(LOG_TAG, "random arr length:" + arr.length); 886 String typename[] = new String[] { "short int", "long int", "string", "uint32"}; 887 888 while (!appIdAdded) { 889 int type; 890 int index = headerStart; 891 int len = arr.length; 892 int i; 893 boolean addAppid = false; 894 int tmpVal = 0; 895 int tmpVal2 = 0; 896 897 while (true) { 898 int add; 899 900 /* 901 * field name 902 * 0: short int 903 * 1: long int 904 * 2: text 905 * (no uint for param value) 906 */ 907 type = rd.nextInt(3); 908 switch (type) { 909 case 0: // header short integer 910 if (index > 100 && !appIdAdded) addAppid = true; 911 add = 1; 912 break; 913 case 1: // header long int 914 add = 1 + rd.nextInt(29); 915 break; 916 default: // header string 917 add = 2 + rd.nextInt(10); 918 break; 919 } 920 if (index + add >= len) break; 921 922 // fill header name 923 switch (type) { 924 case 0: // header short integer 925 if (!addAppid) { 926 do { 927 arr[index] = (byte) (0x80 | rd.nextInt(128)); 928 } while (arr[index] == (byte) 0xaf); 929 } else { 930 Log.d(LOG_TAG, "appId added."); 931 arr[index] = (byte) 0xaf; 932 // if noAppId case, appId fld must be decieved. 933 if (noAppId) arr[index]++; 934 } 935 break; 936 case 1: // header long int 937 arr[index] = (byte) (add - 1); 938 tmpVal2 = 0; 939 for (i = 1; i < add; i++) { 940 tmpVal = rd.nextInt(255); 941 tmpVal2 = (tmpVal2 << 8) | tmpVal; 942 arr[index + i] = (byte) tmpVal; 943 } 944 // don't set application id 945 if (tmpVal2 == 0x2f) arr[index + 1]++; 946 break; 947 default: // header string 948 for (i = 0; i < add - 1; i++) { 949 tmpVal = rd.nextInt(127); 950 if (tmpVal < 32) tmpVal= (32 + tmpVal); 951 arr[index + i] = (byte) tmpVal; 952 } 953 arr[index + i] = (byte) 0x0; 954 break; 955 } 956 957 if (LOCAL_LOGV) { 958 Log.d(LOG_TAG, "field name index:" + index); 959 Log.d(LOG_TAG, "type:" + typename[type] + ", add:" + add); 960 if (type != 2) { 961 for (i = index; i< index + add; i++) { 962 System.out.print(Integer.toHexString(0xff & arr[i])); 963 System.out.print(' '); 964 } 965 } else { 966 System.out.print(Integer.toHexString(0xff & arr[index])); 967 System.out.print(' '); 968 String str = new String(arr, index + 1, add - 2); 969 for (i = 0; i < str.length(); i++) { 970 System.out.print(str.charAt(i)); 971 System.out.print(' '); 972 } 973 } 974 System.out.print('\n'); 975 } 976 index += add; 977 978 979 /* 980 * field value 981 * 0: short int 982 * 1: long int 983 * 2: text 984 * 3: uint 985 */ 986 if (addAppid) { 987 type = 1; 988 } else { 989 type = rd.nextInt(4); 990 } 991 switch (type) { 992 case 0: // header short integer 993 add = 1; 994 break; 995 case 1: // header long int 996 if (addAppid) { 997 int bit = 1; 998 int topBit = 0; 999 1000 for (i = 0; i < 31; i++) { 1001 if ((mAppIdValue & bit) > 0) topBit = i; 1002 bit = (bit << 1); 1003 } 1004 add = 2 + topBit/8; 1005 } else { 1006 add = 1 + rd.nextInt(29); 1007 } 1008 break; 1009 case 2: // header string 1010 add = 2 + rd.nextInt(10); 1011 break; 1012 default: // uint32 1013 add = 6; 1014 } 1015 if (index + add >= len) break; 1016 1017 // fill field value 1018 switch (type) { 1019 case 0: // header short int 1020 arr[index] = (byte) (0x80 | rd.nextInt(128)); 1021 break; 1022 case 1: // header long int 1023 if (addAppid) { 1024 addAppid = false; 1025 appIdAdded = true; 1026 1027 arr[index] = (byte) (add - 1); 1028 tmpVal = mAppIdValue; 1029 for (i = add; i > 1; i--) { 1030 arr[index + i - 1] = (byte) (tmpVal & 0xff); 1031 tmpVal = (tmpVal >> 8); 1032 } 1033 } else { 1034 arr[index] = (byte) (add - 1); 1035 for (i = 1; i < add; i++) { 1036 arr[index + i] = (byte) rd.nextInt(255); 1037 } 1038 } 1039 break; 1040 case 2:// header string 1041 for (i = 0; i < add - 1; i++) { 1042 tmpVal = rd.nextInt(127); 1043 if (tmpVal < 32) tmpVal= (32 + tmpVal); 1044 arr[index + i] = (byte) tmpVal; 1045 } 1046 arr[index + i] = (byte) 0x0; 1047 break; 1048 default: // header uvarint 1049 arr[index] = (byte) 31; 1050 tmpVal = rd.nextInt(0x0FFFFFFF); 1051 add = 1 + encodeUint32(tmpVal, null, index + 1); 1052 encodeUint32(tmpVal, arr, index + 1); 1053 break; 1054 1055 } 1056 1057 if (LOCAL_LOGV) { 1058 Log.d(LOG_TAG, "field value index:" + index); 1059 Log.d(LOG_TAG, "type:" + typename[type] + ", add:" + add); 1060 if (type != 2) { 1061 for (i = index; i< index + add; i++) { 1062 System.out.print(Integer.toHexString(0xff & arr[i])); 1063 System.out.print(' '); 1064 } 1065 } else { 1066 System.out.print(Integer.toHexString(0xff & arr[index])); 1067 System.out.print(' '); 1068 String str = new String(arr, index + 1, add - 2); 1069 for (i = 0; i < str.length(); i++) { 1070 System.out.print(str.charAt(i)); 1071 System.out.print(' '); 1072 } 1073 } 1074 System.out.print('\n'); 1075 } 1076 index += add; 1077 } 1078 if (noAppId) break; 1079 } 1080 1081 Log.d(LOG_TAG, HexDump.dumpHexString(arr)); 1082 } 1083 1084 /** 1085 * Generate Random WSP header with string application ID 1086 */ 1087 protected void createRandomWspHeaderStrAppId(byte[] arr, Random rd, int headerStart, 1088 boolean randomStr) { 1089 1090 boolean appIdAdded = false; 1091 1092 Log.d(LOG_TAG, "random arr length:" + arr.length); 1093 String typename[] = new String[] { "short int", "long int", "string", "uint32"}; 1094 1095 while (!appIdAdded) { 1096 int type; 1097 int index = headerStart; 1098 int len = arr.length; 1099 int i; 1100 boolean addAppid = false; 1101 int tmpVal = 0; 1102 int tmpVal2 = 0; 1103 1104 while (true) { 1105 int add; 1106 1107 /* 1108 * field name 1109 * 0: short int 1110 * 1: long int 1111 * 2: text 1112 * (no uint for param value) 1113 */ 1114 type = rd.nextInt(3); 1115 switch (type) { 1116 case 0: // header short integer 1117 if (index > 100 && !appIdAdded) addAppid = true; 1118 add = 1; 1119 break; 1120 case 1: // header long int 1121 add = 1 + rd.nextInt(29); 1122 break; 1123 default: // header string 1124 add = 2 + rd.nextInt(10); 1125 break; 1126 } 1127 if (index + add >= len) break; 1128 1129 // fill header name 1130 switch (type) { 1131 case 0: // header short integer 1132 if (!addAppid) { 1133 do { 1134 arr[index] = (byte) (0x80 | rd.nextInt(128)); 1135 } while (arr[index] == (byte) 0xaf); 1136 } else { 1137 Log.d(LOG_TAG, "appId added."); 1138 arr[index] = (byte) 0xaf; 1139 } 1140 break; 1141 case 1: // header long int 1142 arr[index] = (byte) (add - 1); 1143 tmpVal2 = 0; 1144 for (i = 1; i < add; i++) { 1145 tmpVal = rd.nextInt(255); 1146 tmpVal2 = (tmpVal2 << 8) | tmpVal; 1147 arr[index + i] = (byte) tmpVal; 1148 } 1149 // don't set application id 1150 if (tmpVal2 == 0x2f) arr[index + 1]++; 1151 break; 1152 default: // header string 1153 for (i = 0; i < add - 1; i++) { 1154 tmpVal = rd.nextInt(127); 1155 if (tmpVal < 32) tmpVal= (32 + tmpVal); 1156 arr[index + i] = (byte) tmpVal; 1157 } 1158 arr[index + i] = (byte) 0x0; 1159 break; 1160 } 1161 1162 if (LOCAL_LOGV) { 1163 Log.d(LOG_TAG, "field name index:" + index); 1164 Log.d(LOG_TAG, "type:" + typename[type] + ", add:" + add); 1165 if (type != 2) { 1166 for (i = index; i < index + add; i++) { 1167 System.out.print(Integer.toHexString(0xff & arr[i])); 1168 System.out.print(' '); 1169 } 1170 } else { 1171 System.out.print(Integer.toHexString(0xff & arr[index])); 1172 System.out.print(' '); 1173 String str = new String(arr, index + 1, add - 2); 1174 for (i = 0; i < str.length(); i++) { 1175 System.out.print(str.charAt(i)); 1176 System.out.print(' '); 1177 } 1178 } 1179 System.out.print('\n'); 1180 } 1181 index += add; 1182 1183 1184 /* 1185 * field value 1186 * 0: short int 1187 * 1: long int 1188 * 2: text 1189 * 3: uint 1190 */ 1191 if (addAppid) { 1192 type = 2; 1193 } else { 1194 type = rd.nextInt(4); 1195 } 1196 switch (type) { 1197 case 0: // header short integer 1198 add = 1; 1199 break; 1200 case 1: // header long int 1201 add = 1 + rd.nextInt(29); 1202 break; 1203 case 2: // header string 1204 if (addAppid) { 1205 if (randomStr) { 1206 add = 1 + rd.nextInt(10); 1207 byte[] randStr= new byte[add]; 1208 for (i = 0; i < add; i++) { 1209 tmpVal = rd.nextInt(127); 1210 if (tmpVal < 32) tmpVal= (32 + tmpVal); 1211 randStr[i] = (byte) tmpVal; 1212 } 1213 mAppIdName = new String(randStr); 1214 } 1215 add = mAppIdName.length() + 1; 1216 } else { 1217 add = 2 + rd.nextInt(10); 1218 } 1219 break; 1220 default: // uint32 1221 add = 6; 1222 } 1223 if (index + add >= len) break; 1224 1225 // fill field value 1226 switch (type) { 1227 case 0: // header short int 1228 arr[index] = (byte) (0x80 | rd.nextInt(128)); 1229 break; 1230 case 1: // header long int 1231 arr[index] = (byte) (add - 1); 1232 for (i = 1; i < add; i++) 1233 arr[index + i] = (byte) rd.nextInt(255); 1234 break; 1235 case 2:// header string 1236 if (addAppid) { 1237 addAppid = false; 1238 appIdAdded = true; 1239 for (i = 0; i < add - 1; i++) { 1240 arr[index + i] = (byte) (mAppIdName.charAt(i)); 1241 } 1242 Log.d(LOG_TAG, "mAppIdName added [" + mAppIdName + "]"); 1243 } else { 1244 for (i = 0; i < add - 1; i++) { 1245 tmpVal = rd.nextInt(127); 1246 if (tmpVal < 32) tmpVal= (32 + tmpVal); 1247 arr[index + i] = (byte) tmpVal; 1248 } 1249 } 1250 arr[index + i] = (byte) 0x0; 1251 break; 1252 default: // header uvarint 1253 arr[index] = (byte) 31; 1254 tmpVal = rd.nextInt(0x0FFFFFFF); 1255 add = 1 + encodeUint32(tmpVal, null, index + 1); 1256 encodeUint32(tmpVal, arr, index + 1); 1257 break; 1258 1259 } 1260 1261 if (LOCAL_LOGV) { 1262 Log.d(LOG_TAG, "field value index:" + index); 1263 Log.d(LOG_TAG, "type:" + typename[type] + ", add:" + add); 1264 if (type != 2) { 1265 for (i = index; i < index + add; i++) { 1266 System.out.print(Integer.toHexString(0xff & arr[i])); 1267 System.out.print(' '); 1268 } 1269 } else { 1270 System.out.print(Integer.toHexString(0xff & arr[index])); 1271 System.out.print(' '); 1272 String str = new String(arr, index + 1, add - 2); 1273 for (i = 0; i < str.length(); i++) { 1274 System.out.print(str.charAt(i)); 1275 System.out.print(' '); 1276 } 1277 } 1278 System.out.print('\n'); 1279 } 1280 index += add; 1281 } 1282 } 1283 1284 Log.d(LOG_TAG, "headerStart = " + headerStart + ", mAppIdName = " + mAppIdName); 1285 Log.d(LOG_TAG, HexDump.dumpHexString(arr)); 1286 } 1287 1288 protected byte[] createPDU(int testNum) { 1289 byte[] array = null; 1290 // byte[] wsp = null; 1291 1292 switch (testNum) { 1293 // sample pdu 1294 case 1: 1295 byte[] array1 = { 1296 (byte) 0x00, // TID 1297 (byte) 0x06, // Type = wap push 1298 (byte) 0x00, // Length to be set later. 1299 1300 // Content-Type 1301 (byte) 0x03, (byte) 0x02, 1302 (byte) ((mContentTypeValue >> 8) & 0xff), 1303 (byte) (mContentTypeValue & 0xff), 1304 1305 // Application-id 1306 (byte) 0xaf, (byte) 0x02, 1307 (byte) ((mAppIdValue >> 8) & 0xff), 1308 (byte) (mAppIdValue& 0xff) 1309 }; 1310 array1[2] = (byte) (array1.length - 3); 1311 mWspHeader = array1; 1312 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length + 7; 1313 mWspHeaderLen = array1.length; 1314 break; 1315 1316 // invalid wsp header 1317 case 2: 1318 byte[] array2 = { 1319 (byte) 0x00, // invalid data 1320 }; 1321 mWspHeader = array2; 1322 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length; 1323 mWspHeaderLen = array2.length; 1324 break; 1325 1326 // random wsp header 1327 case 3: 1328 Random rd = new Random(); 1329 int arrSize = 150 + rd.nextInt(100); 1330 byte[] array3 = new byte[arrSize]; 1331 int hdrEncodeLen; 1332 1333 array3[0] = (byte) 0x0; 1334 array3[1] = (byte) 0x6; 1335 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1336 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1337 array3[hdrEncodeLen + 2] = (byte) 0x3; 1338 array3[hdrEncodeLen + 3] = (byte) 0x2; 1339 array3[hdrEncodeLen + 4] = (byte) ((mContentTypeValue >> 8) & 0xff); 1340 array3[hdrEncodeLen + 5] = (byte) (mContentTypeValue & 0xff); 1341 createRandomWspHeader(array3, rd, hdrEncodeLen + 6, false); 1342 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length + hdrEncodeLen + 6; 1343 mWspHeaderLen = array3.length; 1344 1345 Log.d(LOG_TAG, "mContentTypeValue = " + mContentTypeValue 1346 + "(" + Integer.toHexString(mContentTypeValue) + ")"); 1347 1348 mWspHeader = array3; 1349 break; 1350 1351 // random wsp header w/o appid 1352 case 4: 1353 rd = new Random(); 1354 arrSize = 150 + rd.nextInt(100); 1355 array3 = new byte[arrSize]; 1356 1357 array3[0] = (byte) 0x0; 1358 array3[1] = (byte) 0x6; 1359 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1360 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1361 array3[hdrEncodeLen + 2] = (byte) 0x3; 1362 array3[hdrEncodeLen + 3] = (byte) 0x2; 1363 array3[hdrEncodeLen + 4] = (byte) ((mContentTypeValue >> 8) & 0xff); 1364 array3[hdrEncodeLen + 5] = (byte) (mContentTypeValue & 0xff); 1365 createRandomWspHeader(array3, rd, hdrEncodeLen + 6, true); 1366 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length + hdrEncodeLen + 6; 1367 mWspHeaderLen = array3.length; 1368 1369 Log.d(LOG_TAG, "mContentTypeValue = " + mContentTypeValue 1370 + "(" + Integer.toHexString(mContentTypeValue) + ")"); 1371 1372 mWspHeader = array3; 1373 break; 1374 1375 // random wsp header w/ random appid string 1376 case 5: 1377 rd = new Random(); 1378 arrSize = 150 + rd.nextInt(100); 1379 array3 = new byte[arrSize]; 1380 1381 array3[0] = (byte) 0x0; 1382 array3[1] = (byte) 0x6; 1383 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1384 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1385 array3[hdrEncodeLen + 2] = (byte) 0x3; 1386 array3[hdrEncodeLen + 3] = (byte) 0x2; 1387 array3[hdrEncodeLen + 4] = (byte) ((mContentTypeValue >> 8) & 0xff); 1388 array3[hdrEncodeLen + 5] = (byte) (mContentTypeValue & 0xff); 1389 createRandomWspHeaderStrAppId(array3, rd, hdrEncodeLen + 6, true); 1390 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length + hdrEncodeLen + 6; 1391 mWspHeaderLen = array3.length; 1392 1393 Log.d(LOG_TAG, "mContentTypeValue = " + mContentTypeValue 1394 + "(" + Integer.toHexString(mContentTypeValue) + ")"); 1395 1396 mWspHeader = array3; 1397 break; 1398 1399 // random wsp header w/ OMA appid string 1400 case 6: 1401 rd = new Random(); 1402 arrSize = 150 + rd.nextInt(100); 1403 array3 = new byte[arrSize]; 1404 1405 array3[0] = (byte) 0x0; 1406 array3[1] = (byte) 0x6; 1407 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1408 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1409 array3[hdrEncodeLen + 2] = (byte) 0x3; 1410 array3[hdrEncodeLen + 3] = (byte) 0x2; 1411 array3[hdrEncodeLen + 4] = (byte) ((mContentTypeValue >> 8) & 0xff); 1412 array3[hdrEncodeLen + 5] = (byte) (mContentTypeValue & 0xff); 1413 createRandomWspHeaderStrAppId(array3, rd, hdrEncodeLen + 6, false); 1414 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length + hdrEncodeLen + 6; 1415 mWspHeaderLen = array3.length; 1416 1417 Log.d(LOG_TAG, "mContentTypeValue = " + mContentTypeValue 1418 + "(" + Integer.toHexString(mContentTypeValue) + ")"); 1419 1420 mWspHeader = array3; 1421 break; 1422 1423 // random wsp header w/ OMA content type 1424 case 7: 1425 rd = new Random(); 1426 arrSize = 150 + rd.nextInt(100); 1427 array3 = new byte[arrSize]; 1428 1429 array3[0] = (byte) 0x0; 1430 array3[1] = (byte) 0x6; 1431 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1432 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1433 1434 // encode content type 1435 int contentLen = mContentTypeName.length(); 1436 int next = 2 + hdrEncodeLen; 1437 mWspContentTypeStart = mGsmHeader.length + mUserDataHeader.length + next; 1438 // next += encodeUint32(contentLen, array3, next); 1439 int i; 1440 Log.d(LOG_TAG, "mContentTypeName = " + mContentTypeName 1441 + ", contentLen = " + contentLen); 1442 1443 for (i = 0; i < contentLen; i++) { 1444 array3[next + i] = (byte) mContentTypeName.charAt(i); 1445 } 1446 array3[next + i] = (byte) 0x0; 1447 1448 createRandomWspHeader(array3, rd, next + contentLen + 1, false); 1449 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length 1450 + next + contentLen + 1; 1451 mWspHeaderLen = array3.length; 1452 1453 mWspHeader = array3; 1454 break; 1455 1456 // random wsp header w/ OMA content type, OMA app ID 1457 case 8: 1458 rd = new Random(); 1459 arrSize = 150 + rd.nextInt(100); 1460 array3 = new byte[arrSize]; 1461 1462 array3[0] = (byte) 0x0; 1463 array3[1] = (byte) 0x6; 1464 hdrEncodeLen = encodeUint32(array3.length, null, 2); 1465 hdrEncodeLen = encodeUint32(array3.length - hdrEncodeLen - 2, array3, 2); 1466 1467 // encode content type 1468 contentLen = mContentTypeName.length(); 1469 next = 2 + hdrEncodeLen; 1470 mWspContentTypeStart = mGsmHeader.length + mUserDataHeader.length + next; 1471 // next += encodeUint32(contentLen, array3, next); 1472 Log.d(LOG_TAG, "mContentTypeName = " + mContentTypeName 1473 + ", contentLen = " + contentLen); 1474 1475 for (i = 0; i < contentLen; i++) { 1476 array3[next + i] = (byte) mContentTypeName.charAt(i); 1477 } 1478 array3[next + i] = (byte) 0x0; 1479 1480 createRandomWspHeaderStrAppId(array3, rd, next + contentLen + 1, false); 1481 mWspHeaderStart = mGsmHeader.length + mUserDataHeader.length 1482 + next + contentLen + 1; 1483 mWspHeaderLen = array3.length; 1484 1485 mWspHeader = array3; 1486 break; 1487 1488 default: 1489 return null; 1490 } 1491 array = new byte[mGsmHeader.length + mUserDataHeader.length + mWspHeader.length 1492 + mMessageBody.length]; 1493 System.arraycopy(mGsmHeader, 0, array, 0, mGsmHeader.length); 1494 System.arraycopy(mUserDataHeader, 0, array, 1495 mGsmHeader.length, mUserDataHeader.length); 1496 System.arraycopy(mWspHeader, 0, array, 1497 mGsmHeader.length + mUserDataHeader.length, mWspHeader.length); 1498 System.arraycopy(mMessageBody, 0, array, 1499 mGsmHeader.length + mUserDataHeader.length + mWspHeader.length, 1500 mMessageBody.length); 1501 return array; 1502 1503 } 1504 1505 Intent createIntent(int pduType, int tranId) { 1506 Intent intent = new Intent(); 1507 intent.putExtra("transactionId", tranId); 1508 intent.putExtra("pduType", pduType); 1509 intent.putExtra("header", mGsmHeader); 1510 intent.putExtra("data", mMessageBody); 1511 // intent.putExtra("contentTypeParameters", null); 1512 return intent; 1513 } 1514 1515 /** 1516 * Message processing test, start activity 1517 */ 1518 public void testProcessMsg1() { 1519 byte[] pdu = createPDU(1); 1520 int headerLen = pdu.length - 1521 (mGsmHeader.length + mUserDataHeader.length + mMessageBody.length); 1522 int pduType = 6; 1523 int tranId = 0; 1524 String originalPackageName = mPackageName; 1525 String originalClassName = mClassName; 1526 1527 try { 1528 1529 mClassName = "com.android.smspush.unitTests.ReceiverActivity"; 1530 1531 // set up data 1532 IWapPushManager iwapman = getInterface(); 1533 iwapman.addPackage(Integer.toString(mAppIdValue), 1534 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1535 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 1536 1537 assertTrue((iwapman.processMessage( 1538 Integer.toString(mAppIdValue), 1539 Integer.toString(mContentTypeValue), 1540 createIntent(pduType, tranId)) 1541 & WapPushManagerParams.MESSAGE_HANDLED) == 1542 WapPushManagerParams.MESSAGE_HANDLED); 1543 1544 // clean up data 1545 iwapman.deletePackage(Integer.toString(mAppIdValue), 1546 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1547 1548 } catch (RemoteException e) { 1549 assertTrue(false); 1550 } 1551 1552 mPackageName = originalPackageName; 1553 mClassName = originalClassName; 1554 } 1555 1556 /** 1557 * Message processing test, start service 1558 */ 1559 public void testProcessMsg2() { 1560 byte[] pdu = createPDU(1); 1561 int headerLen = pdu.length - (mGsmHeader.length + 1562 mUserDataHeader.length + mMessageBody.length); 1563 int pduType = 6; 1564 int tranId = 0; 1565 String originalPackageName = mPackageName; 1566 String originalClassName = mClassName; 1567 1568 try { 1569 1570 mClassName = "com.android.smspush.unitTests.ReceiverService"; 1571 1572 // set up data 1573 IWapPushManager iwapman = getInterface(); 1574 1575 iwapman.addPackage(Integer.toString(mAppIdValue), 1576 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1577 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 1578 1579 assertTrue((iwapman.processMessage( 1580 Integer.toString(mAppIdValue), 1581 Integer.toString(mContentTypeValue), 1582 createIntent(pduType, tranId)) 1583 & WapPushManagerParams.MESSAGE_HANDLED) == 1584 WapPushManagerParams.MESSAGE_HANDLED); 1585 1586 // clean up data 1587 iwapman.deletePackage(Integer.toString(mAppIdValue), 1588 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1589 1590 } catch (RemoteException e) { 1591 assertTrue(false); 1592 } 1593 1594 mPackageName = originalPackageName; 1595 mClassName = originalClassName; 1596 } 1597 1598 /** 1599 * Message processing test, no signature 1600 */ 1601 public void testProcessMsg3() { 1602 byte[] pdu = createPDU(1); 1603 int headerLen = pdu.length - 1604 (mGsmHeader.length + mUserDataHeader.length + mMessageBody.length); 1605 int pduType = 6; 1606 int tranId = 0; 1607 String originalPackageName = mPackageName; 1608 String originalClassName = mClassName; 1609 1610 try { 1611 1612 mPackageName = "com.android.development"; 1613 mClassName = "com.android.development.Development"; 1614 1615 // set up data 1616 IWapPushManager iwapman = getInterface(); 1617 1618 iwapman.addPackage(Integer.toString(mAppIdValue), 1619 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1620 WapPushManagerParams.APP_TYPE_SERVICE, true, false); 1621 1622 assertFalse((iwapman.processMessage( 1623 Integer.toString(mAppIdValue), 1624 Integer.toString(mContentTypeValue), 1625 createIntent(pduType, tranId)) 1626 & WapPushManagerParams.MESSAGE_HANDLED) == 1627 WapPushManagerParams.MESSAGE_HANDLED); 1628 1629 // clean up data 1630 iwapman.deletePackage(Integer.toString(mAppIdValue), 1631 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1632 1633 } catch (RemoteException e) { 1634 assertTrue(false); 1635 } 1636 1637 mPackageName = originalPackageName; 1638 mClassName = originalClassName; 1639 } 1640 1641 IDataVerify getVerifyInterface() { 1642 while (mIVerify == null) { 1643 // wait for the activity receive data. 1644 try { 1645 Thread.sleep(TIME_WAIT); 1646 } catch (InterruptedException e) {} 1647 } 1648 return mIVerify; 1649 } 1650 1651 1652 /** 1653 * Message processing test, received body data verification test 1654 */ 1655 public void testProcessMsg4() { 1656 byte[] originalMessageBody = mMessageBody; 1657 mMessageBody = new byte[] { 1658 (byte) 0xee, 1659 (byte) 0xff, 1660 (byte) 0xee, 1661 (byte) 0xff, 1662 (byte) 0xee, 1663 (byte) 0xff, 1664 (byte) 0xee, 1665 (byte) 0xff, 1666 (byte) 0xee, 1667 (byte) 0xff, 1668 (byte) 0xee, 1669 (byte) 0xff, 1670 }; 1671 1672 byte[] pdu = createPDU(1); 1673 int headerLen = pdu.length - 1674 (mGsmHeader.length + mUserDataHeader.length + mMessageBody.length); 1675 int pduType = 6; 1676 int tranId = 0; 1677 String originalPackageName = mPackageName; 1678 String originalClassName = mClassName; 1679 1680 try { 1681 IWapPushManager iwapman = getInterface(); 1682 IDataVerify dataverify = getVerifyInterface(); 1683 1684 dataverify.resetData(); 1685 1686 // set up data 1687 mClassName = "com.android.smspush.unitTests.ReceiverActivity"; 1688 iwapman.addPackage(Integer.toString(mAppIdValue), 1689 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1690 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 1691 1692 iwapman.processMessage( 1693 Integer.toString(mAppIdValue), 1694 Integer.toString(mContentTypeValue), 1695 createIntent(pduType, tranId)); 1696 1697 // clean up data 1698 iwapman.deletePackage(Integer.toString(mAppIdValue), 1699 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1700 1701 assertTrue(dataverify.verifyData(mMessageBody)); 1702 1703 // set up data 1704 dataverify.resetData(); 1705 mClassName = "com.android.smspush.unitTests.ReceiverService"; 1706 mMessageBody = new byte[] { 1707 (byte) 0xaa, 1708 (byte) 0xbb, 1709 (byte) 0x11, 1710 (byte) 0x22, 1711 (byte) 0xaa, 1712 (byte) 0xbb, 1713 (byte) 0x11, 1714 (byte) 0x22, 1715 (byte) 0xaa, 1716 (byte) 0xbb, 1717 (byte) 0x11, 1718 (byte) 0x22, 1719 (byte) 0xaa, 1720 (byte) 0xbb, 1721 (byte) 0x11, 1722 (byte) 0x22, 1723 (byte) 0xaa, 1724 (byte) 0xbb, 1725 (byte) 0x11, 1726 (byte) 0x22, 1727 (byte) 0xaa, 1728 (byte) 0xbb, 1729 (byte) 0x11, 1730 (byte) 0x22, 1731 }; 1732 pdu = createPDU(1); 1733 iwapman.addPackage(Integer.toString(mAppIdValue), 1734 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1735 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 1736 1737 iwapman.processMessage( 1738 Integer.toString(mAppIdValue), 1739 Integer.toString(mContentTypeValue), 1740 createIntent(pduType, tranId)); 1741 1742 // clean up data 1743 iwapman.deletePackage(Integer.toString(mAppIdValue), 1744 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1745 1746 // Log.d(LOG_TAG, HexDump.dumpHexString(mMessageBody)); 1747 assertTrue(dataverify.verifyData(mMessageBody)); 1748 } catch (RemoteException e) { 1749 assertTrue(false); 1750 } 1751 1752 mPackageName = originalPackageName; 1753 mClassName = originalClassName; 1754 mMessageBody = originalMessageBody; 1755 } 1756 1757 /** 1758 * Message processing test, send invalid sms data 1759 */ 1760 public void testProcessMsg5() { 1761 byte[] pdu = createPDU(2); 1762 int headerLen = pdu.length - 1763 (mGsmHeader.length + mUserDataHeader.length + mMessageBody.length); 1764 int pduType = 6; 1765 int tranId = 0; 1766 String originalPackageName = mPackageName; 1767 String originalClassName = mClassName; 1768 1769 try { 1770 1771 mClassName = "com.android.smspush.unitTests.ReceiverActivity"; 1772 1773 // set up data 1774 IWapPushManager iwapman = getInterface(); 1775 iwapman.addPackage(Integer.toString(mAppIdValue), 1776 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1777 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 1778 1779 assertTrue((iwapman.processMessage( 1780 Integer.toString(mAppIdValue), 1781 Integer.toString(mContentTypeValue), 1782 createIntent(pduType, tranId)) 1783 & WapPushManagerParams.MESSAGE_HANDLED) == 1784 WapPushManagerParams.MESSAGE_HANDLED); 1785 1786 // clean up data 1787 iwapman.deletePackage(Integer.toString(mAppIdValue), 1788 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1789 1790 } catch (RemoteException e) { 1791 assertTrue(false); 1792 } 1793 1794 mPackageName = originalPackageName; 1795 mClassName = originalClassName; 1796 } 1797 1798 /** 1799 * Message processing test, no receiver application 1800 */ 1801 public void testProcessMsg6() { 1802 byte[] pdu = createPDU(1); 1803 int headerLen = pdu.length - 1804 (mGsmHeader.length + mUserDataHeader.length + mMessageBody.length); 1805 int pduType = 6; 1806 int tranId = 0; 1807 String originalPackageName = mPackageName; 1808 String originalClassName = mClassName; 1809 1810 try { 1811 1812 mClassName = "com.android.smspush.unitTests.NoReceiver"; 1813 1814 // set up data 1815 IWapPushManager iwapman = getInterface(); 1816 iwapman.addPackage(Integer.toString(mAppIdValue), 1817 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1818 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 1819 1820 assertFalse((iwapman.processMessage( 1821 Integer.toString(mAppIdValue), 1822 Integer.toString(mContentTypeValue), 1823 createIntent(pduType, tranId)) 1824 & WapPushManagerParams.MESSAGE_HANDLED) == 1825 WapPushManagerParams.MESSAGE_HANDLED); 1826 1827 // clean up data 1828 iwapman.deletePackage(Integer.toString(mAppIdValue), 1829 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1830 1831 // set up data 1832 iwapman.addPackage(Integer.toString(mAppIdValue), 1833 Integer.toString(mContentTypeValue), mPackageName, mClassName, 1834 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 1835 1836 assertFalse((iwapman.processMessage( 1837 Integer.toString(mAppIdValue), 1838 Integer.toString(mContentTypeValue), 1839 createIntent(pduType, tranId)) 1840 & WapPushManagerParams.MESSAGE_HANDLED) == 1841 WapPushManagerParams.MESSAGE_HANDLED); 1842 1843 // clean up data 1844 iwapman.deletePackage(Integer.toString(mAppIdValue), 1845 Integer.toString(mContentTypeValue), mPackageName, mClassName); 1846 1847 } catch (RemoteException e) { 1848 assertTrue(false); 1849 } 1850 1851 mPackageName = originalPackageName; 1852 mClassName = originalClassName; 1853 } 1854 1855 /** 1856 * WspTypeDecoder test, normal pdu 1857 */ 1858 public void testDecoder1() { 1859 boolean res; 1860 int originalAppIdValue = mAppIdValue; 1861 Random rd = new Random(); 1862 1863 for (int i = 0; i < 10; i++) { 1864 mAppIdValue = rd.nextInt(0xFFFF); 1865 byte[] pdu = createPDU(1); 1866 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 1867 1868 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 1869 mWspHeaderStart + mWspHeaderLen - 1); 1870 assertTrue(res); 1871 1872 int index = (int) pduDecoder.getValue32(); 1873 res = pduDecoder.decodeXWapApplicationId(index); 1874 assertTrue(res); 1875 1876 Log.d(LOG_TAG, "mAppIdValue: " + mAppIdValue 1877 + ", val: " + pduDecoder.getValue32()); 1878 assertTrue(mAppIdValue == (int) pduDecoder.getValue32()); 1879 } 1880 1881 mAppIdValue = originalAppIdValue; 1882 } 1883 1884 /** 1885 * WspTypeDecoder test, no header 1886 */ 1887 public void testDecoder2() { 1888 boolean res; 1889 int originalAppIdValue = mAppIdValue; 1890 Random rd = new Random(); 1891 1892 mAppIdValue = rd.nextInt(0xFFFF); 1893 byte[] pdu = createPDU(2); 1894 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 1895 1896 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 1897 mWspHeaderStart + mWspHeaderLen - 1); 1898 assertFalse(res); 1899 1900 mAppIdValue = originalAppIdValue; 1901 } 1902 1903 /** 1904 * WspTypeDecoder test, decode appid test 1905 */ 1906 public void testDecoder3() { 1907 boolean res; 1908 int originalAppIdValue = mAppIdValue; 1909 int originalContentTypeValue = mContentTypeValue; 1910 Random rd = new Random(); 1911 1912 for (int i = 0; i < 100; i++) { 1913 mAppIdValue = rd.nextInt(0x0FFFFFFF); 1914 mContentTypeValue = rd.nextInt(0x0FFF); 1915 byte[] pdu = createPDU(3); 1916 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 1917 1918 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 1919 mWspHeaderStart + mWspHeaderLen - 1); 1920 assertTrue(res); 1921 1922 int index = (int) pduDecoder.getValue32(); 1923 res = pduDecoder.decodeXWapApplicationId(index); 1924 assertTrue(res); 1925 1926 Log.d(LOG_TAG, "mAppIdValue: " + mAppIdValue 1927 + ", val: " + pduDecoder.getValue32()); 1928 assertTrue(mAppIdValue == (int) pduDecoder.getValue32()); 1929 } 1930 1931 mAppIdValue = originalAppIdValue; 1932 mContentTypeValue = originalContentTypeValue; 1933 } 1934 1935 /* 1936 public void testEnc() { 1937 byte[] arr = new byte[20]; 1938 int index = 0; 1939 index += encodeUint32(0x87a5, arr, index); 1940 index += encodeUint32(0x1, arr, index); 1941 index += encodeUint32(0x9b, arr, index); 1942 index += encodeUint32(0x10, arr, index); 1943 index += encodeUint32(0xe0887, arr, index); 1944 index += encodeUint32(0x791a23d0, arr, index); 1945 1946 Log.d(LOG_TAG, HexDump.dumpHexString(arr)); 1947 } 1948 */ 1949 1950 /** 1951 * WspTypeDecoder test, no appid test 1952 */ 1953 public void testDecoder4() { 1954 boolean res; 1955 int originalAppIdValue = mAppIdValue; 1956 int originalContentTypeValue = mContentTypeValue; 1957 Random rd = new Random(); 1958 1959 for (int i = 0; i < 100; i++) { 1960 mAppIdValue = rd.nextInt(0x0FFFFFFF); 1961 mContentTypeValue = rd.nextInt(0x0FFF); 1962 byte[] pdu = createPDU(4); 1963 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 1964 1965 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 1966 mWspHeaderStart + mWspHeaderLen - 1); 1967 assertFalse(res); 1968 1969 } 1970 1971 mAppIdValue = originalAppIdValue; 1972 mContentTypeValue = originalContentTypeValue; 1973 } 1974 1975 /** 1976 * WspTypeDecoder test, decode string appid test 1977 */ 1978 public void testDecoder5() { 1979 boolean res; 1980 String originalAppIdName = mAppIdName; 1981 int originalContentTypeValue = mContentTypeValue; 1982 Random rd = new Random(); 1983 1984 for (int i = 0; i < 10; i++) { 1985 mAppIdValue = rd.nextInt(0x0FFFFFFF); 1986 mContentTypeValue = rd.nextInt(0x0FFF); 1987 byte[] pdu = createPDU(5); 1988 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 1989 1990 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 1991 mWspHeaderStart + mWspHeaderLen - 1); 1992 assertTrue(res); 1993 1994 int index = (int) pduDecoder.getValue32(); 1995 res = pduDecoder.decodeXWapApplicationId(index); 1996 assertTrue(res); 1997 1998 Log.d(LOG_TAG, "mAppIdValue: [" + mAppIdName + "], val: [" 1999 + pduDecoder.getValueString() + "]"); 2000 assertTrue(mAppIdName.equals(pduDecoder.getValueString())); 2001 } 2002 2003 mAppIdName = originalAppIdName; 2004 mContentTypeValue = originalContentTypeValue; 2005 } 2006 2007 /** 2008 * WspTypeDecoder test, decode string appid test 2009 */ 2010 public void testDecoder6() { 2011 boolean res; 2012 String originalAppIdName = mAppIdName; 2013 int originalContentTypeValue = mContentTypeValue; 2014 Random rd = new Random(); 2015 2016 for (int i = 0; i < OMA_APPLICATION_ID_NAMES.length; i++) { 2017 mAppIdName = OMA_APPLICATION_ID_NAMES[i]; 2018 mContentTypeValue = rd.nextInt(0x0FFF); 2019 byte[] pdu = createPDU(6); 2020 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 2021 2022 res = pduDecoder.seekXWapApplicationId(mWspHeaderStart, 2023 mWspHeaderStart + mWspHeaderLen - 1); 2024 assertTrue(res); 2025 2026 int index = (int) pduDecoder.getValue32(); 2027 res = pduDecoder.decodeXWapApplicationId(index); 2028 assertTrue(res); 2029 2030 Log.d(LOG_TAG, "mAppIdValue: [" + mAppIdName + "], val: [" 2031 + pduDecoder.getValueString() + "]"); 2032 assertTrue(mAppIdName.equals(pduDecoder.getValueString())); 2033 } 2034 2035 mAppIdName = originalAppIdName; 2036 mContentTypeValue = originalContentTypeValue; 2037 } 2038 2039 /** 2040 * WspTypeDecoder test, decode OMA content type 2041 */ 2042 public void testDecoder7() { 2043 boolean res; 2044 String originalAppIdName = mAppIdName; 2045 int originalContentTypeValue = mContentTypeValue; 2046 Random rd = new Random(); 2047 2048 for (int i = 0; i < OMA_CONTENT_TYPE_NAMES.length; i++) { 2049 mContentTypeName = OMA_CONTENT_TYPE_NAMES[i]; 2050 byte[] pdu = createPDU(7); 2051 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 2052 2053 res = pduDecoder.decodeContentType(mWspContentTypeStart); 2054 assertTrue(res); 2055 2056 Log.d(LOG_TAG, "mContentTypeName: [" + mContentTypeName + "], val: [" 2057 + pduDecoder.getValueString() + "]"); 2058 assertTrue(mContentTypeName.equals(pduDecoder.getValueString())); 2059 } 2060 2061 mAppIdName = originalAppIdName; 2062 mContentTypeValue = originalContentTypeValue; 2063 } 2064 2065 2066 /** 2067 * Copied from WapPushOverSms. 2068 * The code flow is not changed from the original. 2069 */ 2070 public int dispatchWapPdu(byte[] pdu, IWapPushManager wapPushMan) { 2071 2072 if (false) Log.d(LOG_TAG, "Rx: " + IccUtils.bytesToHexString(pdu)); 2073 2074 int index = 0; 2075 int transactionId = pdu[index++] & 0xFF; 2076 int pduType = pdu[index++] & 0xFF; 2077 int headerLength = 0; 2078 2079 if ((pduType != WspTypeDecoder.PDU_TYPE_PUSH) && 2080 (pduType != WspTypeDecoder.PDU_TYPE_CONFIRMED_PUSH)) { 2081 if (false) Log.w(LOG_TAG, "Received non-PUSH WAP PDU. Type = " + pduType); 2082 return Intents.RESULT_SMS_HANDLED; 2083 } 2084 2085 WspTypeDecoder pduDecoder = new WspTypeDecoder(pdu); 2086 2087 /** 2088 * Parse HeaderLen(unsigned integer). 2089 * From wap-230-wsp-20010705-a section 8.1.2 2090 * The maximum size of a uintvar is 32 bits. 2091 * So it will be encoded in no more than 5 octets. 2092 */ 2093 if (pduDecoder.decodeUintvarInteger(index) == false) { 2094 if (false) Log.w(LOG_TAG, "Received PDU. Header Length error."); 2095 return Intents.RESULT_SMS_GENERIC_ERROR; 2096 } 2097 headerLength = (int) pduDecoder.getValue32(); 2098 index += pduDecoder.getDecodedDataLength(); 2099 2100 int headerStartIndex = index; 2101 2102 /** 2103 * Parse Content-Type. 2104 * From wap-230-wsp-20010705-a section 8.4.2.24 2105 * 2106 * Content-type-value = Constrained-media | Content-general-form 2107 * Content-general-form = Value-length Media-type 2108 * Media-type = (Well-known-media | Extension-Media) *(Parameter) 2109 * Value-length = Short-length | (Length-quote Length) 2110 * Short-length = <Any octet 0-30> (octet <= WAP_PDU_SHORT_LENGTH_MAX) 2111 * Length-quote = <Octet 31> (WAP_PDU_LENGTH_QUOTE) 2112 * Length = Uintvar-integer 2113 */ 2114 if (pduDecoder.decodeContentType(index) == false) { 2115 if (false) Log.w(LOG_TAG, "Received PDU. Header Content-Type error."); 2116 return Intents.RESULT_SMS_GENERIC_ERROR; 2117 } 2118 2119 String mimeType = pduDecoder.getValueString(); 2120 long binaryContentType = pduDecoder.getValue32(); 2121 index += pduDecoder.getDecodedDataLength(); 2122 2123 byte[] header = new byte[headerLength]; 2124 System.arraycopy(pdu, headerStartIndex, header, 0, header.length); 2125 2126 byte[] intentData; 2127 2128 if (mimeType != null && mimeType.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { 2129 intentData = pdu; 2130 } else { 2131 int dataIndex = headerStartIndex + headerLength; 2132 intentData = new byte[pdu.length - dataIndex]; 2133 System.arraycopy(pdu, dataIndex, intentData, 0, intentData.length); 2134 } 2135 2136 /** 2137 * Seek for application ID field in WSP header. 2138 * If application ID is found, WapPushManager substitute the message 2139 * processing. Since WapPushManager is optional module, if WapPushManager 2140 * is not found, legacy message processing will be continued. 2141 */ 2142 if (pduDecoder.seekXWapApplicationId(index, index + headerLength - 1)) { 2143 index = (int) pduDecoder.getValue32(); 2144 pduDecoder.decodeXWapApplicationId(index); 2145 String wapAppId = pduDecoder.getValueString(); 2146 if (wapAppId == null) { 2147 wapAppId = Integer.toString((int) pduDecoder.getValue32()); 2148 } 2149 2150 String contentType = ((mimeType == null) ? 2151 Long.toString(binaryContentType) : mimeType); 2152 if (false) Log.v(LOG_TAG, "appid found: " + wapAppId + ":" + contentType); 2153 2154 try { 2155 boolean processFurther = true; 2156 // IWapPushManager wapPushMan = mWapConn.getWapPushManager(); 2157 if (wapPushMan == null) { 2158 if (false) Log.w(LOG_TAG, "wap push manager not found!"); 2159 } else { 2160 Intent intent = new Intent(); 2161 intent.putExtra("transactionId", transactionId); 2162 intent.putExtra("pduType", pduType); 2163 intent.putExtra("header", header); 2164 intent.putExtra("data", intentData); 2165 intent.putExtra("contentTypeParameters", 2166 pduDecoder.getContentParameters()); 2167 2168 int procRet = wapPushMan.processMessage(wapAppId, contentType, intent); 2169 if (false) Log.v(LOG_TAG, "procRet:" + procRet); 2170 if ((procRet & WapPushManagerParams.MESSAGE_HANDLED) > 0 2171 && (procRet & WapPushManagerParams.FURTHER_PROCESSING) == 0) { 2172 processFurther = false; 2173 } 2174 } 2175 if (!processFurther) { 2176 return Intents.RESULT_SMS_HANDLED; 2177 } 2178 } catch (RemoteException e) { 2179 if (false) Log.w(LOG_TAG, "remote func failed..."); 2180 } 2181 } 2182 if (false) Log.v(LOG_TAG, "fall back to existing handler"); 2183 2184 return Activity.RESULT_OK; 2185 } 2186 2187 protected byte[] retrieveWspBody() { 2188 byte[] array = new byte[mWspHeader.length + mMessageBody.length]; 2189 2190 System.arraycopy(mWspHeader, 0, array, 0, mWspHeader.length); 2191 System.arraycopy(mMessageBody, 0, array, mWspHeader.length, mMessageBody.length); 2192 return array; 2193 } 2194 2195 protected String getContentTypeName(int ctypeVal) { 2196 int i; 2197 2198 for (i = 0; i < OMA_CONTENT_TYPE_VALUES.length; i++) { 2199 if (ctypeVal == OMA_CONTENT_TYPE_VALUES[i]) { 2200 return OMA_CONTENT_TYPE_NAMES[i]; 2201 } 2202 } 2203 return null; 2204 } 2205 2206 protected boolean isContentTypeMapped(int ctypeVal) { 2207 int i; 2208 2209 for (i = 0; i < OMA_CONTENT_TYPE_VALUES.length; i++) { 2210 if (ctypeVal == OMA_CONTENT_TYPE_VALUES[i]) return true; 2211 } 2212 return false; 2213 } 2214 2215 /** 2216 * Integration test 1, simple case 2217 */ 2218 public void testIntegration1() { 2219 boolean res; 2220 int originalAppIdValue = mAppIdValue; 2221 int originalContentTypeValue = mContentTypeValue; 2222 String originalAppIdName = mAppIdName; 2223 String originalContentTypeName = mContentTypeName; 2224 String originalClassName = mClassName; 2225 byte[] originalMessageBody = mMessageBody; 2226 Random rd = new Random(); 2227 2228 mMessageBody = new byte[100 + rd.nextInt(100)]; 2229 rd.nextBytes(mMessageBody); 2230 2231 byte[] pdu = createPDU(1); 2232 byte[] wappushPdu = retrieveWspBody(); 2233 2234 2235 mClassName = "com.android.smspush.unitTests.ReceiverActivity"; 2236 // Phone dummy = new DummyPhone(getContext()); 2237 // Phone gsm = PhoneFactory.getGsmPhone(); 2238 // GSMPhone gsm = new GSMPhone(getContext(), new SimulatedCommands(), null, true); 2239 // WapPushOverSms dispatcher = new WapPushOverSms(dummy, null); 2240 2241 try { 2242 // set up data 2243 IWapPushManager iwapman = getInterface(); 2244 IDataVerify dataverify = getVerifyInterface(); 2245 2246 dataverify.resetData(); 2247 2248 if (isContentTypeMapped(mContentTypeValue)) { 2249 // content type is mapped 2250 mContentTypeName = getContentTypeName(mContentTypeValue); 2251 Log.d(LOG_TAG, "mContentTypeValue mapping " 2252 + mContentTypeName + ":" + mContentTypeValue); 2253 } else { 2254 mContentTypeName = Integer.toString(mContentTypeValue); 2255 } 2256 iwapman.addPackage(Integer.toString(mAppIdValue), 2257 mContentTypeName, mPackageName, mClassName, 2258 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 2259 2260 dispatchWapPdu(wappushPdu, iwapman); 2261 2262 // clean up data 2263 iwapman.deletePackage(Integer.toString(mAppIdValue), 2264 mContentTypeName, mPackageName, mClassName); 2265 2266 assertTrue(dataverify.verifyData(mMessageBody)); 2267 } catch (RemoteException e) { 2268 } 2269 2270 2271 mClassName = originalClassName; 2272 mAppIdName = originalAppIdName; 2273 mContentTypeName = originalContentTypeName; 2274 mAppIdValue = originalAppIdValue; 2275 mContentTypeValue = originalContentTypeValue; 2276 mMessageBody = originalMessageBody; 2277 } 2278 2279 /** 2280 * Integration test 2, random mAppIdValue(int), all OMA content type 2281 */ 2282 public void testIntegration2() { 2283 boolean res; 2284 int originalAppIdValue = mAppIdValue; 2285 int originalContentTypeValue = mContentTypeValue; 2286 String originalAppIdName = mAppIdName; 2287 String originalContentTypeName = mContentTypeName; 2288 String originalClassName = mClassName; 2289 byte[] originalMessageBody = mMessageBody; 2290 Random rd = new Random(); 2291 2292 IWapPushManager iwapman = getInterface(); 2293 IDataVerify dataverify = getVerifyInterface(); 2294 mClassName = "com.android.smspush.unitTests.ReceiverActivity"; 2295 2296 for (int i = 0; i < OMA_CONTENT_TYPE_NAMES.length; i++) { 2297 mContentTypeName = OMA_CONTENT_TYPE_NAMES[i]; 2298 mAppIdValue = rd.nextInt(0x0FFFFFFF); 2299 2300 mMessageBody = new byte[100 + rd.nextInt(100)]; 2301 rd.nextBytes(mMessageBody); 2302 2303 byte[] pdu = createPDU(7); 2304 byte[] wappushPdu = retrieveWspBody(); 2305 2306 try { 2307 dataverify.resetData(); 2308 // set up data 2309 iwapman.addPackage(Integer.toString(mAppIdValue), 2310 mContentTypeName, mPackageName, mClassName, 2311 WapPushManagerParams.APP_TYPE_ACTIVITY, false, false); 2312 2313 dispatchWapPdu(wappushPdu, iwapman); 2314 2315 // clean up data 2316 iwapman.deletePackage(Integer.toString(mAppIdValue), 2317 mContentTypeName, mPackageName, mClassName); 2318 2319 if (mContentTypeName.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { 2320 assertTrue(dataverify.verifyData(wappushPdu)); 2321 } else { 2322 assertTrue(dataverify.verifyData(mMessageBody)); 2323 } 2324 } catch (RemoteException e) { 2325 } 2326 } 2327 2328 2329 mClassName = originalClassName; 2330 mAppIdName = originalAppIdName; 2331 mContentTypeName = originalContentTypeName; 2332 mAppIdValue = originalAppIdValue; 2333 mContentTypeValue = originalContentTypeValue; 2334 mMessageBody = originalMessageBody; 2335 } 2336 2337 /** 2338 * Integration test 3, iterate OmaApplication ID, random binary content type 2339 */ 2340 public void testIntegration3() { 2341 boolean res; 2342 int originalAppIdValue = mAppIdValue; 2343 int originalContentTypeValue = mContentTypeValue; 2344 String originalAppIdName = mAppIdName; 2345 String originalContentTypeName = mContentTypeName; 2346 String originalClassName = mClassName; 2347 byte[] originalMessageBody = mMessageBody; 2348 Random rd = new Random(); 2349 2350 IWapPushManager iwapman = getInterface(); 2351 IDataVerify dataverify = getVerifyInterface(); 2352 mClassName = "com.android.smspush.unitTests.ReceiverService"; 2353 2354 for (int i = 0; i < OMA_APPLICATION_ID_NAMES.length; i++) { 2355 mAppIdName = OMA_APPLICATION_ID_NAMES[i]; 2356 mContentTypeValue = rd.nextInt(0x0FFF); 2357 2358 mMessageBody = new byte[100 + rd.nextInt(100)]; 2359 rd.nextBytes(mMessageBody); 2360 2361 byte[] pdu = createPDU(6); 2362 byte[] wappushPdu = retrieveWspBody(); 2363 2364 try { 2365 dataverify.resetData(); 2366 // set up data 2367 if (isContentTypeMapped(mContentTypeValue)) { 2368 // content type is mapped to integer value 2369 mContentTypeName = getContentTypeName(mContentTypeValue); 2370 Log.d(LOG_TAG, "mContentTypeValue mapping " 2371 + mContentTypeValue + ":" + mContentTypeName); 2372 } else { 2373 mContentTypeName = Integer.toString(mContentTypeValue); 2374 } 2375 2376 iwapman.addPackage(mAppIdName, 2377 mContentTypeName, mPackageName, mClassName, 2378 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 2379 2380 dispatchWapPdu(wappushPdu, iwapman); 2381 2382 // clean up data 2383 iwapman.deletePackage(mAppIdName, 2384 mContentTypeName, mPackageName, mClassName); 2385 2386 if (mContentTypeName.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { 2387 assertTrue(dataverify.verifyData(wappushPdu)); 2388 } else { 2389 assertTrue(dataverify.verifyData(mMessageBody)); 2390 } 2391 } catch (RemoteException e) { 2392 } 2393 } 2394 2395 mClassName = originalClassName; 2396 mAppIdName = originalAppIdName; 2397 mContentTypeName = originalContentTypeName; 2398 mAppIdValue = originalAppIdValue; 2399 mContentTypeValue = originalContentTypeValue; 2400 mMessageBody = originalMessageBody; 2401 } 2402 2403 /** 2404 * Integration test 4, iterate OmaApplication ID, Oma content type 2405 */ 2406 public void testIntegration4() { 2407 boolean res; 2408 int originalAppIdValue = mAppIdValue; 2409 int originalContentTypeValue = mContentTypeValue; 2410 String originalAppIdName = mAppIdName; 2411 String originalContentTypeName = mContentTypeName; 2412 String originalClassName = mClassName; 2413 byte[] originalMessageBody = mMessageBody; 2414 Random rd = new Random(); 2415 2416 IWapPushManager iwapman = getInterface(); 2417 IDataVerify dataverify = getVerifyInterface(); 2418 mClassName = "com.android.smspush.unitTests.ReceiverService"; 2419 2420 for (int i = 0; i < OMA_APPLICATION_ID_NAMES.length 2421 + OMA_CONTENT_TYPE_NAMES.length; i++) { 2422 mAppIdName = OMA_APPLICATION_ID_NAMES[rd.nextInt(OMA_APPLICATION_ID_NAMES.length)]; 2423 int contIndex = rd.nextInt(OMA_CONTENT_TYPE_NAMES.length); 2424 mContentTypeName = OMA_CONTENT_TYPE_NAMES[contIndex]; 2425 2426 mMessageBody = new byte[100 + rd.nextInt(100)]; 2427 rd.nextBytes(mMessageBody); 2428 2429 byte[] pdu = createPDU(8); 2430 byte[] wappushPdu = retrieveWspBody(); 2431 2432 try { 2433 dataverify.resetData(); 2434 // set up data 2435 iwapman.addPackage(mAppIdName, 2436 mContentTypeName, mPackageName, mClassName, 2437 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 2438 2439 dispatchWapPdu(wappushPdu, iwapman); 2440 2441 // clean up data 2442 iwapman.deletePackage(mAppIdName, 2443 mContentTypeName, mPackageName, mClassName); 2444 2445 if (mContentTypeName.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { 2446 assertTrue(dataverify.verifyData(wappushPdu)); 2447 } else { 2448 assertTrue(dataverify.verifyData(mMessageBody)); 2449 } 2450 } catch (RemoteException e) { 2451 } 2452 } 2453 2454 mClassName = originalClassName; 2455 mAppIdName = originalAppIdName; 2456 mContentTypeName = originalContentTypeName; 2457 mAppIdValue = originalAppIdValue; 2458 mContentTypeValue = originalContentTypeValue; 2459 mMessageBody = originalMessageBody; 2460 } 2461 2462 /** 2463 * Integration test 5, iterate binary OmaApplication ID, Oma binary content type 2464 */ 2465 public void testIntegration5() { 2466 boolean res; 2467 int originalAppIdValue = mAppIdValue; 2468 int originalContentTypeValue = mContentTypeValue; 2469 String originalAppIdName = mAppIdName; 2470 String originalContentTypeName = mContentTypeName; 2471 String originalClassName = mClassName; 2472 byte[] originalMessageBody = mMessageBody; 2473 Random rd = new Random(); 2474 2475 IWapPushManager iwapman = getInterface(); 2476 IDataVerify dataverify = getVerifyInterface(); 2477 mClassName = "com.android.smspush.unitTests.ReceiverService"; 2478 2479 for (int i = 0; i < OMA_APPLICATION_ID_VALUES.length + 2480 OMA_CONTENT_TYPE_VALUES.length; i++) { 2481 mAppIdValue = OMA_APPLICATION_ID_VALUES[rd.nextInt( 2482 OMA_APPLICATION_ID_VALUES.length)]; 2483 mContentTypeValue = 2484 OMA_CONTENT_TYPE_VALUES[rd.nextInt(OMA_CONTENT_TYPE_VALUES.length)]; 2485 2486 mMessageBody = new byte[100 + rd.nextInt(100)]; 2487 rd.nextBytes(mMessageBody); 2488 2489 byte[] pdu = createPDU(3); 2490 byte[] wappushPdu = retrieveWspBody(); 2491 2492 try { 2493 dataverify.resetData(); 2494 // set up data 2495 if (isContentTypeMapped(mContentTypeValue)) { 2496 // content type is mapped to integer value 2497 mContentTypeName = getContentTypeName(mContentTypeValue); 2498 Log.d(LOG_TAG, "mContentTypeValue mapping " 2499 + mContentTypeValue + ":" + mContentTypeName); 2500 } else { 2501 mContentTypeName = Integer.toString(mContentTypeValue); 2502 } 2503 2504 iwapman.addPackage(Integer.toString(mAppIdValue), 2505 mContentTypeName, mPackageName, mClassName, 2506 WapPushManagerParams.APP_TYPE_SERVICE, false, false); 2507 2508 dispatchWapPdu(wappushPdu, iwapman); 2509 2510 // clean up data 2511 iwapman.deletePackage(Integer.toString(mAppIdValue), 2512 mContentTypeName, mPackageName, mClassName); 2513 2514 if (mContentTypeName.equals(WspTypeDecoder.CONTENT_TYPE_B_PUSH_CO)) { 2515 assertTrue(dataverify.verifyData(wappushPdu)); 2516 } else { 2517 assertTrue(dataverify.verifyData(mMessageBody)); 2518 } 2519 } catch (RemoteException e) { 2520 } 2521 } 2522 2523 mClassName = originalClassName; 2524 mAppIdName = originalAppIdName; 2525 mContentTypeName = originalContentTypeName; 2526 mAppIdValue = originalAppIdValue; 2527 mContentTypeValue = originalContentTypeValue; 2528 mMessageBody = originalMessageBody; 2529 } 2530 2531 } 2532