dom/system/gonk/tests/test_ril_worker_sms_cdma.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* Any copyright is dedicated to the Public Domain.
     2    http://creativecommons.org/publicdomain/zero/1.0/ */
     4 subscriptLoader.loadSubScript("resource://gre/modules/ril_consts.js", this);
     6 function run_test() {
     7   run_next_test();
     8 }
    10 function _getWorker() {
    11   let _postedMessage;
    12   let _worker = newWorker({
    13     postRILMessage: function(data) {
    14     },
    15     postMessage: function(message) {
    16       _postedMessage = message;
    17     }
    18   });
    19   return {
    20     get postedMessage() {
    21       return _postedMessage;
    22     },
    23     get worker() {
    24       return _worker;
    25     }
    26   };
    27 }
    29 /*
    30  * Helper function to covert a HEX string to a byte array.
    31  *
    32  * @param hexString
    33  *        A hexadecimal string of which the length is even.
    34  */
    35 function hexStringToBytes(hexString) {
    36   let bytes = [];
    38   let length = hexString.length;
    40   for (let i = 0; i < length; i += 2) {
    41     bytes.push(Number.parseInt(hexString.substr(i, 2), 16));
    42   }
    44   return bytes;
    45 }
    47 /*
    48  * Helper function to covert a byte array to a HEX string.
    49  *
    50  * @param bytes
    51  *        Could be a regular byte array or Uint8Array.
    52  */
    53 function bytesToHexString(bytes) {
    54   let hexString = "";
    55   let hex;
    57   for (let i = 0; i < bytes.length; i++) {
    58     hex = bytes[i].toString(16).toUpperCase();
    59     if (hex.length === 1) {
    60       hexString += "0";
    61     }
    62     hexString += hex;
    63   }
    65   return hexString;
    66 }
    68 /*
    69  * Helper function to ecode Opaque UserData
    70  *
    71  * @param msg_type
    72  *        PDU_CDMA_MSG_TYPE_SUBMIT or PDU_CDMA_MSG_TYPE_DELIVER
    73  * @param data
    74  *        The byte array of opaque data to be encoded.
    75  */
    76 function encodeOpaqueUserData(bitBufferHelper, options) {
    77   let bearerDataBuffer = [];
    78   bitBufferHelper.startWrite(bearerDataBuffer);
    80   // Msg-Id
    81   bitBufferHelper.writeBits(PDU_CDMA_MSG_USERDATA_MSG_ID, 8);
    82   bitBufferHelper.writeBits(3, 8);
    83   bitBufferHelper.writeBits(options.msg_type, 4); // MSG_TYPE
    84   bitBufferHelper.writeBits(1, 16);               // MSG_ID
    85   bitBufferHelper.flushWithPadding();             // HEADER_IND (1) + RESERVED (3)
    87   // User Data
    88   bitBufferHelper.writeBits(PDU_CDMA_MSG_USERDATA_BODY, 8);
    89   let dataLength = options.data.length;
    90   bitBufferHelper.writeBits(2 + dataLength, 8);   // 2 bytes for MSG_ENCODING, NUM_FIELDS
    91   bitBufferHelper.writeBits(PDU_CDMA_MSG_CODING_OCTET, 5); //MSG_ENCODING
    92                                                   // MSG_TYPE is omitted if MSG_ENCODING is CODING_OCTET
    93   bitBufferHelper.writeBits(dataLength, 8);       // NUM_FIELDS
    94   for (let i = 0; i < dataLength; i++) {          // CHARi
    95     bitBufferHelper.writeBits(options.data[i], 8);
    96   }
    97   bitBufferHelper.flushWithPadding();             // RESERVED (3 filling bits)
    99   return bearerDataBuffer;
   100 }
   102 function newSmsParcel(cdmaPduHelper, pdu) {
   103   return newIncomingParcel(-1,
   104                            RESPONSE_TYPE_UNSOLICITED,
   105                            UNSOLICITED_RESPONSE_CDMA_NEW_SMS,
   106                            pduToParcelData(cdmaPduHelper, pdu));
   107 }
   109 /*
   110  * Helper function to encode PDU into Parcel.
   111  * See ril_cdma_sms.h for the structure definition of RIL_CDMA_SMS_Message
   112  *
   113  * @param teleservice
   114  *        The Teleservice-Id of this PDU.
   115  *        See PDU_CDMA_MSG_TELESERIVCIE_ID_XXX in ril_const.js.
   116  * @param address
   117  *        The Orginating or Destinating address.
   118  * @param bearerData
   119  *        The byte array of the encoded bearer data.
   120  */
   121 function pduToParcelData(cdmaPduHelper, pdu) {
   123   let addrInfo = cdmaPduHelper.encodeAddr(pdu.address);
   124   // Teleservice, isServicePresent, ServiceCategory,
   125   // addrInfo {digitMode, numberMode, numberType, numberPlan, address.length, address}
   126   // Sub Address
   127   // bearerData length, bearerData.
   128   let dataLength = 4 + 4 + 4
   129                  + (5 + addrInfo.address.length) * 4
   130                  + 3 * 4
   131                  + 4 + pdu.bearerData.length * 4;
   133   let data = new Uint8Array(dataLength);
   134   let offset = 0;
   136   function writeInt(value) {
   137     data[offset++] = value & 0xFF;
   138     data[offset++] = (value >>  8) & 0xFF;
   139     data[offset++] = (value >> 16) & 0xFF;
   140     data[offset++] = (value >> 24) & 0xFF;
   141   }
   143   function writeByte(value) {
   144     data[offset++] = value & 0xFF;
   145     data[offset++] = 0;
   146     data[offset++] = 0;
   147     data[offset++] = 0;
   148   }
   150   // Teleservice
   151   writeInt(pdu.teleservice);
   153   // isServicePresent
   154   writeByte(0);
   156   // ServiceCategory
   157   writeInt(PDU_CDMA_MSG_CATEGORY_UNSPEC);
   159   // AddrInfo
   160   writeByte(addrInfo.digitMode);
   161   writeByte(addrInfo.numberMode);
   162   writeByte(addrInfo.numberType);
   163   writeByte(addrInfo.numberPlan);
   164   let addressLength = addrInfo.address.length;
   165   writeByte(addressLength);
   166   for (let i = 0; i < addressLength; i++) {
   167     writeByte(addrInfo.address[i]);
   168   }
   170   // Subaddress
   171   writeByte(0);
   172   writeByte(0);
   173   writeByte(0);
   175   // Bearer Data Length
   176   let dataLength = pdu.bearerData.length;
   177   writeByte(dataLength);
   179   // Bearer Data
   180   for (let i = 0; i < dataLength; i++) {
   181     writeByte(pdu.bearerData[i]);
   182   }
   184   return data;
   185 }
   187 /**
   188  * Verify CDMA SMS Delivery ACK Message.
   189  */
   190 add_test(function test_processCdmaSmsStatusReport() {
   191   let workerHelper = _getWorker();
   192   let worker = workerHelper.worker;
   193   let context = worker.ContextPool._contexts[0];
   195   function test_StatusReport(errorClass, msgStatus) {
   196     let msgId = 0;
   197     let sentSmsMap = context.RIL._pendingSentSmsMap;
   199     sentSmsMap[msgId] = {};
   201     let message = {
   202       SMSC:             "",
   203       mti:              0,
   204       udhi:             0,
   205       sender:           "0987654321",
   206       recipient:        null,
   207       pid:              PDU_PID_DEFAULT,
   208       epid:             PDU_PID_DEFAULT,
   209       dcs:              0,
   210       mwi:              null,
   211       replace:          false,
   212       header:           null,
   213       body:             "Status: Sent, Dest: 0987654321",
   214       data:             null,
   215       timestamp:        new Date().valueOf(),
   216       language:         null,
   217       status:           null,
   218       scts:             null,
   219       dt:               null,
   220       encoding:         PDU_CDMA_MSG_CODING_7BITS_ASCII,
   221       messageClass:     GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL],
   222       messageType:      PDU_CDMA_MSG_TYPE_P2P,
   223       serviceCategory:  0,
   224       subMsgType:       PDU_CDMA_MSG_TYPE_DELIVER_ACK,
   225       msgId:            msgId,
   226       errorClass:       errorClass,
   227       msgStatus:        msgStatus
   228     };
   230     context.RIL._processCdmaSmsStatusReport(message);
   232     let postedMessage = workerHelper.postedMessage;
   234     // Check if pending token is removed.
   235     do_check_true((errorClass === 2) ? !!sentSmsMap[msgId] : !sentSmsMap[msgId]);
   237     // Check the response message accordingly.
   238     if (errorClass === -1) {
   239       // Check if the report is treated as normal incoming SMS
   240       do_check_eq("sms-received", postedMessage.rilMessageType);
   241     } else if (errorClass === 2) {
   242       // Do nothing.
   243     } else {
   244       // Check Delivery Status
   245       if (errorClass === 0) {
   246         do_check_eq(postedMessage.deliveryStatus, GECKO_SMS_DELIVERY_STATUS_SUCCESS);
   247       } else {
   248         do_check_eq(postedMessage.deliveryStatus, GECKO_SMS_DELIVERY_STATUS_ERROR);
   249       }
   250     }
   251   }
   253   test_StatusReport(-1, -1); // Message Status Sub-parameter is absent.
   254   test_StatusReport(0, 0);   // 00|000000: no error|Message accepted
   255   test_StatusReport(2, 4);   // 10|000100: temporary condition|Network congestion
   256   test_StatusReport(3, 5);   // 11|000101: permanent condition|Network error
   258   run_next_test();
   259 });
   261 /**
   262  * Verify WAP Push over CDMA SMS Message.
   263  */
   264 add_test(function test_processCdmaSmsWapPush() {
   265   let workerHelper = _getWorker(),
   266       worker = workerHelper.worker,
   267       context = worker.ContextPool._contexts[0],
   268       bitBufferHelper = context.BitBufferHelper,
   269       cdmaPduHelper = context.CdmaPDUHelper;
   271   function test_CdmaSmsWapPdu(wdpData, reversed) {
   272     let orig_address = "0987654321",
   273         hexString,
   274         fullDataHexString = "";
   276     for (let i = 0; i < wdpData.length; i++) {
   277       let dataIndex = (reversed) ? (wdpData.length - i - 1) : i;
   278       hexString  = "00";                                // MSG_TYPE
   279       hexString += bytesToHexString([wdpData.length]);  // TOTAL_SEG
   280       hexString += bytesToHexString([dataIndex]);       // SEG_NUM (zero-based)
   281       if ((dataIndex === 0)) {
   282         hexString += "23F00B84";                        // SOURCE_PORT, DEST_PORT for 1st segment
   283       }
   284       hexString += wdpData[dataIndex];                  // WDP DATA
   286       do_print("hexString: " + hexString);
   288       fullDataHexString += wdpData[i];
   290       let pdu = {
   291         teleservice: PDU_CDMA_MSG_TELESERIVCIE_ID_WAP,
   292         address:     orig_address,
   293         bearerData:  encodeOpaqueUserData(bitBufferHelper,
   294                                           { msg_type: PDU_CDMA_MSG_TYPE_DELIVER,
   295                                             data:     hexStringToBytes(hexString) })
   296       };
   298       worker.onRILMessage(0, newSmsParcel(cdmaPduHelper, pdu));
   299     }
   301     let postedMessage = workerHelper.postedMessage;
   303     do_print("fullDataHexString: " + fullDataHexString);
   305     do_check_eq("sms-received", postedMessage.rilMessageType);
   306     do_check_eq(PDU_CDMA_MSG_TELESERIVCIE_ID_WAP, postedMessage.teleservice);
   307     do_check_eq(orig_address, postedMessage.sender);
   308     do_check_eq(0x23F0, postedMessage.header.originatorPort);
   309     do_check_eq(0x0B84, postedMessage.header.destinationPort);
   310     do_check_eq(fullDataHexString, bytesToHexString(postedMessage.data));
   311   }
   313   // Verify Single WAP PDU
   314   test_CdmaSmsWapPdu(["000102030405060708090A0B0C0D0E0F"]);
   316   run_next_test();
   317 });

mercurial