michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: MARIONETTE_TIMEOUT = 60000; michael@0: michael@0: const PDU_SMSC = "00"; // No SMSC Address michael@0: const PDU_FIRST_OCTET = "00"; // RP:no, UDHI:no, SRI:no, MMS:no, MTI:SMS-DELIVER michael@0: const PDU_SENDER = "0191F1"; // +1 michael@0: const PDU_PID_NORMAL = "00"; michael@0: const PDU_PID_ANSI_136_R_DATA = "7C"; michael@0: const PDU_PID_USIM_DATA_DOWNLOAD = "7F"; michael@0: const PDU_TIMESTAMP = "00101000000000"; // 2000/01/01 michael@0: const PDU_UDL = "01"; michael@0: const PDU_UD = "41"; michael@0: michael@0: const SENT_TIMESTAMP = Date.UTC(2000, 0, 1); // Must be equal to PDU_TIMESTAMP. michael@0: michael@0: SpecialPowers.addPermission("sms", true, document); michael@0: michael@0: let manager = window.navigator.mozMobileMessage; michael@0: ok(manager instanceof MozMobileMessageManager, michael@0: "manager is instance of " + manager.constructor); michael@0: michael@0: let pendingEmulatorCmdCount = 0; michael@0: function sendSmsPduToEmulator(pdu) { michael@0: ++pendingEmulatorCmdCount; michael@0: michael@0: let cmd = "sms pdu " + pdu; michael@0: runEmulatorCmd(cmd, function(result) { michael@0: --pendingEmulatorCmdCount; michael@0: michael@0: is(result[0], "OK", "Emulator response"); michael@0: }); michael@0: } michael@0: michael@0: function checkMessage(message, id, threadId, messageClass) { michael@0: ok(message instanceof MozSmsMessage, michael@0: "message is instanceof " + message.constructor); michael@0: if (id == null) { michael@0: ok(message.id > 0, "message.id"); michael@0: } else { michael@0: is(message.id, id, "message.id"); michael@0: } michael@0: if (threadId == null) { michael@0: ok(message.threadId > 0, "message.threadId"); michael@0: } else { michael@0: is(message.threadId, threadId, "message.threadId"); michael@0: } michael@0: is(message.delivery, "received", "message.delivery"); michael@0: is(message.deliveryStatus, "success", "message.deliveryStatus"); michael@0: is(message.sender, "+1", "message.sender"); michael@0: is(message.body, "A", "message.body"); michael@0: is(message.messageClass, messageClass, "message.messageClass"); michael@0: is(message.deliveryTimestamp, 0, "deliveryTimestamp is 0"); michael@0: is(message.read, false, "message.read"); michael@0: } michael@0: michael@0: function test_message_class_0() { michael@0: let allDCSs = [ michael@0: "10", // General Group: 00xx michael@0: "50", // Automatica Deletion Group: 01xx michael@0: "F0" // (no name) Group: 1111 michael@0: ]; michael@0: michael@0: function do_test(dcsIndex) { michael@0: manager.addEventListener("received", function onReceived(event) { michael@0: manager.removeEventListener("received", onReceived); michael@0: michael@0: let message = event.message; michael@0: checkMessage(message, -1, 0, "class-0"); michael@0: ok(event.message.timestamp >= timeBeforeSend, michael@0: "Message's timestamp should be greater then the timetamp of sending"); michael@0: ok(event.message.timestamp <= Date.now(), michael@0: "Message's timestamp should be lesser than the timestamp of now"); michael@0: is(event.message.sentTimestamp, SENT_TIMESTAMP, michael@0: "Message's sentTimestamp should be equal to SENT_TIMESTAMP"); michael@0: michael@0: // Make sure the message is not stored. michael@0: let cursor = manager.getMessages(null, false); michael@0: cursor.onsuccess = function onsuccess() { michael@0: if (cursor.result) { michael@0: // Here we check whether there is any message of the same sender. michael@0: isnot(cursor.result.sender, message.sender, "cursor.result.sender"); michael@0: michael@0: cursor.continue(); michael@0: return; michael@0: } michael@0: michael@0: // All messages checked. Done. michael@0: ++dcsIndex; michael@0: if (dcsIndex >= allDCSs.length) { michael@0: window.setTimeout(test_message_class_1, 0); michael@0: } else { michael@0: window.setTimeout(do_test.bind(null, dcsIndex), 0); michael@0: } michael@0: }; michael@0: cursor.onerror = function onerror() { michael@0: ok(false, "Can't fetch messages from SMS database"); michael@0: }; michael@0: }); michael@0: michael@0: let dcs = allDCSs[dcsIndex]; michael@0: log(" Testing DCS " + dcs); michael@0: let pdu = PDU_SMSC + PDU_FIRST_OCTET + PDU_SENDER + PDU_PID_NORMAL + michael@0: dcs + PDU_TIMESTAMP + PDU_UDL + PDU_UD; michael@0: let timeBeforeSend = Date.now(); michael@0: sendSmsPduToEmulator(pdu); michael@0: } michael@0: michael@0: log("Checking Message Class 0"); michael@0: do_test(0); michael@0: } michael@0: michael@0: function doTestMessageClassGeneric(allDCSs, messageClass, next) { michael@0: function do_test(dcsIndex) { michael@0: manager.addEventListener("received", function onReceived(event) { michael@0: manager.removeEventListener("received", onReceived); michael@0: michael@0: // Make sure we can correctly receive the message michael@0: checkMessage(event.message, null, null, messageClass); michael@0: ok(event.message.timestamp >= timeBeforeSend, michael@0: "Message's timestamp should be greater then the timetamp of sending"); michael@0: ok(event.message.timestamp <= Date.now(), michael@0: "Message's timestamp should be lesser than the timestamp of now"); michael@0: is(event.message.sentTimestamp, SENT_TIMESTAMP, michael@0: "Message's sentTimestamp should be equal to SENT_TIMESTAMP"); michael@0: michael@0: ++dcsIndex; michael@0: if (dcsIndex >= allDCSs.length) { michael@0: window.setTimeout(next, 0); michael@0: } else { michael@0: window.setTimeout(do_test.bind(null, dcsIndex), 0); michael@0: } michael@0: }); michael@0: michael@0: let dcs = allDCSs[dcsIndex]; michael@0: log(" Testing DCS " + dcs); michael@0: let pdu = PDU_SMSC + PDU_FIRST_OCTET + PDU_SENDER + PDU_PID_NORMAL + michael@0: dcs + PDU_TIMESTAMP + PDU_UDL + PDU_UD; michael@0: michael@0: let timeBeforeSend = Date.now(); michael@0: sendSmsPduToEmulator(pdu); michael@0: } michael@0: michael@0: do_test(0); michael@0: } michael@0: michael@0: function test_message_class_1() { michael@0: let allDCSs = [ michael@0: "11", // General Group: 00xx michael@0: "51", // Automatica Deletion Group: 01xx michael@0: "F1" // (no name) Group: 1111 michael@0: ]; michael@0: michael@0: log("Checking Message Class 1"); michael@0: doTestMessageClassGeneric(allDCSs, "class-1", test_message_class_2); michael@0: } michael@0: michael@0: function test_message_class_2() { michael@0: let allDCSs = [ michael@0: "12", // General Group: 00xx michael@0: "52", // Automatica Deletion Group: 01xx michael@0: "F2" // (no name) Group: 1111 michael@0: ]; michael@0: michael@0: let allPIDs = [ michael@0: PDU_PID_NORMAL, michael@0: PDU_PID_ANSI_136_R_DATA, michael@0: PDU_PID_USIM_DATA_DOWNLOAD michael@0: ]; michael@0: michael@0: function do_test_dcs(dcsIndex) { michael@0: function do_test_pid(pidIndex) { michael@0: function onReceived(event) { michael@0: if (pidIndex == 0) { michael@0: // Make sure we can correctly receive the message michael@0: checkMessage(event.message, null, null, "class-2"); michael@0: ok(event.message.timestamp >= timeBeforeSend, michael@0: "Message's timestamp should be greater then the timetamp of sending"); michael@0: ok(event.message.timestamp <= Date.now(), michael@0: "Message's timestamp should be lesser than the timestamp of now"); michael@0: is(event.message.sentTimestamp, SENT_TIMESTAMP, michael@0: "Message's sentTimestamp should be equal to SENT_TIMESTAMP"); michael@0: michael@0: next(); michael@0: return; michael@0: } michael@0: michael@0: // TODO: Bug 792798 - B2G SMS: develop test cases for Message Class 2 michael@0: // Since we have "data download via SMS Point-to-Point" service enabled michael@0: // but no working implementation in emulator SIM, all class 2 messages michael@0: // bug normal ones should goto `dataDownloadViaSMSPP()` and we should michael@0: // not receive the message in content page. michael@0: ok(false, "SMS-PP messages shouldn't be sent to content"); michael@0: } michael@0: michael@0: function next() { michael@0: manager.removeEventListener("received", onReceived); michael@0: michael@0: ++pidIndex; michael@0: if (pidIndex >= allPIDs.length) { michael@0: ++dcsIndex; michael@0: if (dcsIndex >= allDCSs.length) { michael@0: window.setTimeout(test_message_class_3, 0); michael@0: } else { michael@0: window.setTimeout(do_test_dcs.bind(null, dcsIndex), 0); michael@0: } michael@0: } else { michael@0: window.setTimeout(do_test_pid.bind(null, pidIndex), 0); michael@0: } michael@0: } michael@0: michael@0: manager.addEventListener("received", onReceived); michael@0: michael@0: if (pidIndex != 0) { michael@0: // Wait for three seconds to ensure we don't receive the message. michael@0: window.setTimeout(next, 3000); michael@0: } michael@0: michael@0: let pid = allPIDs[pidIndex]; michael@0: log(" Testing PID " + pid); michael@0: michael@0: let pdu = PDU_SMSC + PDU_FIRST_OCTET + PDU_SENDER + pid + dcs + michael@0: PDU_TIMESTAMP + PDU_UDL + PDU_UD; michael@0: let timeBeforeSend = Date.now(); michael@0: sendSmsPduToEmulator(pdu); michael@0: } michael@0: michael@0: let dcs = allDCSs[dcsIndex]; michael@0: log(" Testing DCS " + dcs); michael@0: michael@0: do_test_pid(0); michael@0: } michael@0: michael@0: log("Checking Message Class 2"); michael@0: do_test_dcs(0); michael@0: } michael@0: michael@0: function test_message_class_3() { michael@0: let allDCSs = [ michael@0: "13", // General Group: 00xx michael@0: "53", // Automatica Deletion Group: 01xx michael@0: "F3" // (no name) Group: 1111 michael@0: ]; michael@0: michael@0: log("Checking Message Class 3"); michael@0: doTestMessageClassGeneric(allDCSs, "class-3", cleanUp); michael@0: } michael@0: michael@0: function cleanUp() { michael@0: if (pendingEmulatorCmdCount) { michael@0: window.setTimeout(cleanUp, 100); michael@0: return; michael@0: } michael@0: michael@0: SpecialPowers.removePermission("sms", document); michael@0: finish(); michael@0: } michael@0: michael@0: test_message_class_0();