From 0ec340980ac896e40095d8f0ad908e3f5acbbe55 Mon Sep 17 00:00:00 2001 From: Rob Wood Date: Mon, 26 Nov 2012 12:43:56 -0800 Subject: [PATCH] Bug 794301 - Develop WebSMS test to verify marking message read/unread, update manifest. r=davehunt --- dom/sms/tests/marionette/manifest.ini | 2 + .../tests/marionette/test_mark_msg_read.js | 227 ++++++++++++++++++ .../marionette/test_mark_msg_read_error.js | 115 +++++++++ 3 files changed, 344 insertions(+) create mode 100644 dom/sms/tests/marionette/test_mark_msg_read.js create mode 100644 dom/sms/tests/marionette/test_mark_msg_read_error.js diff --git a/dom/sms/tests/marionette/manifest.ini b/dom/sms/tests/marionette/manifest.ini index 50f98ddabcb..eb7288d65d9 100644 --- a/dom/sms/tests/marionette/manifest.ini +++ b/dom/sms/tests/marionette/manifest.ini @@ -22,3 +22,5 @@ qemu = true [test_filter_read.js] [test_filter_unread.js] [test_number_of_messages.js] +[test_mark_msg_read.js] +[test_mark_msg_read_error.js] diff --git a/dom/sms/tests/marionette/test_mark_msg_read.js b/dom/sms/tests/marionette/test_mark_msg_read.js new file mode 100644 index 00000000000..6d7534a376e --- /dev/null +++ b/dom/sms/tests/marionette/test_mark_msg_read.js @@ -0,0 +1,227 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +MARIONETTE_TIMEOUT = 20000; + +SpecialPowers.addPermission("sms", true, document); +SpecialPowers.setBoolPref("dom.sms.enabled", true); + +let sms = window.navigator.mozSms; +let smsList = new Array(); + +function verifyInitialState() { + log("Verifying initial state."); + ok(sms, "mozSms"); + simulateIncomingSms(); +} + +function simulateIncomingSms() { + let text = "Incoming SMS courtesy of Firefox OS"; + let remoteNumber = "5557779999"; + + log("Simulating incoming SMS."); + + // Simulate incoming SMS sent from remoteNumber to our emulator + rcvdEmulatorCallback = false; + runEmulatorCmd("sms send " + remoteNumber + " " + text, function(result) { + is(result[0], "OK", "emulator callback"); + rcvdEmulatorCallback = true; + }); +} + +// Callback for incoming SMS +sms.onreceived = function onreceived(event) { + log("Received 'onreceived' sms event."); + let incomingSms = event.message; + log("Received SMS (id: " + incomingSms.id + ")."); + is(incomingSms.read, false, "incoming message read"); + log("SMS read attribute: " + incomingSms.read + "."); + + // Add newly received message id to array of msgs + smsList.push(incomingSms.id); + + // Wait for emulator to catch up before continuing + waitFor(sendSms, function() { + return(rcvdEmulatorCallback); + }); +}; + +function sendSms() { + let gotSmsSent = false; + let gotRequestSuccess = false; + let remoteNumber = "5557779999"; + let text = "Mo Mo Mo Zilla Zilla Zilla!"; + + log("Sending an SMS."); + + sms.onsent = function(event) { + log("Received 'onsent' smsmanager event."); + gotSmsSent = true; + let sentSms = event.message; + log("Sent SMS (id: " + sentSms.id + ")."); + is(sentSms.read, true, "sent sms read"); + log("SMS read attribute: " + sentSms.read + "."); + + // Add newly received message id to array of msgs + smsList.push(sentSms.id); + + if (gotSmsSent && gotRequestSuccess) { + test1(); + } + }; + + let request = sms.send(remoteNumber, text); + + request.onsuccess = function(event) { + log("Received 'onsuccess' smsrequest event."); + if(event.target.result) { + gotRequestSuccess = true; + if (gotSmsSent && gotRequestSuccess) { + test1(); + } + } else { + log("smsrequest returned false for sms.send"); + ok(false, "SMS send failed"); + deleteMsgs(); + } + }; + + request.onerror = function(event) { + log("Received 'onerror' smsrequest event."); + ok(event.target.error, "domerror obj"); + ok(false, "sms.send request returned unexpected error: " + + event.target.error.name ); + deleteMsgs(); + }; +} + +function markMessageAndVerify(smsId, readBool, nextFunction) { + let request = sms.markMessageRead(smsId, readBool); + ok(request instanceof MozSmsRequest, + "request is instanceof " + request.constructor); + + request.onsuccess = function(event) { + log("Received 'onsuccess' smsrequest event."); + + // Success from MarkMessageRead, the result should match what we set + is(event.target.result, readBool, "result matches what was set"); + + // Message marked read/unread, now verify + log("Getting SMS message (id: " + smsId + ")."); + let requestRet = sms.getMessage(smsId); + ok(requestRet, "smsrequest obj returned"); + + requestRet.onsuccess = function(event) { + log("Received 'onsuccess' smsrequest event."); + ok(event.target.result, "smsrequest event.target.result"); + let foundSms = event.target.result; + is(foundSms.id, smsId, "SMS id matches"); + log("SMS read attribute: " + foundSms.read + "."); + let text = readBool ? "read" : "unread"; + if (foundSms.read == readBool) { + ok(true, "marked sms " + text); + } else { + ok(false, "marking sms " + text + " didn't work"); + log("Expected SMS (id: " + foundSms.id + ") to be marked " + text + + " but it is not."); + } + nextFunction(); + }; + + requestRet.onerror = function(event) { + log("Received 'onerror' smsrequest event."); + ok(event.target.error, "domerror obj"); + is(event.target.error.name, "NotFoundError", "error returned"); + log("Could not get SMS (id: " + outSmsId + ") but should have."); + ok(false, "Could not get SMS"); + deleteMsgs(); + }; + }; + + request.onerror = function(event) { + log("Received 'onerror' smsrequest event."); + ok(event.target.error, "domerror obj"); + ok(false, "sms.markMessageRead request returned unexpected error: " + + event.target.error.name ); + nextFunction(); + }; +} + +function test1() { + rcvdSms = smsList[0]; + log("Test 1: Marking received SMS (id: " + rcvdSms + ") read."); + markMessageAndVerify(rcvdSms, true, test2); +} + +function test2() { + rcvdSms = smsList[0]; + log("Test 2: Marking received SMS (id: " + rcvdSms + ") unread."); + markMessageAndVerify(rcvdSms, false, test3); +} + +function test3() { + sentSms = smsList[1]; + log("Test 3: Marking sent SMS (id: " + sentSms + ") unread."); + markMessageAndVerify(sentSms, false, test4); +} + +function test4() { + sentSms = smsList[1]; + log("Test 4: Marking sent SMS (id: " + sentSms + ") read."); + markMessageAndVerify(sentSms, true, test5); +} + +function test5() { + sentSms = smsList[1]; + log("Test 5: Marking an already read SMS (id: " + sentSms + ") read."); + markMessageAndVerify(sentSms, true, test6); +} + +function test6() { + rcvdSms = smsList[0]; + log("Test 6: Marking an already unread SMS (id: " + rcvdSms + ") unread."); + markMessageAndVerify(rcvdSms, false, deleteMsgs); +} + +function deleteMsgs() { + let smsId = smsList.shift(); + + log("Deleting SMS (id: " + smsId + ")."); + let request = sms.delete(smsId); + ok(request instanceof MozSmsRequest, + "request is instanceof " + request.constructor); + + request.onsuccess = function(event) { + log("Received 'onsuccess' smsrequest event."); + if (event.target.result) { + // Message deleted, continue until none are left + if (smsList.length) { + deleteMsgs(); + } else { + cleanUp(); + } + } else { + log("SMS delete failed."); + ok(false, "sms.delete request returned false"); + cleanUp(); + } + }; + + request.onerror = function(event) { + log("Received 'onerror' smsrequest event."); + ok(event.target.error, "domerror obj"); + ok(false, "sms.delete request returned unexpected error: " + + event.target.error.name ); + cleanUp(); + }; +} + +function cleanUp() { + sms.onreceived = null; + SpecialPowers.removePermission("sms", document); + SpecialPowers.clearUserPref("dom.sms.enabled"); + finish(); +} + +// Start the test +verifyInitialState(); diff --git a/dom/sms/tests/marionette/test_mark_msg_read_error.js b/dom/sms/tests/marionette/test_mark_msg_read_error.js new file mode 100644 index 00000000000..c43037c0085 --- /dev/null +++ b/dom/sms/tests/marionette/test_mark_msg_read_error.js @@ -0,0 +1,115 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +MARIONETTE_TIMEOUT = 10000; + +SpecialPowers.addPermission("sms", true, document); +SpecialPowers.setBoolPref("dom.sms.enabled", true); + +let sms = window.navigator.mozSms; +let smsId; + +function verifyInitialState() { + log("Verifying initial state."); + ok(sms, "mozSms"); + simulateIncomingSms(); +} + +function simulateIncomingSms() { + let text = "Incoming SMS courtesy of Firefox OS"; + let remoteNumber = "5557779999"; + + log("Simulating incoming SMS."); + + // Simulate incoming SMS sent from remoteNumber to our emulator + rcvdEmulatorCallback = false; + runEmulatorCmd("sms send " + remoteNumber + " " + text, function(result) { + is(result[0], "OK", "emulator callback"); + rcvdEmulatorCallback = true; + }); +} + +// Callback for incoming SMS +sms.onreceived = function onreceived(event) { + log("Received 'onreceived' sms event."); + let incomingSms = event.message; + log("Received SMS (id: " + incomingSms.id + ")."); + is(incomingSms.read, false, "incoming message read"); + smsId = incomingSms.id; + + // Wait for emulator to catch up before continuing + waitFor(test1, function() { + return(rcvdEmulatorCallback); + }); +}; + +function markMsgError(invalidId, readBool, nextFunction) { + let requestRet = sms.markMessageRead(invalidId, readBool); + ok(requestRet, "smsrequest obj returned"); + + requestRet.onsuccess = function(event) { + log("Received 'onsuccess' smsrequest event, but expected error."); + ok(false, "Smsrequest should have returned error but did not"); + nextFunction(); + }; + + requestRet.onerror = function(event) { + log("Received 'onerror' smsrequest event."); + ok(event.target.error, "domerror obj"); + is(event.target.error.name, "NotFoundError", "error returned"); + nextFunction(); + }; +} + +function test1() { + // Mark message read for a message that doesn't exist, expect error + let msgIdNoExist = smsId + 1; + log("Attempting to mark non-existent sms (id: " + msgIdNoExist + + ") read, expect error."); + markMsgError(msgIdNoExist, true, test2); +} + +function test2() { + // Mark message read using invalid SMS id, expect error + invalidId = -1; + log("Attempting to mark sms unread using an invalid id (id: " + invalidId + + "), expect error."); + markMsgError(invalidId, false, deleteMsg); +} + +function deleteMsg() { + log("Deleting SMS (id: " + smsId + ")."); + let request = sms.delete(smsId); + ok(request instanceof MozSmsRequest, + "request is instanceof " + request.constructor); + + request.onsuccess = function(event) { + log("Received 'onsuccess' smsrequest event."); + if (event.target.result) { + // Message deleted + cleanUp(); + } else { + log("SMS delete failed."); + ok(false,"sms.delete request returned false"); + cleanUp(); + } + }; + + request.onerror = function(event) { + log("Received 'onerror' smsrequest event."); + ok(event.target.error, "domerror obj"); + ok(false, "sms.delete request returned unexpected error: " + + event.target.error.name ); + cleanUp(); + }; +} + +function cleanUp() { + sms.onreceived = null; + SpecialPowers.removePermission("sms", document); + SpecialPowers.clearUserPref("dom.sms.enabled"); + finish(); +} + +// Start the test +verifyInitialState();