summaryrefslogtreecommitdiffstats
path: root/dom/system/gonk/tests/test_ril_worker_sms_gsmpduhelper.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/system/gonk/tests/test_ril_worker_sms_gsmpduhelper.js')
-rw-r--r--dom/system/gonk/tests/test_ril_worker_sms_gsmpduhelper.js282
1 files changed, 282 insertions, 0 deletions
diff --git a/dom/system/gonk/tests/test_ril_worker_sms_gsmpduhelper.js b/dom/system/gonk/tests/test_ril_worker_sms_gsmpduhelper.js
new file mode 100644
index 000000000..f52c64cf8
--- /dev/null
+++ b/dom/system/gonk/tests/test_ril_worker_sms_gsmpduhelper.js
@@ -0,0 +1,282 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+subscriptLoader.loadSubScript("resource://gre/modules/ril_consts.js", this);
+
+function run_test() {
+ run_next_test();
+}
+
+/**
+ * Verify GsmPDUHelper#readDataCodingScheme.
+ */
+add_test(function test_GsmPDUHelper_readDataCodingScheme() {
+ let worker = newWorker({
+ postRILMessage: function(data) {
+ // Do nothing
+ },
+ postMessage: function(message) {
+ // Do nothing
+ }
+ });
+
+ let context = worker.ContextPool._contexts[0];
+ let helper = context.GsmPDUHelper;
+ function test_dcs(dcs, encoding, messageClass, mwi) {
+ helper.readHexOctet = function() {
+ return dcs;
+ }
+
+ let msg = {};
+ helper.readDataCodingScheme(msg);
+
+ equal(msg.dcs, dcs);
+ equal(msg.encoding, encoding);
+ equal(msg.messageClass, messageClass);
+ equal(msg.mwi == null, mwi == null);
+ if (mwi != null) {
+ equal(msg.mwi.active, mwi.active);
+ equal(msg.mwi.discard, mwi.discard);
+ equal(msg.mwi.msgCount, mwi.msgCount);
+ }
+ }
+
+ // Group 00xx
+ // Bit 3 and 2 indicate the character set being used.
+ test_dcs(0x00, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]);
+ test_dcs(0x04, PDU_DCS_MSG_CODING_8BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]);
+ test_dcs(0x08, PDU_DCS_MSG_CODING_16BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]);
+ test_dcs(0x0C, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]);
+ // Bit 4, if set to 0, indicates that bits 1 to 0 are reserved and have no
+ // message class meaning.
+ test_dcs(0x01, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]);
+ test_dcs(0x02, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]);
+ test_dcs(0x03, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]);
+ // Bit 4, if set to 1, indicates that bits 1 to 0 have a message class meaning.
+ test_dcs(0x10, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_0]);
+ test_dcs(0x11, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_1]);
+ test_dcs(0x12, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_2]);
+ test_dcs(0x13, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_3]);
+
+ // Group 01xx
+ test_dcs(0x50, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_0]);
+
+ // Group 1000..1011: reserved
+ test_dcs(0x8F, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]);
+ test_dcs(0x9F, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]);
+ test_dcs(0xAF, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]);
+ test_dcs(0xBF, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL]);
+
+ // Group 1100: Message Waiting Indication Group: Discard Message
+ // Bit 3 indicates Indication Sense:
+ test_dcs(0xC0, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL],
+ {active: false, discard: true, msgCount: 0});
+ test_dcs(0xC8, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL],
+ {active: true, discard: true, msgCount: -1});
+ // Bit 2 is reserved, and set to 0:
+ test_dcs(0xCC, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL],
+ {active: true, discard: true, msgCount: -1});
+
+ // Group 1101: Message Waiting Indication Group: Store Message
+ // Bit 3 indicates Indication Sense:
+ test_dcs(0xD0, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL],
+ {active: false, discard: false, msgCount: 0});
+ test_dcs(0xD8, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL],
+ {active: true, discard: false, msgCount: -1});
+ // Bit 2 is reserved, and set to 0:
+ test_dcs(0xDC, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL],
+ {active: true, discard: false, msgCount: -1});
+
+ // Group 1110: Message Waiting Indication Group: Store Message, UCS2
+ // Bit 3 indicates Indication Sense:
+ test_dcs(0xE0, PDU_DCS_MSG_CODING_16BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL],
+ {active: false, discard: false, msgCount: 0});
+ test_dcs(0xE8, PDU_DCS_MSG_CODING_16BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL],
+ {active: true, discard: false, msgCount: -1});
+ // Bit 2 is reserved, and set to 0:
+ test_dcs(0xEC, PDU_DCS_MSG_CODING_16BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_NORMAL],
+ {active: true, discard: false, msgCount: -1});
+
+ // Group 1111
+ test_dcs(0xF0, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_0]);
+ test_dcs(0xF1, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_1]);
+ test_dcs(0xF2, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_2]);
+ test_dcs(0xF3, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_3]);
+ test_dcs(0xF4, PDU_DCS_MSG_CODING_8BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_0]);
+ test_dcs(0xF5, PDU_DCS_MSG_CODING_8BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_1]);
+ test_dcs(0xF6, PDU_DCS_MSG_CODING_8BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_2]);
+ test_dcs(0xF7, PDU_DCS_MSG_CODING_8BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_3]);
+ // Bit 3 is reserved and should be set to 0, but if it doesn't we should
+ // ignore it.
+ test_dcs(0xF8, PDU_DCS_MSG_CODING_7BITS_ALPHABET,
+ GECKO_SMS_MESSAGE_CLASSES[PDU_DCS_MSG_CLASS_0]);
+
+ run_next_test();
+});
+
+/**
+ * Verify GsmPDUHelper#writeStringAsSeptets() padding bits handling.
+ */
+add_test(function test_GsmPDUHelper_writeStringAsSeptets() {
+ let worker = newWorker({
+ postRILMessage: function(data) {
+ // Do nothing
+ },
+ postMessage: function(message) {
+ // Do nothing
+ }
+ });
+
+ let context = worker.ContextPool._contexts[0];
+ let helper = context.GsmPDUHelper;
+ helper.resetOctetWritten = function() {
+ helper.octetsWritten = 0;
+ };
+ helper.writeHexOctet = function() {
+ helper.octetsWritten++;
+ };
+
+ let base = "AAAAAAAA"; // Base string of 8 characters long
+ for (let len = 0; len < 8; len++) {
+ let str = base.substring(0, len);
+
+ for (let paddingBits = 0; paddingBits < 8; paddingBits++) {
+ do_print("Verifying GsmPDUHelper.writeStringAsSeptets("
+ + str + ", " + paddingBits + ", <default>, <default>)");
+ helper.resetOctetWritten();
+ helper.writeStringAsSeptets(str, paddingBits, PDU_NL_IDENTIFIER_DEFAULT,
+ PDU_NL_IDENTIFIER_DEFAULT);
+ equal(Math.ceil(((len * 7) + paddingBits) / 8),
+ helper.octetsWritten);
+ }
+ }
+
+ run_next_test();
+});
+
+/**
+ * Verify that encoding with Spanish locking shift table generates the same
+ * septets as with GSM default alphabet table.
+ *
+ * Bug 1138841 - Incorrect Spanish national language locking shift table
+ * definition.
+ */
+add_test(function test_GsmPDUHelper_writeStringAsSeptets_spanish_fallback() {
+ let worker = newWorker({
+ postRILMessage: function(data) {
+ // Do nothing
+ },
+ postMessage: function(message) {
+ // Do nothing
+ }
+ });
+
+ let context = worker.ContextPool._contexts[0];
+ let helper = context.GsmPDUHelper;
+ let buf = [];
+ helper.writeHexOctet = function(octet) {
+ buf.push(octet);
+ }
+
+ // Simple message string which is covered by GSM default alphabet.
+ let msg = "The quick brown fox jumps over the lazy dog";
+
+ // Encoded with GSM default alphabet.
+ helper.writeStringAsSeptets(msg, 0 /* paddingBits */,
+ PDU_NL_IDENTIFIER_DEFAULT, PDU_NL_IDENTIFIER_DEFAULT);
+ let octetsWithDefaultTable = buf;
+ buf = [];
+
+ // Encoded with Spanish locking shift table.
+ helper.writeStringAsSeptets(msg, 0 /* paddingBits */,
+ PDU_NL_IDENTIFIER_SPANISH, PDU_NL_IDENTIFIER_SPANISH);
+
+ // The length and content should be equal to what encoded with GSM default
+ // alphabet.
+ equal(octetsWithDefaultTable.length, buf.length);
+ for (let i = 0; i < buf.length; i++) {
+ equal(octetsWithDefaultTable[i], buf[i]);
+ }
+
+ run_next_test();
+});
+
+/**
+ * Verify GsmPDUHelper#readAddress
+ */
+add_test(function test_GsmPDUHelper_readAddress() {
+ let worker = newWorker({
+ postRILMessage: function(data) {
+ // Do nothing
+ },
+ postMessage: function(message) {
+ // Do nothing
+ }
+ });
+
+ let context = worker.ContextPool._contexts[0];
+ let helper = context.GsmPDUHelper;
+ function test_address(addrHex, addrString) {
+ let uint16Array = [];
+ let ix = 0;
+ for (let i = 0; i < addrHex.length; ++i) {
+ uint16Array[i] = addrHex[i].charCodeAt();
+ }
+
+ context.Buf.readUint16 = function(){
+ if(ix >= uint16Array.length) {
+ do_throw("out of range in uint16Array");
+ }
+ return uint16Array[ix++];
+ }
+ let length = helper.readHexOctet();
+ let parsedAddr = helper.readAddress(length);
+ equal(parsedAddr, addrString);
+ }
+
+ // For AlphaNumeric
+ test_address("04D01100", "_@");
+ test_address("04D01000", "\u0394@");
+
+ // Direct prepand
+ test_address("0B914151245584F6", "+14154255486");
+ test_address("0E914151245584B633", "+14154255486#33");
+
+ // PDU_TOA_NATIONAL
+ test_address("0BA14151245584F6", "14154255486");
+
+ run_next_test();
+});