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.addPermission("sms", true, document); michael@0: SpecialPowers.setBoolPref("dom.sms.enabled", true); michael@0: michael@0: let manager = window.navigator.mozMobileMessage; michael@0: let numberMsgs = 10; michael@0: let smsList = new Array(); michael@0: michael@0: function verifyInitialState() { michael@0: log("Verifying initial state."); michael@0: ok(manager instanceof MozMobileMessageManager, michael@0: "manager is instance of " + manager.constructor); michael@0: // Ensure test is starting clean with no existing sms messages michael@0: deleteAllMsgs(simulateIncomingSms); michael@0: } michael@0: michael@0: function isIn(aVal, aArray, aMsg) { michael@0: ok(aArray.indexOf(aVal) >= 0, aMsg); michael@0: } michael@0: michael@0: function deleteAllMsgs(nextFunction) { michael@0: let msgList = new Array(); michael@0: let smsFilter = new MozSmsFilter; michael@0: michael@0: let cursor = manager.getMessages(smsFilter, false); michael@0: ok(cursor instanceof DOMCursor, michael@0: "cursor is instanceof " + cursor.constructor); michael@0: michael@0: cursor.onsuccess = function(event) { michael@0: // Check if message was found michael@0: if (cursor.result) { michael@0: msgList.push(cursor.result.id); michael@0: // Now get next message in the list michael@0: cursor.continue(); michael@0: } else { michael@0: // No (more) messages found michael@0: if (msgList.length) { michael@0: log("Found " + msgList.length + " SMS messages to delete."); michael@0: deleteMsgs(msgList, nextFunction); michael@0: } else { michael@0: log("No SMS messages found."); michael@0: nextFunction(); michael@0: } michael@0: } michael@0: }; michael@0: michael@0: cursor.onerror = function(event) { michael@0: log("Received 'onerror' event."); michael@0: ok(event.target.error, "domerror obj"); michael@0: log("manager.getMessages error: " + event.target.error.name); michael@0: ok(false,"Could not get SMS messages"); michael@0: cleanUp(); michael@0: }; michael@0: } michael@0: michael@0: function deleteMsgs(msgList, nextFunction) { michael@0: let smsId = msgList.shift(); michael@0: michael@0: log("Deleting SMS (id: " + smsId + ")."); michael@0: let request = manager.delete(smsId); michael@0: ok(request instanceof DOMRequest, michael@0: "request is instanceof " + request.constructor); michael@0: michael@0: request.onsuccess = function(event) { michael@0: log("Received 'onsuccess' smsrequest event."); michael@0: if (event.target.result) { michael@0: // Message deleted, continue until none are left michael@0: if (msgList.length) { michael@0: deleteMsgs(msgList, nextFunction); michael@0: } else { michael@0: log("Finished deleting SMS messages."); michael@0: nextFunction(); michael@0: } michael@0: } else { michael@0: log("SMS delete failed."); michael@0: ok(false,"manager.delete request returned false"); michael@0: cleanUp(); michael@0: } michael@0: }; michael@0: michael@0: request.onerror = function(event) { michael@0: log("Received 'onerror' smsrequest event."); michael@0: ok(event.target.error, "domerror obj"); michael@0: ok(false, "manager.delete request returned unexpected error: " michael@0: + event.target.error.name ); michael@0: cleanUp(); michael@0: }; michael@0: } michael@0: michael@0: function simulateIncomingSms() { michael@0: let text = "Incoming SMS number " + (smsList.length + 1); michael@0: let remoteNumber = "5552229797"; michael@0: michael@0: log("Simulating incoming SMS number " + (smsList.length + 1) + " of " michael@0: + numberMsgs + "."); michael@0: michael@0: // Simulate incoming sms sent from remoteNumber to our emulator michael@0: rcvdEmulatorCallback = false; michael@0: runEmulatorCmd("sms send " + remoteNumber + " " + text, function(result) { michael@0: is(result[0], "OK", "emulator callback"); michael@0: rcvdEmulatorCallback = true; michael@0: }); michael@0: } michael@0: michael@0: // Callback for incoming sms michael@0: manager.onreceived = function onreceived(event) { michael@0: log("Received 'onreceived' sms event."); michael@0: let incomingSms = event.message; michael@0: log("Received SMS (id: " + incomingSms.id + ")."); michael@0: michael@0: // Add newly received message to array of received msgs michael@0: smsList.push(incomingSms); michael@0: michael@0: // Wait for emulator to catch up before continuing michael@0: waitFor(nextRep,function() { michael@0: return(rcvdEmulatorCallback); michael@0: }); michael@0: }; michael@0: michael@0: function nextRep() { michael@0: if (smsList.length < numberMsgs) { michael@0: simulateIncomingSms(); michael@0: } else { michael@0: log("Received " + numberMsgs + " sms messages in total."); michael@0: getMsgs(false); michael@0: } michael@0: } michael@0: michael@0: function getMsgs(reverse) { michael@0: let smsFilter = new MozSmsFilter; michael@0: let foundSmsCount = 0; michael@0: let foundSmsList = new Array(); michael@0: michael@0: if (!reverse) { michael@0: log("Getting the sms messages."); michael@0: } else { michael@0: log("Getting the sms messages in reverse order."); michael@0: } michael@0: michael@0: // Note: This test is intended for getMessages, so just a basic test with michael@0: // no filter (default); separate tests will be written for sms filtering michael@0: let cursor = manager.getMessages(smsFilter, reverse); michael@0: ok(cursor instanceof DOMCursor, michael@0: "cursor is instanceof " + cursor.constructor); michael@0: michael@0: cursor.onsuccess = function(event) { michael@0: log("Received 'onsuccess' event."); michael@0: michael@0: if (cursor.result) { michael@0: // Another message found michael@0: log("Got SMS (id: " + cursor.result.id + ")."); michael@0: foundSmsCount++; michael@0: // Store found message michael@0: foundSmsList.push(cursor.result); michael@0: // Now get next message in the list michael@0: cursor.continue(); michael@0: } else { michael@0: // No more messages; ensure correct number found michael@0: if (foundSmsCount == numberMsgs) { michael@0: log("SMS getMessages returned " + foundSmsCount + michael@0: " messages as expected."); michael@0: } else { michael@0: log("SMS getMessages returned " + foundSmsCount + michael@0: " messages, but expected " + numberMsgs + "."); michael@0: ok(false, "Incorrect number of messages returned by manager.getMessages"); michael@0: } michael@0: verifyFoundMsgs(foundSmsList, reverse); michael@0: } michael@0: }; michael@0: michael@0: cursor.onerror = function(event) { michael@0: log("Received 'onerror' event."); michael@0: ok(event.target.error, "domerror obj"); michael@0: log("manager.getMessages error: " + event.target.error.name); michael@0: ok(false,"Could not get SMS messages"); michael@0: cleanUp(); michael@0: }; michael@0: } michael@0: michael@0: function verifyFoundMsgs(foundSmsList, reverse) { michael@0: if (reverse) { michael@0: smsList.reverse(); michael@0: } michael@0: for (var x = 0; x < numberMsgs; x++) { michael@0: is(foundSmsList[x].id, smsList[x].id, "id"); michael@0: is(foundSmsList[x].threadId, smsList[x].threadId, "thread id"); michael@0: is(foundSmsList[x].body, smsList[x].body, "body"); michael@0: is(foundSmsList[x].delivery, smsList[x].delivery, "delivery"); michael@0: is(foundSmsList[x].read, smsList[x].read, "read"); michael@0: michael@0: // Bug 805799: receiver null when onreceived event is fired, until do a michael@0: // getMessage. Default emulator (receiver) phone number is 15555215554 michael@0: if (!smsList[x].receiver) { michael@0: isIn(foundSmsList[x].receiver, ["15555215554", "+15555215554"], "receiver"); michael@0: } else { michael@0: isIn(foundSmsList[x].receiver, [smsList[x].receiver, "+15555215554"], "receiver"); michael@0: } michael@0: michael@0: isIn(foundSmsList[x].sender, [smsList[x].sender, "+15552229797"], "sender"); michael@0: is(foundSmsList[x].timestamp, smsList[x].timestamp, "timestamp"); michael@0: is(foundSmsList[x].sentTimestamp, smsList[x].sentTimestamp, "sentTimestamp"); michael@0: } michael@0: michael@0: log("Content in all of the returned SMS messages is correct."); michael@0: michael@0: if (!reverse) { michael@0: // Now get messages in reverse michael@0: getMsgs(true); michael@0: } else { michael@0: // Finished, delete all messages michael@0: deleteAllMsgs(cleanUp); michael@0: }; michael@0: } michael@0: michael@0: function cleanUp() { michael@0: manager.onreceived = null; michael@0: SpecialPowers.removePermission("sms", document); michael@0: SpecialPowers.clearUserPref("dom.sms.enabled"); michael@0: finish(); michael@0: } michael@0: michael@0: // Start the test michael@0: verifyInitialState();