зеркало из https://github.com/mozilla/gecko-dev.git
Bug 940259 - Test Case for the support of CDMA WAP Push. r=gene
--HG-- extra : rebase_source : 5edf826ec7e8e54050efb32d2488890a69594fab
This commit is contained in:
Родитель
69a53bbd1e
Коммит
a27ca0264c
|
@ -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();
|
||||
});
|
Загрузка…
Ссылка в новой задаче