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 +});