dom/system/gonk/tests/test_ril_worker_sms_cdma.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/dom/system/gonk/tests/test_ril_worker_sms_cdma.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,317 @@
     1.4 +/* Any copyright is dedicated to the Public Domain.
     1.5 +   http://creativecommons.org/publicdomain/zero/1.0/ */
     1.6 +
     1.7 +subscriptLoader.loadSubScript("resource://gre/modules/ril_consts.js", this);
     1.8 +
     1.9 +function run_test() {
    1.10 +  run_next_test();
    1.11 +}
    1.12 +
    1.13 +function _getWorker() {
    1.14 +  let _postedMessage;
    1.15 +  let _worker = newWorker({
    1.16 +    postRILMessage: function(data) {
    1.17 +    },
    1.18 +    postMessage: function(message) {
    1.19 +      _postedMessage = message;
    1.20 +    }
    1.21 +  });
    1.22 +  return {
    1.23 +    get postedMessage() {
    1.24 +      return _postedMessage;
    1.25 +    },
    1.26 +    get worker() {
    1.27 +      return _worker;
    1.28 +    }
    1.29 +  };
    1.30 +}
    1.31 +
    1.32 +/*
    1.33 + * Helper function to covert a HEX string to a byte array.
    1.34 + *
    1.35 + * @param hexString
    1.36 + *        A hexadecimal string of which the length is even.
    1.37 + */
    1.38 +function hexStringToBytes(hexString) {
    1.39 +  let bytes = [];
    1.40 +
    1.41 +  let length = hexString.length;
    1.42 +
    1.43 +  for (let i = 0; i < length; i += 2) {
    1.44 +    bytes.push(Number.parseInt(hexString.substr(i, 2), 16));
    1.45 +  }
    1.46 +
    1.47 +  return bytes;
    1.48 +}
    1.49 +
    1.50 +/*
    1.51 + * Helper function to covert a byte array to a HEX string.
    1.52 + *
    1.53 + * @param bytes
    1.54 + *        Could be a regular byte array or Uint8Array.
    1.55 + */
    1.56 +function bytesToHexString(bytes) {
    1.57 +  let hexString = "";
    1.58 +  let hex;
    1.59 +
    1.60 +  for (let i = 0; i < bytes.length; i++) {
    1.61 +    hex = bytes[i].toString(16).toUpperCase();
    1.62 +    if (hex.length === 1) {
    1.63 +      hexString += "0";
    1.64 +    }
    1.65 +    hexString += hex;
    1.66 +  }
    1.67 +
    1.68 +  return hexString;
    1.69 +}
    1.70 +
    1.71 +/*
    1.72 + * Helper function to ecode Opaque UserData
    1.73 + *
    1.74 + * @param msg_type
    1.75 + *        PDU_CDMA_MSG_TYPE_SUBMIT or PDU_CDMA_MSG_TYPE_DELIVER
    1.76 + * @param data
    1.77 + *        The byte array of opaque data to be encoded.
    1.78 + */
    1.79 +function encodeOpaqueUserData(bitBufferHelper, options) {
    1.80 +  let bearerDataBuffer = [];
    1.81 +  bitBufferHelper.startWrite(bearerDataBuffer);
    1.82 +
    1.83 +  // Msg-Id
    1.84 +  bitBufferHelper.writeBits(PDU_CDMA_MSG_USERDATA_MSG_ID, 8);
    1.85 +  bitBufferHelper.writeBits(3, 8);
    1.86 +  bitBufferHelper.writeBits(options.msg_type, 4); // MSG_TYPE
    1.87 +  bitBufferHelper.writeBits(1, 16);               // MSG_ID
    1.88 +  bitBufferHelper.flushWithPadding();             // HEADER_IND (1) + RESERVED (3)
    1.89 +
    1.90 +  // User Data
    1.91 +  bitBufferHelper.writeBits(PDU_CDMA_MSG_USERDATA_BODY, 8);
    1.92 +  let dataLength = options.data.length;
    1.93 +  bitBufferHelper.writeBits(2 + dataLength, 8);   // 2 bytes for MSG_ENCODING, NUM_FIELDS
    1.94 +  bitBufferHelper.writeBits(PDU_CDMA_MSG_CODING_OCTET, 5); //MSG_ENCODING
    1.95 +                                                  // MSG_TYPE is omitted if MSG_ENCODING is CODING_OCTET
    1.96 +  bitBufferHelper.writeBits(dataLength, 8);       // NUM_FIELDS
    1.97 +  for (let i = 0; i < dataLength; i++) {          // CHARi
    1.98 +    bitBufferHelper.writeBits(options.data[i], 8);
    1.99 +  }
   1.100 +  bitBufferHelper.flushWithPadding();             // RESERVED (3 filling bits)
   1.101 +
   1.102 +  return bearerDataBuffer;
   1.103 +}
   1.104 +
   1.105 +function newSmsParcel(cdmaPduHelper, pdu) {
   1.106 +  return newIncomingParcel(-1,
   1.107 +                           RESPONSE_TYPE_UNSOLICITED,
   1.108 +                           UNSOLICITED_RESPONSE_CDMA_NEW_SMS,
   1.109 +                           pduToParcelData(cdmaPduHelper, pdu));
   1.110 +}
   1.111 +
   1.112 +/*
   1.113 + * Helper function to encode PDU into Parcel.
   1.114 + * See ril_cdma_sms.h for the structure definition of RIL_CDMA_SMS_Message
   1.115 + *
   1.116 + * @param teleservice
   1.117 + *        The Teleservice-Id of this PDU.
   1.118 + *        See PDU_CDMA_MSG_TELESERIVCIE_ID_XXX in ril_const.js.
   1.119 + * @param address
   1.120 + *        The Orginating or Destinating address.
   1.121 + * @param bearerData
   1.122 + *        The byte array of the encoded bearer data.
   1.123 + */
   1.124 +function pduToParcelData(cdmaPduHelper, pdu) {
   1.125 +
   1.126 +  let addrInfo = cdmaPduHelper.encodeAddr(pdu.address);
   1.127 +  // Teleservice, isServicePresent, ServiceCategory,
   1.128 +  // addrInfo {digitMode, numberMode, numberType, numberPlan, address.length, address}
   1.129 +  // Sub Address
   1.130 +  // bearerData length, bearerData.
   1.131 +  let dataLength = 4 + 4 + 4
   1.132 +                 + (5 + addrInfo.address.length) * 4
   1.133 +                 + 3 * 4
   1.134 +                 + 4 + pdu.bearerData.length * 4;
   1.135 +
   1.136 +  let data = new Uint8Array(dataLength);
   1.137 +  let offset = 0;
   1.138 +
   1.139 +  function writeInt(value) {
   1.140 +    data[offset++] = value & 0xFF;
   1.141 +    data[offset++] = (value >>  8) & 0xFF;
   1.142 +    data[offset++] = (value >> 16) & 0xFF;
   1.143 +    data[offset++] = (value >> 24) & 0xFF;
   1.144 +  }
   1.145 +
   1.146 +  function writeByte(value) {
   1.147 +    data[offset++] = value & 0xFF;
   1.148 +    data[offset++] = 0;
   1.149 +    data[offset++] = 0;
   1.150 +    data[offset++] = 0;
   1.151 +  }
   1.152 +
   1.153 +  // Teleservice
   1.154 +  writeInt(pdu.teleservice);
   1.155 +
   1.156 +  // isServicePresent
   1.157 +  writeByte(0);
   1.158 +
   1.159 +  // ServiceCategory
   1.160 +  writeInt(PDU_CDMA_MSG_CATEGORY_UNSPEC);
   1.161 +
   1.162 +  // AddrInfo
   1.163 +  writeByte(addrInfo.digitMode);
   1.164 +  writeByte(addrInfo.numberMode);
   1.165 +  writeByte(addrInfo.numberType);
   1.166 +  writeByte(addrInfo.numberPlan);
   1.167 +  let addressLength = addrInfo.address.length;
   1.168 +  writeByte(addressLength);
   1.169 +  for (let i = 0; i < addressLength; i++) {
   1.170 +    writeByte(addrInfo.address[i]);
   1.171 +  }
   1.172 +
   1.173 +  // Subaddress
   1.174 +  writeByte(0);
   1.175 +  writeByte(0);
   1.176 +  writeByte(0);
   1.177 +
   1.178 +  // Bearer Data Length
   1.179 +  let dataLength = pdu.bearerData.length;
   1.180 +  writeByte(dataLength);
   1.181 +
   1.182 +  // Bearer Data
   1.183 +  for (let i = 0; i < dataLength; i++) {
   1.184 +    writeByte(pdu.bearerData[i]);
   1.185 +  }
   1.186 +
   1.187 +  return data;
   1.188 +}
   1.189 +
   1.190 +/**
   1.191 + * Verify CDMA SMS Delivery ACK Message.
   1.192 + */
   1.193 +add_test(function test_processCdmaSmsStatusReport() {
   1.194 +  let workerHelper = _getWorker();
   1.195 +  let worker = workerHelper.worker;
   1.196 +  let context = worker.ContextPool._contexts[0];
   1.197 +
   1.198 +  function test_StatusReport(errorClass, msgStatus) {
   1.199 +    let msgId = 0;
   1.200 +    let sentSmsMap = context.RIL._pendingSentSmsMap;
   1.201 +
   1.202 +    sentSmsMap[msgId] = {};
   1.203 +
   1.204 +    let message = {
   1.205 +      SMSC:             "",
   1.206 +      mti:              0,
   1.207 +      udhi:             0,
   1.208 +      sender:           "0987654321",
   1.209 +      recipient:        null,
   1.210 +      pid:              PDU_PID_DEFAULT,
   1.211 +      epid:             PDU_PID_DEFAULT,
   1.212 +      dcs:              0,
   1.213 +      mwi:              null,
   1.214 +      replace:          false,
   1.215 +      header:           null,
   1.216 +      body:             "Status: Sent, Dest: 0987654321",
   1.217 +      data:             null,
   1.218 +      timestamp:        new Date().valueOf(),
   1.219 +      language:         null,
   1.220 +      status:           null,
   1.221 +      scts:             null,
   1.222 +      dt:               null,
   1.223 +      encoding:         PDU_CDMA_MSG_CODING_7BITS_ASCII,
   1.224 +      messageClass:     GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL],
   1.225 +      messageType:      PDU_CDMA_MSG_TYPE_P2P,
   1.226 +      serviceCategory:  0,
   1.227 +      subMsgType:       PDU_CDMA_MSG_TYPE_DELIVER_ACK,
   1.228 +      msgId:            msgId,
   1.229 +      errorClass:       errorClass,
   1.230 +      msgStatus:        msgStatus
   1.231 +    };
   1.232 +
   1.233 +    context.RIL._processCdmaSmsStatusReport(message);
   1.234 +
   1.235 +    let postedMessage = workerHelper.postedMessage;
   1.236 +
   1.237 +    // Check if pending token is removed.
   1.238 +    do_check_true((errorClass === 2) ? !!sentSmsMap[msgId] : !sentSmsMap[msgId]);
   1.239 +
   1.240 +    // Check the response message accordingly.
   1.241 +    if (errorClass === -1) {
   1.242 +      // Check if the report is treated as normal incoming SMS
   1.243 +      do_check_eq("sms-received", postedMessage.rilMessageType);
   1.244 +    } else if (errorClass === 2) {
   1.245 +      // Do nothing.
   1.246 +    } else {
   1.247 +      // Check Delivery Status
   1.248 +      if (errorClass === 0) {
   1.249 +        do_check_eq(postedMessage.deliveryStatus, GECKO_SMS_DELIVERY_STATUS_SUCCESS);
   1.250 +      } else {
   1.251 +        do_check_eq(postedMessage.deliveryStatus, GECKO_SMS_DELIVERY_STATUS_ERROR);
   1.252 +      }
   1.253 +    }
   1.254 +  }
   1.255 +
   1.256 +  test_StatusReport(-1, -1); // Message Status Sub-parameter is absent.
   1.257 +  test_StatusReport(0, 0);   // 00|000000: no error|Message accepted
   1.258 +  test_StatusReport(2, 4);   // 10|000100: temporary condition|Network congestion
   1.259 +  test_StatusReport(3, 5);   // 11|000101: permanent condition|Network error
   1.260 +
   1.261 +  run_next_test();
   1.262 +});
   1.263 +
   1.264 +/**
   1.265 + * Verify WAP Push over CDMA SMS Message.
   1.266 + */
   1.267 +add_test(function test_processCdmaSmsWapPush() {
   1.268 +  let workerHelper = _getWorker(),
   1.269 +      worker = workerHelper.worker,
   1.270 +      context = worker.ContextPool._contexts[0],
   1.271 +      bitBufferHelper = context.BitBufferHelper,
   1.272 +      cdmaPduHelper = context.CdmaPDUHelper;
   1.273 +
   1.274 +  function test_CdmaSmsWapPdu(wdpData, reversed) {
   1.275 +    let orig_address = "0987654321",
   1.276 +        hexString,
   1.277 +        fullDataHexString = "";
   1.278 +
   1.279 +    for (let i = 0; i < wdpData.length; i++) {
   1.280 +      let dataIndex = (reversed) ? (wdpData.length - i - 1) : i;
   1.281 +      hexString  = "00";                                // MSG_TYPE
   1.282 +      hexString += bytesToHexString([wdpData.length]);  // TOTAL_SEG
   1.283 +      hexString += bytesToHexString([dataIndex]);       // SEG_NUM (zero-based)
   1.284 +      if ((dataIndex === 0)) {
   1.285 +        hexString += "23F00B84";                        // SOURCE_PORT, DEST_PORT for 1st segment
   1.286 +      }
   1.287 +      hexString += wdpData[dataIndex];                  // WDP DATA
   1.288 +
   1.289 +      do_print("hexString: " + hexString);
   1.290 +
   1.291 +      fullDataHexString += wdpData[i];
   1.292 +
   1.293 +      let pdu = {
   1.294 +        teleservice: PDU_CDMA_MSG_TELESERIVCIE_ID_WAP,
   1.295 +        address:     orig_address,
   1.296 +        bearerData:  encodeOpaqueUserData(bitBufferHelper,
   1.297 +                                          { msg_type: PDU_CDMA_MSG_TYPE_DELIVER,
   1.298 +                                            data:     hexStringToBytes(hexString) })
   1.299 +      };
   1.300 +
   1.301 +      worker.onRILMessage(0, newSmsParcel(cdmaPduHelper, pdu));
   1.302 +    }
   1.303 +
   1.304 +    let postedMessage = workerHelper.postedMessage;
   1.305 +
   1.306 +    do_print("fullDataHexString: " + fullDataHexString);
   1.307 +
   1.308 +    do_check_eq("sms-received", postedMessage.rilMessageType);
   1.309 +    do_check_eq(PDU_CDMA_MSG_TELESERIVCIE_ID_WAP, postedMessage.teleservice);
   1.310 +    do_check_eq(orig_address, postedMessage.sender);
   1.311 +    do_check_eq(0x23F0, postedMessage.header.originatorPort);
   1.312 +    do_check_eq(0x0B84, postedMessage.header.destinationPort);
   1.313 +    do_check_eq(fullDataHexString, bytesToHexString(postedMessage.data));
   1.314 +  }
   1.315 +
   1.316 +  // Verify Single WAP PDU
   1.317 +  test_CdmaSmsWapPdu(["000102030405060708090A0B0C0D0E0F"]);
   1.318 +
   1.319 +  run_next_test();
   1.320 +});

mercurial