Bug 940259 - Test Case for the support of CDMA WAP Push. r=gene

--HG--
extra : rebase_source : 5edf826ec7e8e54050efb32d2488890a69594fab
This commit is contained in:
Bevis Tseng 2013-11-26 18:34:14 +08:00
parent 69a53bbd1e
commit a27ca0264c

View File

@ -26,6 +26,164 @@ function _getWorker() {
};
}
/*
* Helper function to covert a HEX string to a byte array.
*
* @param hexString
* A hexadecimal string of which the length is even.
*/
function hexStringToBytes(hexString) {
let bytes = [];
let length = hexString.length;
for (let i = 0; i < length; i += 2) {
bytes.push(Number.parseInt(hexString.substr(i, 2), 16));
}
return bytes;
}
/*
* Helper function to covert a byte array to a HEX string.
*
* @param bytes
* Could be a regular byte array or Uint8Array.
*/
function bytesToHexString(bytes) {
let hexString = "";
let hex;
for (let i = 0; i < bytes.length; i++) {
hex = bytes[i].toString(16).toUpperCase();
if (hex.length === 1) {
hexString += "0";
}
hexString += hex;
}
return hexString;
}
/*
* Helper function to ecode Opaque UserData
*
* @param msg_type
* PDU_CDMA_MSG_TYPE_SUBMIT or PDU_CDMA_MSG_TYPE_DELIVER
* @param data
* The byte array of opaque data to be encoded.
*/
function encodeOpaqueUserData(bitBufferHelper, options) {
let bearerDataBuffer = [];
bitBufferHelper.startWrite(bearerDataBuffer);
// Msg-Id
bitBufferHelper.writeBits(PDU_CDMA_MSG_USERDATA_MSG_ID, 8);
bitBufferHelper.writeBits(3, 8);
bitBufferHelper.writeBits(options.msg_type, 4); // MSG_TYPE
bitBufferHelper.writeBits(1, 16); // MSG_ID
bitBufferHelper.flushWithPadding(); // HEADER_IND (1) + RESERVED (3)
// User Data
bitBufferHelper.writeBits(PDU_CDMA_MSG_USERDATA_BODY, 8);
let dataLength = options.data.length;
bitBufferHelper.writeBits(2 + dataLength, 8); // 2 bytes for MSG_ENCODING, NUM_FIELDS
bitBufferHelper.writeBits(PDU_CDMA_MSG_CODING_OCTET, 5); //MSG_ENCODING
// MSG_TYPE is omitted if MSG_ENCODING is CODING_OCTET
bitBufferHelper.writeBits(dataLength, 8); // NUM_FIELDS
for (let i = 0; i < dataLength; i++) { // CHARi
bitBufferHelper.writeBits(options.data[i], 8);
}
bitBufferHelper.flushWithPadding(); // RESERVED (3 filling bits)
return bearerDataBuffer;
}
function newSmsParcel(cdmaPduHelper, pdu) {
return newIncomingParcel(-1,
RESPONSE_TYPE_UNSOLICITED,
UNSOLICITED_RESPONSE_CDMA_NEW_SMS,
pduToParcelData(cdmaPduHelper, pdu));
}
/*
* Helper function to encode PDU into Parcel.
* See ril_cdma_sms.h for the structure definition of RIL_CDMA_SMS_Message
*
* @param teleservice
* The Teleservice-Id of this PDU.
* See PDU_CDMA_MSG_TELESERIVCIE_ID_XXX in ril_const.js.
* @param address
* The Orginating or Destinating address.
* @param bearerData
* The byte array of the encoded bearer data.
*/
function pduToParcelData(cdmaPduHelper, pdu) {
let addrInfo = cdmaPduHelper.encodeAddr(pdu.address);
// Teleservice, isServicePresent, ServiceCategory,
// addrInfo {digitMode, numberMode, numberType, numberPlan, address.length, address}
// Sub Address
// bearerData length, bearerData.
let dataLength = 4 + 4 + 4
+ (5 + addrInfo.address.length) * 4
+ 3 * 4
+ 4 + pdu.bearerData.length * 4;
let data = new Uint8Array(dataLength);
let offset = 0;
function writeInt(value) {
data[offset++] = value & 0xFF;
data[offset++] = (value >> 8) & 0xFF;
data[offset++] = (value >> 16) & 0xFF;
data[offset++] = (value >> 24) & 0xFF;
}
function writeByte(value) {
data[offset++] = value & 0xFF;
data[offset++] = 0;
data[offset++] = 0;
data[offset++] = 0;
}
// Teleservice
writeInt(pdu.teleservice);
// isServicePresent
writeByte(0);
// ServiceCategory
writeInt(PDU_CDMA_MSG_CATEGORY_UNSPEC);
// AddrInfo
writeByte(addrInfo.digitMode);
writeByte(addrInfo.numberMode);
writeByte(addrInfo.numberType);
writeByte(addrInfo.numberPlan);
let addressLength = addrInfo.address.length;
writeByte(addressLength);
for (let i = 0; i < addressLength; i++) {
writeByte(addrInfo.address[i]);
}
// Subaddress
writeByte(0);
writeByte(0);
writeByte(0);
// Bearer Data Length
let dataLength = pdu.bearerData.length;
writeByte(dataLength);
// Bearer Data
for (let i = 0; i < dataLength; i++) {
writeByte(pdu.bearerData[i]);
}
return data;
}
/**
* Verify CDMA SMS Delivery ACK Message.
*/
@ -73,7 +231,7 @@ add_test(function test_processCdmaSmsStatusReport() {
let postedMessage = workerHelper.postedMessage;
// Check if pending token is removed.
do_check_true((errorClass === 2)? !!sentSmsMap[msgId]: !sentSmsMap[msgId]);
do_check_true((errorClass === 2) ? !!sentSmsMap[msgId] : !sentSmsMap[msgId]);
// Check the response message accordingly.
if (errorClass === -1) {
@ -98,3 +256,67 @@ add_test(function test_processCdmaSmsStatusReport() {
run_next_test();
});
/**
* Verify WAP Push over CDMA SMS Message.
*/
add_test(function test_processCdmaSmsWapPush() {
let workerHelper = _getWorker(),
worker = workerHelper.worker,
bitBufferHelper = worker.BitBufferHelper,
cdmaPduHelper = worker.CdmaPDUHelper;
function test_CdmaSmsWapPdu(wdpData, reversed) {
let orig_address = "0987654321",
hexString,
fullDataHexString = "";
for (let i = 0; i < wdpData.length; i++) {
let dataIndex = (reversed) ? (wdpData.length - i - 1) : i;
hexString = "00"; // MSG_TYPE
hexString += bytesToHexString([wdpData.length]); // TOTAL_SEG
hexString += bytesToHexString([dataIndex]); // SEG_NUM (zero-based)
if ((dataIndex === 0)) {
hexString += "23F00B84"; // SOURCE_PORT, DEST_PORT for 1st segment
}
hexString += wdpData[dataIndex]; // WDP DATA
do_print("hexString: " + hexString);
fullDataHexString += wdpData[i];
let pdu = {
teleservice: PDU_CDMA_MSG_TELESERIVCIE_ID_WAP,
address: orig_address,
bearerData: encodeOpaqueUserData(bitBufferHelper,
{ msg_type: PDU_CDMA_MSG_TYPE_DELIVER,
data: hexStringToBytes(hexString) })
};
worker.onRILMessage(newSmsParcel(cdmaPduHelper, pdu));
}
let postedMessage = workerHelper.postedMessage;
do_print("fullDataHexString: " + fullDataHexString);
do_check_eq("sms-received", postedMessage.rilMessageType);
do_check_eq(PDU_CDMA_MSG_TELESERIVCIE_ID_WAP, postedMessage.teleservice);
do_check_eq(orig_address, postedMessage.sender);
do_check_eq(0x23F0, postedMessage.header.originatorPort);
do_check_eq(0x0B84, postedMessage.header.destinationPort);
do_check_eq(fullDataHexString, bytesToHexString(postedMessage.fullData));
}
// Verify Single WAP PDU
test_CdmaSmsWapPdu(["000102030405060708090A0B0C0D0E0F"]);
// Verify Concatenated WAP PDUs
test_CdmaSmsWapPdu(["000102030405060708090A0B0C0D0E0F", "0F0E0D0C0B0A09080706050403020100"]);
// Verify Concatenated WAP PDUs received in reversed order.
// Note: the port information is only available in 1st segment in CDMA WAP Push.
test_CdmaSmsWapPdu(["000102030405060708090A0B0C0D0E0F", "0F0E0D0C0B0A09080706050403020100"], true);
run_next_test();
});