michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: subscriptLoader.loadSubScript("resource://gre/modules/ril_consts.js", this); michael@0: michael@0: function run_test() { michael@0: run_next_test(); michael@0: } michael@0: michael@0: /** michael@0: * Verify GsmPDUHelper#readDataCodingScheme. michael@0: */ michael@0: add_test(function test_GsmPDUHelper_readDataCodingScheme() { michael@0: let worker = newWorker({ michael@0: postRILMessage: function(data) { michael@0: // Do nothing michael@0: }, michael@0: postMessage: function(message) { michael@0: // Do nothing michael@0: } michael@0: }); michael@0: michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let helper = context.GsmPDUHelper; michael@0: function test_dcs(dcs, encoding, messageClass, mwi) { michael@0: helper.readHexOctet = function() { michael@0: return dcs; michael@0: } michael@0: michael@0: let msg = {}; michael@0: helper.readDataCodingScheme(msg); michael@0: michael@0: do_check_eq(msg.dcs, dcs); michael@0: do_check_eq(msg.encoding, encoding); michael@0: do_check_eq(msg.messageClass, messageClass); michael@0: do_check_eq(msg.mwi == null, mwi == null); michael@0: if (mwi != null) { michael@0: do_check_eq(msg.mwi.active, mwi.active); michael@0: do_check_eq(msg.mwi.discard, mwi.discard); michael@0: do_check_eq(msg.mwi.msgCount, mwi.msgCount); michael@0: } michael@0: } michael@0: michael@0: // Group 00xx michael@0: // Bit 3 and 2 indicate the character set being used. michael@0: test_dcs(0x00, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]); michael@0: test_dcs(0x04, PDU_DCS_MSG_CODING_8BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]); michael@0: test_dcs(0x08, PDU_DCS_MSG_CODING_16BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]); michael@0: test_dcs(0x0C, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]); michael@0: // Bit 4, if set to 0, indicates that bits 1 to 0 are reserved and have no michael@0: // message class meaning. michael@0: test_dcs(0x01, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]); michael@0: test_dcs(0x02, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]); michael@0: test_dcs(0x03, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]); michael@0: // Bit 4, if set to 1, indicates that bits 1 to 0 have a message class meaning. michael@0: test_dcs(0x10, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_0]); michael@0: test_dcs(0x11, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_1]); michael@0: test_dcs(0x12, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_2]); michael@0: test_dcs(0x13, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_3]); michael@0: michael@0: // Group 01xx michael@0: test_dcs(0x50, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_0]); michael@0: michael@0: // Group 1000..1011: reserved michael@0: test_dcs(0x8F, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]); michael@0: test_dcs(0x9F, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]); michael@0: test_dcs(0xAF, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]); michael@0: test_dcs(0xBF, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]); michael@0: michael@0: // Group 1100: Message Waiting Indication Group: Discard Message michael@0: // Bit 3 indicates Indication Sense: michael@0: test_dcs(0xC0, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL], michael@0: {active: false, discard: true, msgCount: 0}); michael@0: test_dcs(0xC8, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL], michael@0: {active: true, discard: true, msgCount: -1}); michael@0: // Bit 2 is reserved, and set to 0: michael@0: test_dcs(0xCC, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL], michael@0: {active: true, discard: true, msgCount: -1}); michael@0: michael@0: // Group 1101: Message Waiting Indication Group: Store Message michael@0: // Bit 3 indicates Indication Sense: michael@0: test_dcs(0xD0, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL], michael@0: {active: false, discard: false, msgCount: 0}); michael@0: test_dcs(0xD8, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL], michael@0: {active: true, discard: false, msgCount: -1}); michael@0: // Bit 2 is reserved, and set to 0: michael@0: test_dcs(0xDC, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL], michael@0: {active: true, discard: false, msgCount: -1}); michael@0: michael@0: // Group 1110: Message Waiting Indication Group: Store Message, UCS2 michael@0: // Bit 3 indicates Indication Sense: michael@0: test_dcs(0xE0, PDU_DCS_MSG_CODING_16BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL], michael@0: {active: false, discard: false, msgCount: 0}); michael@0: test_dcs(0xE8, PDU_DCS_MSG_CODING_16BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL], michael@0: {active: true, discard: false, msgCount: -1}); michael@0: // Bit 2 is reserved, and set to 0: michael@0: test_dcs(0xEC, PDU_DCS_MSG_CODING_16BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL], michael@0: {active: true, discard: false, msgCount: -1}); michael@0: michael@0: // Group 1111 michael@0: test_dcs(0xF0, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_0]); michael@0: test_dcs(0xF1, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_1]); michael@0: test_dcs(0xF2, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_2]); michael@0: test_dcs(0xF3, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_3]); michael@0: test_dcs(0xF4, PDU_DCS_MSG_CODING_8BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_0]); michael@0: test_dcs(0xF5, PDU_DCS_MSG_CODING_8BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_1]); michael@0: test_dcs(0xF6, PDU_DCS_MSG_CODING_8BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_2]); michael@0: test_dcs(0xF7, PDU_DCS_MSG_CODING_8BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_3]); michael@0: // Bit 3 is reserved and should be set to 0, but if it doesn't we should michael@0: // ignore it. michael@0: test_dcs(0xF8, PDU_DCS_MSG_CODING_7BITS_ALPHABET, michael@0: GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_0]); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify GsmPDUHelper#writeStringAsSeptets() padding bits handling. michael@0: */ michael@0: add_test(function test_GsmPDUHelper_writeStringAsSeptets() { michael@0: let worker = newWorker({ michael@0: postRILMessage: function(data) { michael@0: // Do nothing michael@0: }, michael@0: postMessage: function(message) { michael@0: // Do nothing michael@0: } michael@0: }); michael@0: michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let helper = context.GsmPDUHelper; michael@0: helper.resetOctetWritten = function() { michael@0: helper.octetsWritten = 0; michael@0: }; michael@0: helper.writeHexOctet = function() { michael@0: helper.octetsWritten++; michael@0: }; michael@0: michael@0: let base = "AAAAAAAA"; // Base string of 8 characters long michael@0: for (let len = 0; len < 8; len++) { michael@0: let str = base.substring(0, len); michael@0: michael@0: for (let paddingBits = 0; paddingBits < 8; paddingBits++) { michael@0: do_print("Verifying GsmPDUHelper.writeStringAsSeptets(" michael@0: + str + ", " + paddingBits + ", , )"); michael@0: helper.resetOctetWritten(); michael@0: helper.writeStringAsSeptets(str, paddingBits, PDU_NL_IDENTIFIER_DEFAULT, michael@0: PDU_NL_IDENTIFIER_DEFAULT); michael@0: do_check_eq(Math.ceil(((len * 7) + paddingBits) / 8), michael@0: helper.octetsWritten); michael@0: } michael@0: } michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify GsmPDUHelper#readAddress michael@0: */ michael@0: add_test(function test_GsmPDUHelper_readAddress() { michael@0: let worker = newWorker({ michael@0: postRILMessage: function(data) { michael@0: // Do nothing michael@0: }, michael@0: postMessage: function(message) { michael@0: // Do nothing michael@0: } michael@0: }); michael@0: michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let helper = context.GsmPDUHelper; michael@0: function test_address(addrHex, addrString) { michael@0: let uint16Array = []; michael@0: let ix = 0; michael@0: for (let i = 0; i < addrHex.length; ++i) { michael@0: uint16Array[i] = addrHex[i].charCodeAt(); michael@0: } michael@0: michael@0: context.Buf.readUint16 = function(){ michael@0: if(ix >= uint16Array.length) { michael@0: do_throw("out of range in uint16Array"); michael@0: } michael@0: return uint16Array[ix++]; michael@0: } michael@0: let length = helper.readHexOctet(); michael@0: let parsedAddr = helper.readAddress(length); michael@0: do_check_eq(parsedAddr, addrString); michael@0: } michael@0: michael@0: // For AlphaNumeric michael@0: test_address("04D01100", "_@"); michael@0: test_address("04D01000", "\u0394@"); michael@0: michael@0: // Direct prepand michael@0: test_address("0B914151245584F6", "+14154255486"); michael@0: test_address("0E914151245584B633", "+14154255486#33"); michael@0: michael@0: // PDU_TOA_NATIONAL michael@0: test_address("0BA14151245584F6", "14154255486"); michael@0: michael@0: run_next_test(); michael@0: });