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: SpecialPowers.setBoolPref("dom.sms.enabled", true); michael@0: SpecialPowers.setBoolPref("dom.sms.strict7BitEncoding", false); michael@0: SpecialPowers.setBoolPref("dom.sms.requestStatusReport", true); michael@0: SpecialPowers.addPermission("sms", true, document); michael@0: michael@0: const SENDER = "15555215554"; // the emulator's number 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: const SHORT_BODY = "Hello SMS world!"; michael@0: const LONG_BODY = "Let me not to the marriage of true minds\n" michael@0: + "Admit impediments. Love is not love\n" michael@0: + "Which alters when it alteration finds,\n" michael@0: + "Or bends with the remover to remove:\n\n" michael@0: + "O, no! it is an ever-fix`ed mark,\n" michael@0: + "That looks on tempests and is never shaken;\n" michael@0: + "It is the star to every wand'ring bark,\n" michael@0: + "Whose worth's unknown, although his heighth be taken.\n\n" michael@0: + "Love's not Time's fool, though rosy lips and cheeks\n" michael@0: + "Within his bending sickle's compass come;\n" michael@0: + "Love alters not with his brief hours and weeks,\n" michael@0: + "But bears it out even to the edge of doom:\n\n" michael@0: + "If this be error and upon me proved,\n" michael@0: + "I never writ, nor no man ever loved. "; michael@0: michael@0: function checkMessage(message, delivery, body) { michael@0: ok(message, "message is valid"); michael@0: ok(message instanceof MozSmsMessage, michael@0: "message is instanceof " + message.constructor); michael@0: michael@0: ok(message.id, "message.id"); michael@0: ok(message.threadId, "message.threadId"); michael@0: is(message.delivery, delivery, "message.delivery"); michael@0: is(message.deliveryStatus, "pending", "message.deliveryStatus"); michael@0: is(message.sender, SENDER, "message.sender"); michael@0: ok(message.receiver, "message.receiver"); michael@0: is(message.body, body, "message.body"); michael@0: is(message.messageClass, "normal", "message.messageClass"); michael@0: is(message.read, true, "message.read"); michael@0: michael@0: // TODO: bug 788928 - add test cases for deliverysuccess event. michael@0: is(message.deliveryTimestamp, 0, "deliveryTimestamp is 0"); michael@0: michael@0: // Test message.sentTimestamp. michael@0: if (message.delivery == "sending") { michael@0: ok(message.sentTimestamp == 0, "message.sentTimestamp should be 0"); michael@0: } else if (message.delivery == "sent") { michael@0: ok(message.sentTimestamp != 0, "message.sentTimestamp shouldn't be 0"); michael@0: } michael@0: } michael@0: michael@0: function doSendMessageAndCheckSuccess(receivers, body, callback) { michael@0: let options = {}; michael@0: let now = Date.now(); michael@0: michael@0: function done() { michael@0: let rs = Array.isArray(receivers) ? receivers : [receivers]; michael@0: // Make sure we've send a message to each distinct receiver. michael@0: for (let i = 0; i < rs.length; i++) { michael@0: let opt = options[rs[i]]; michael@0: if (!(opt && opt.onSentCalled && opt.onRequestSuccessCalled)) { michael@0: return; michael@0: } michael@0: } michael@0: michael@0: manager.removeEventListener("sending", onSmsSending); michael@0: manager.removeEventListener("sent", onSmsSent); michael@0: michael@0: log("Done!"); michael@0: window.setTimeout(callback, 0); michael@0: } michael@0: michael@0: function checkSentMessage(message, mark) { michael@0: checkMessage(message, "sent", body); michael@0: michael@0: let receiver = message && message.receiver; michael@0: if (!receiver) { michael@0: ok(false, "message.receiver should be valid."); michael@0: return; michael@0: } michael@0: michael@0: let opt = options[receiver]; michael@0: if (!opt) { michael@0: ok(false, "onsent should be called after onsending."); michael@0: return; michael@0: } michael@0: michael@0: let saved = opt.saved; michael@0: is(message.id, saved.id, "message.id"); michael@0: is(message.receiver, saved.receiver, "message.receiver"); michael@0: is(message.body, saved.body, "message.body"); michael@0: is(message.timestamp, saved.timestamp, "message.timestamp"); michael@0: michael@0: opt[mark] = true; michael@0: michael@0: done(); michael@0: } michael@0: michael@0: function onRequestSuccess(event) { michael@0: log("request.onsuccess event received."); michael@0: michael@0: ok(event.target instanceof DOMRequest, michael@0: "event.target is instanceof " + event.target.constructor); michael@0: event.target.removeEventListener("success", onRequestSuccess); michael@0: michael@0: checkSentMessage(event.target.result, "onRequestSuccessCalled"); michael@0: } michael@0: michael@0: function onSmsSending(event) { michael@0: log("onsending event received."); michael@0: michael@0: // Bug 838542: following check throws an exception and fails this case. michael@0: // ok(event instanceof MozSmsEvent, michael@0: // "event is instanceof " + event.constructor) michael@0: ok(event, "event is valid"); michael@0: michael@0: let message = event.message; michael@0: checkMessage(message, "sending", body); michael@0: // timestamp is in seconds. michael@0: ok(Math.floor(message.timestamp / 1000) >= Math.floor(now / 1000), michael@0: "sent timestamp is valid"); michael@0: michael@0: let receiver = message.receiver; michael@0: if (!receiver) { michael@0: return; michael@0: } michael@0: michael@0: if (options[receiver]) { michael@0: ok(false, "duplicated onsending events found!"); michael@0: return; michael@0: } michael@0: michael@0: options[receiver] = { michael@0: saved: message, michael@0: onSentCalled: false, michael@0: onRequestSuccessCalled: false michael@0: }; michael@0: } michael@0: michael@0: function onSmsSent(event) { michael@0: log("onsent event received."); michael@0: michael@0: // Bug 838542: following check throws an exception and fails this case. michael@0: // ok(event instanceof MozSmsEvent, michael@0: // "event is instanceof " + event.constructor) michael@0: ok(event, "event is valid"); michael@0: michael@0: checkSentMessage(event.message, "onSentCalled"); michael@0: } michael@0: michael@0: manager.addEventListener("sending", onSmsSending); michael@0: manager.addEventListener("sent", onSmsSent); michael@0: michael@0: let result = manager.send(receivers, body); michael@0: is(Array.isArray(result), Array.isArray(receivers), michael@0: "send() returns an array of requests if receivers is an array"); michael@0: if (Array.isArray(receivers)) { michael@0: is(result.length, receivers.length, "returned array length"); michael@0: } else { michael@0: result = [result]; michael@0: } michael@0: michael@0: for (let i = 0; i < result.length; i++) { michael@0: let request = result[i]; michael@0: ok(request instanceof DOMRequest, michael@0: "request is instanceof " + request.constructor); michael@0: request.addEventListener("success", onRequestSuccess); michael@0: } michael@0: } michael@0: michael@0: function testSendMessage() { michael@0: log("Testing sending message to one receiver:"); michael@0: doSendMessageAndCheckSuccess("1", SHORT_BODY, testSendMultipartMessage); michael@0: } michael@0: michael@0: function testSendMultipartMessage() { michael@0: log("Testing sending message to one receiver:"); michael@0: doSendMessageAndCheckSuccess("1", LONG_BODY, michael@0: testSendMessageToMultipleRecipients); michael@0: } michael@0: michael@0: function testSendMessageToMultipleRecipients() { michael@0: log("Testing sending message to multiple receivers:"); michael@0: // TODO: bug 788928 - add test cases for ondelivered event. michael@0: doSendMessageAndCheckSuccess(["1", "2"], SHORT_BODY, cleanUp); michael@0: } michael@0: michael@0: function cleanUp() { michael@0: SpecialPowers.removePermission("sms", document); michael@0: SpecialPowers.clearUserPref("dom.sms.enabled"); michael@0: SpecialPowers.clearUserPref("dom.sms.strict7BitEncoding"); michael@0: SpecialPowers.clearUserPref("dom.sms.requestStatusReport"); michael@0: finish(); michael@0: } michael@0: michael@0: testSendMessage();