Bug 993817: convert mobilemssage marionette test cases to Promise. r=gene

This commit is contained in:
Vicamo Yang 2014-06-25 11:57:21 +08:00
Родитель abc8270f73
Коммит 2fd1cb34af
11 изменённых файлов: 428 добавлений и 1216 удалений

Просмотреть файл

@ -5,6 +5,29 @@ const {Cc: Cc, Ci: Ci, Cr: Cr, Cu: Cu} = SpecialPowers;
let Promise = Cu.import("resource://gre/modules/Promise.jsm").Promise;
/**
* Push a list of preference settings. Never reject.
*
* Fulfill params: (none)
*
* @param aPrefs
* An JS object. For example:
*
* {'set': [['foo.bar', 2], ['magic.pref', 'baz']],
* 'clear': [['clear.this'], ['also.this']] };
*
* @return A deferred promise.
*/
function pushPrefEnv(aPrefs) {
let deferred = Promise.defer();
SpecialPowers.pushPrefEnv(aPrefs, function() {
deferred.resolve();
});
return deferred.promise;
}
/**
* Push required permissions and test if |navigator.mozMobileMessage| exists.
* Resolve if it does, reject otherwise.
@ -54,16 +77,24 @@ function ensureMobileMessage() {
*
* @param aEventName
* A string event name.
* @param aMatchFunc [optional]
* An additional callback function to match the interested event
* before removing the listener and going to resolve the promise.
*
* @return A deferred promise.
*/
function waitForManagerEvent(aEventName) {
function waitForManagerEvent(aEventName, aMatchFunc) {
let deferred = Promise.defer();
manager.addEventListener(aEventName, function onevent(aEvent) {
manager.removeEventListener(aEventName, onevent);
if (aMatchFunc && !aMatchFunc(aEvent)) {
ok(true, "MobileMessageManager event '" + aEventName + "' got" +
" but is not interested.");
return;
}
ok(true, "MobileMessageManager event '" + aEventName + "' got.");
manager.removeEventListener(aEventName, onevent);
deferred.resolve(aEvent);
});
@ -184,6 +215,24 @@ function sendMmsWithFailure(aMmsParameters, aSendParameters) {
error: aResults[1] }; });
}
/**
* Retrieve message by message id.
*
* Fulfill params: MozSmsMessage
* Reject params:
* event -- a DOMEvent
*
* @param aId
* A numeric message id.
*
* @return A deferred promise.
*/
function getMessage(aId) {
let request = manager.getMessage(aId);
return wrapDomRequestAsPromise(request)
.then((aEvent) => { return aEvent.target.result; });
}
/**
* Retrieve messages from database.
*
@ -396,6 +445,11 @@ function runEmulatorCmdSafe(aCommand) {
* Reject params:
* result -- an array of emulator response lines.
*
* @param aFrom
* A string-typed from address.
* @param aText
* A string-typed message body.
*
* @return A deferred promise.
*/
function sendTextSmsToEmulator(aFrom, aText) {
@ -403,6 +457,26 @@ function sendTextSmsToEmulator(aFrom, aText) {
return runEmulatorCmdSafe(command);
}
/**
* Send simple text SMS to emulator and wait for a received event.
*
* Fulfill params: MozSmsMessage
* Reject params: (none)
*
* @param aFrom
* A string-typed from address.
* @param aText
* A string-typed message body.
*
* @return A deferred promise.
*/
function sendTextSmsToEmulatorAndWait(aFrom, aText) {
let promises = [];
promises.push(waitForManagerEvent("received"));
promises.push(sendTextSmsToEmulator(aFrom, aText));
return Promise.all(promises).then(aResults => aResults[0].message);
}
/**
* Send raw SMS TPDU to emulator.
*
@ -464,16 +538,35 @@ function messagesToIds(aMessages) {
return ids;
}
/**
* Convenient function to compare two SMS messages.
*/
function compareSmsMessage(aFrom, aTo) {
const FIELDS = ["id", "threadId", "iccId", "body", "delivery",
"deliveryStatus", "read", "receiver", "sender",
"messageClass", "timestamp", "deliveryTimestamp",
"sentTimestamp"];
for (let field of FIELDS) {
is(aFrom[field], aTo[field], "message." + field);
}
}
/**
* Flush permission settings and call |finish()|.
*/
function cleanUp() {
ok(true, ":: CLEANING UP ::");
waitFor(function() {
SpecialPowers.flushPermissions(function() {
// Use ok here so that we have at least one test run.
ok(true, "permissions flushed");
finish();
SpecialPowers.flushPrefEnv(function() {
ok(true, "preferences flushed");
finish();
})
});
}, function() {
return pendingEmulatorCmdCount === 0;

Просмотреть файл

@ -12,10 +12,8 @@ qemu = true
[test_outgoing_delete.js]
[test_getmessage.js]
[test_getmessage_notfound.js]
[test_incoming_multipart.js]
[test_getmessages.js]
[test_filter_date.js]
[test_filter_date_notfound.js]
[test_filter_number.js]
[test_filter_received.js]
[test_filter_sent.js]

Просмотреть файл

@ -2,22 +2,10 @@
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = 'head.js';
const SELF = "5554";
SpecialPowers.setBoolPref("dom.sms.enabled", true);
SpecialPowers.addPermission("sms", true, document);
function cleanUp() {
SpecialPowers.removePermission("sms", document);
SpecialPowers.clearUserPref("dom.sms.enabled");
finish();
}
let manager = window.navigator.mozMobileMessage;
ok(manager instanceof MozMobileMessageManager,
"manager is instance of " + manager.constructor);
function randomString16() {
return Math.random().toString(36).substr(2, 16);
}
@ -26,30 +14,21 @@ function times(str, n) {
return (new Array(n + 1)).join(str);
}
function repeat(func, array, oncomplete) {
(function do_call(index) {
let next = index < (array.length - 1) ? do_call.bind(null, index + 1) : oncomplete;
func.apply(null, [array[index], next]);
})(0);
function test(aBody) {
let promises = [];
promises.push(waitForManagerEvent('received')
.then(function(aEvent) {
let message = aEvent.message;
is(message.body, aBody, "message.body");
}));
promises.push(sendSmsWithSuccess(SELF, aBody));
return Promise.all(promises);
}
function doTest(body, callback) {
manager.addEventListener("received", function onReceived(event) {
event.target.removeEventListener(event.type, arguments.callee);
let message = event.message;
is(message.body, body, "message.body");
window.setTimeout(callback, 0);
});
let request = manager.send(SELF, body);
request.onerror = function onerror() {
ok(false, "failed to send message '" + body + "' to '" + SELF + "'");
};
}
repeat(doTest, [
const TEST_DATA = [
// Random alphanumeric string of 16 characters.
randomString16(),
// Long long text message for multipart messages.
@ -75,4 +54,18 @@ repeat(doTest, [
// 2) problem in decoding strings encoded with GSM 7Bit Alphabets and
// containing characters on extension tables.
"\u20ac****",
], cleanUp);
];
startTestBase(function testCaseMain() {
return ensureMobileMessage()
.then(function() {
let promise = Promise.resolve();
for (let i = 0; i < TEST_DATA.length; i++) {
let text = TEST_DATA[i];
promise = promise.then(() => test(text));
}
return promise;
});
});

Просмотреть файл

@ -2,193 +2,118 @@
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = 'head.js';
SpecialPowers.addPermission("sms", true, document);
SpecialPowers.setBoolPref("dom.sms.enabled", true);
let manager = window.navigator.mozMobileMessage;
let numberMsgs = 10;
let smsList = new Array();
function verifyInitialState() {
log("Verifying initial state.");
ok(manager instanceof MozMobileMessageManager,
"manager is instance of " + manager.constructor);
// Ensure test is starting clean with no existing sms messages
deleteAllMsgs(simulateIncomingSms);
}
function deleteAllMsgs(nextFunction) {
let msgList = new Array();
let filter = new MozSmsFilter;
let cursor = manager.getMessages(filter, false);
ok(cursor instanceof DOMCursor,
"cursor is instanceof " + cursor.constructor);
cursor.onsuccess = function(event) {
// Check if message was found
if (cursor.result) {
msgList.push(cursor.result.id);
// Now get next message in the list
cursor.continue();
} else {
// No (more) messages found
if (msgList.length) {
log("Found " + msgList.length + " SMS messages to delete.");
deleteMsgs(msgList, nextFunction);
} else {
log("No SMS messages found.");
nextFunction();
}
}
};
cursor.onerror = function(event) {
log("Received 'onerror' event.");
ok(event.target.error, "domerror obj");
log("manager.getMessages error: " + event.target.error.name);
ok(false,"Could not get SMS messages");
cleanUp();
};
}
function deleteMsgs(msgList, nextFunction) {
let smsId = msgList.shift();
log("Deleting SMS (id: " + smsId + ").");
let request = manager.delete(smsId);
ok(request instanceof DOMRequest,
"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 (msgList.length) {
deleteMsgs(msgList, nextFunction);
} else {
log("Finished deleting SMS messages.");
nextFunction();
}
} else {
log("SMS delete failed.");
ok(false,"manager.delete request returned false");
cleanUp();
}
};
request.onerror = function(event) {
log("Received 'onerror' smsrequest event.");
ok(event.target.error, "domerror obj");
ok(false, "manager.delete request returned unexpected error: "
+ event.target.error.name );
cleanUp();
};
}
const NUMBER_OF_MESSAGES = 10;
const REMOTE = "5552229797";
function simulateIncomingSms() {
let text = "Incoming SMS number " + (smsList.length + 1);
let remoteNumber = "5552229797";
let promise = Promise.resolve();
let messages = [];
log("Simulating incoming SMS number " + (smsList.length + 1) + " of "
+ numberMsgs + ".");
// 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
manager.onreceived = function onreceived(event) {
log("Received 'onreceived' sms event.");
let incomingSms = event.message;
log("Received SMS (id: " + incomingSms.id + ").");
smsList.push(incomingSms);
// Wait for emulator to catch up before continuing
waitFor(nextRep,function() {
return(rcvdEmulatorCallback);
});
};
function nextRep() {
if (smsList.length < numberMsgs) {
simulateIncomingSms();
} else {
// Now test the filter
getMsgs();
for (let i = 0; i < NUMBER_OF_MESSAGES; i++) {
let text = "Incoming SMS number " + i;
promise = promise.then(() => sendTextSmsToEmulatorAndWait(REMOTE, text))
.then(function(aMessage) {
messages.push(aMessage);
return messages;
});
}
return promise;
}
function getMsgs() {
var filter = new MozSmsFilter();
let foundSmsList = new Array();
function test(aStartDate, aEndDate, aExpectedMessages) {
let filter = new MozSmsFilter();
if (aStartDate) {
filter.startDate = aStartDate;
}
if (aEndDate) {
filter.endDate = aEndDate;
}
// Set filter for start date yesterday and end date tomorrow
let yesterday = new Date(Date.now() - 86400000); // 24 hours = 86400000 ms
let tomorrow = new Date(Date.now() + 86400000);
filter.startDate = yesterday;
filter.endDate = tomorrow;
return getMessages(filter, false)
.then(function(aFoundMessages) {
log(" Found " + aFoundMessages.length + " messages, expected " +
aExpectedMessages.length);
is(aFoundMessages.length, aExpectedMessages.length, "aFoundMessages.length");
});
}
log("Getting SMS messages with dates between " + yesterday + " and "
+ tomorrow +".");
let cursor = manager.getMessages(filter, false);
ok(cursor instanceof DOMCursor,
"cursor is instanceof " + cursor.constructor);
cursor.onsuccess = function(event) {
log("Received 'onsuccess' event.");
if (cursor.result) {
// Another message found
log("Got SMS (id: " + cursor.result.id + ").");
// Store found message
foundSmsList.push(cursor.result);
// Now get next message in the list
cursor.continue();
} else {
// No more messages; ensure correct number found
if (foundSmsList.length == smsList.length) {
log("SMS getMessages returned " + foundSmsList.length +
" messages as expected.");
verifyFoundMsgs(foundSmsList);
} else {
log("SMS getMessages returned " + foundSmsList.length +
" messages, but expected " + smsList.length + ".");
ok(false, "Incorrect number of messages returned by manager.getMessages");
deleteAllMsgs(cleanUp);
}
function reduceMessages(aMessages, aCompare) {
return aMessages.reduce(function(results, message) {
if (aCompare(message.timestamp)) {
results.push(message);
}
};
cursor.onerror = function(event) {
log("Received 'onerror' event.");
ok(event.target.error, "domerror obj");
log("manager.getMessages error: " + event.target.error.name);
ok(false,"Could not get SMS messages");
cleanUp();
};
return results;
}, []);
}
function verifyFoundMsgs(foundSmsList) {
for (var x = 0; x < foundSmsList.length; x++) {
is(foundSmsList[x].id, smsList[x].id, "id");
is(foundSmsList[x].timestamp, smsList[x].timestamp, "timestmap");
}
deleteAllMsgs(cleanUp);
}
startTestCommon(function testCaseMain() {
let startTime, endTime;
let allMessages;
function cleanUp() {
manager.onreceived = null;
SpecialPowers.removePermission("sms", document);
SpecialPowers.clearUserPref("dom.sms.enabled");
finish();
}
return simulateIncomingSms()
.then((aMessages) => {
allMessages = aMessages;
startTime = aMessages[0].timestamp;
endTime = aMessages[NUMBER_OF_MESSAGES - 1].timestamp;
log("startTime: " + startTime + ", endTime: " + endTime);
})
// Start the test
verifyInitialState();
// Should return all messages.
//
.then(() => log("Testing [startTime, )"))
.then(() => test(new Date(startTime), null, allMessages))
.then(() => log("Testing (, endTime]"))
.then(() => test(null, new Date(endTime), allMessages))
.then(() => log("Testing [startTime, endTime]"))
.then(() => test(new Date(startTime), new Date(endTime), allMessages))
// Should return only messages with timestamp <= startTime.
//
.then(() => log("Testing [, startTime)"))
.then(() => test(null, new Date(startTime),
reduceMessages(allMessages,
(function(a, b) {
return b <= a;
}).bind(null, startTime))))
// Should return only messages with timestamp <= startTime + 1.
//
.then(() => log("Testing [, startTime + 1)"))
.then(() => test(null, new Date(startTime + 1),
reduceMessages(allMessages,
(function(a, b) {
return b <= a;
}).bind(null, startTime + 1))))
// Should return only messages with timestamp >= endTime.
//
.then(() => log("Testing [endTime, )"))
.then(() => test(new Date(endTime), null,
reduceMessages(allMessages,
(function(a, b) {
return b >= a;
}).bind(null, endTime))))
// Should return only messages with timestamp >= endTime - 1.
//
.then(() => log("Testing [endTime - 1, )"))
.then(() => test(new Date(endTime - 1), null,
reduceMessages(allMessages,
(function(a, b) {
return b >= a;
}).bind(null, endTime - 1))))
// Should return none.
//
.then(() => log("Testing [endTime + 1, )"))
.then(() => test(new Date(endTime + 1), null, []))
.then(() => log("Testing [endTime + 1, endTime + 86400000]"))
.then(() => test(new Date(endTime + 1), new Date(endTime + 86400000), []))
.then(() => log("Testing (, startTime - 1]"))
.then(() => test(null, new Date(startTime - 1), []))
.then(() => log("Testing [startTime - 86400000, startTime - 1]"))
.then(() => test(new Date(startTime - 86400000), new Date(startTime - 1), []));
});

Просмотреть файл

@ -1,176 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
SpecialPowers.addPermission("sms", true, document);
SpecialPowers.setBoolPref("dom.sms.enabled", true);
let manager = window.navigator.mozMobileMessage;
let numberMsgs = 10;
let smsList = new Array();
function verifyInitialState() {
log("Verifying initial state.");
ok(manager instanceof MozMobileMessageManager,
"manager is instance of " + manager.constructor);
// Ensure test is starting clean with no existing sms messages
deleteAllMsgs(simulateIncomingSms);
}
function deleteAllMsgs(nextFunction) {
let msgList = new Array();
let filter = new MozSmsFilter;
let cursor = manager.getMessages(filter, false);
ok(cursor instanceof DOMCursor,
"cursor is instanceof " + cursor.constructor);
cursor.onsuccess = function(event) {
// Check if message was found
if (cursor.result) {
msgList.push(cursor.result.id);
// Now get next message in the list
cursor.continue();
} else {
// No (more) messages found
if (msgList.length) {
log("Found " + msgList.length + " SMS messages to delete.");
deleteMsgs(msgList, nextFunction);
} else {
log("No SMS messages found.");
nextFunction();
}
}
};
cursor.onerror = function(event) {
log("Received 'onerror' event.");
ok(event.target.error, "domerror obj");
log("manager.getMessages error: " + event.target.error.name);
ok(false,"Could not get SMS messages");
cleanUp();
};
}
function deleteMsgs(msgList, nextFunction) {
let smsId = msgList.shift();
log("Deleting SMS (id: " + smsId + ").");
let request = manager.delete(smsId);
ok(request instanceof DOMRequest,
"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 (msgList.length) {
deleteMsgs(msgList, nextFunction);
} else {
log("Finished deleting SMS messages.");
nextFunction();
}
} else {
log("SMS delete failed.");
ok(false,"manager.delete request returned false");
cleanUp();
}
};
request.onerror = function(event) {
log("Received 'onerror' smsrequest event.");
ok(event.target.error, "domerror obj");
ok(false, "manager.delete request returned unexpected error: "
+ event.target.error.name );
cleanUp();
};
}
function simulateIncomingSms() {
let text = "Incoming SMS number " + (smsList.length + 1);
let remoteNumber = "5552229797";
log("Simulating incoming SMS number " + (smsList.length + 1) + " of "
+ numberMsgs + ".");
// 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
manager.onreceived = function onreceived(event) {
log("Received 'onreceived' sms event.");
let incomingSms = event.message;
log("Received SMS (id: " + incomingSms.id + ").");
smsList.push(incomingSms);
// Wait for emulator to catch up before continuing
waitFor(nextRep,function() {
return(rcvdEmulatorCallback);
});
};
function nextRep() {
if (smsList.length < numberMsgs) {
simulateIncomingSms();
} else {
// Now test the filter
getMsgs();
}
}
function getMsgs() {
var filter = new MozSmsFilter();
let foundSmsList = new Array();
// Set filter for start date 2 days ago and end date yesterday (so 0 found)
let yesterday = new Date(Date.now() - 86400000); // 24 hours = 86400000 ms
let twoDaysAgo = new Date(Date.now() - 172800000);
filter.startDate = twoDaysAgo;
filter.endDate = yesterday;
log("Getting SMS messages with dates between " + twoDaysAgo + " and "
+ yesterday +".");
let cursor = manager.getMessages(filter, false);
ok(cursor instanceof DOMCursor,
"cursor is instanceof " + cursor.constructor);
cursor.onsuccess = function(event) {
log("Received 'onsuccess' event.");
if (cursor.result) {
// Another message found
log("Got SMS (id: " + cursor.result.id + ").");
log("SMS getMessages returned a message but should not have.");
ok(false, "SMS date filter did not work");
} else {
// No messages found as expected
log("SMS getMessages returned zero messages as expected.");
}
deleteAllMsgs(cleanUp);
};
cursor.onerror = function(event) {
log("Received 'onerror' event.");
ok(event.target.error, "domerror obj");
log("manager.getMessages error: " + event.target.error.name);
ok(false,"Could not get SMS messages");
cleanUp();
};
}
function cleanUp() {
manager.onreceived = null;
SpecialPowers.removePermission("sms", document);
SpecialPowers.clearUserPref("dom.sms.enabled");
finish();
}
// Start the test
verifyInitialState();

Просмотреть файл

@ -2,227 +2,30 @@
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
SpecialPowers.setBoolPref("dom.sms.enabled", true);
SpecialPowers.setBoolPref("dom.sms.requestStatusReport", true);
SpecialPowers.addPermission("sms", true, document);
MARIONETTE_HEAD_JS = 'head.js';
const REMOTE = "5559997777"; // the remote number
const EMULATOR = "15555215554"; // the emulator's number
let manager = window.navigator.mozMobileMessage;
let inText = "Incoming SMS message. Mozilla Firefox OS!";
let outText = "Outgoing SMS message. Mozilla Firefox OS!";
let gotSmsOnsent = false;
let gotReqOnsuccess = false;
let inSmsId = 0;
let outSmsId = 0;
let inThreadId = 0;
let outThreadId = 0;
let inSmsTimeStamp;
let inSmsSentTimeStamp;
let outSmsTimeStamp;
let outSmsSentTimeStamp;
const IN_TEXT = "Incoming SMS message. Mozilla Firefox OS!";
const OUT_TEXT = "Outgoing SMS message. Mozilla Firefox OS!";
function verifyInitialState() {
log("Verifying initial state.");
ok(manager instanceof MozMobileMessageManager,
"manager is instance of " + manager.constructor);
simulateIncomingSms();
}
startTestBase(function testCaseMain() {
let incomingSms, outgoingSms;
function simulateIncomingSms() {
log("Simulating incoming SMS.");
return ensureMobileMessage()
manager.onreceived = function onreceived(event) {
log("Received 'onreceived' event.");
let incomingSms = event.message;
ok(incomingSms, "incoming sms");
ok(incomingSms.id, "sms id");
inSmsId = incomingSms.id;
log("Received SMS (id: " + inSmsId + ").");
ok(incomingSms.threadId, "thread id");
inThreadId = incomingSms.threadId;
is(incomingSms.body, inText, "msg body");
is(incomingSms.delivery, "received", "delivery");
is(incomingSms.deliveryStatus, "success", "deliveryStatus");
is(incomingSms.read, false, "read");
is(incomingSms.receiver, EMULATOR, "receiver");
is(incomingSms.sender, REMOTE, "sender");
is(incomingSms.messageClass, "normal", "messageClass");
inSmsTimeStamp = incomingSms.timestamp;
inSmsSentTimeStamp = incomingSms.sentTimestamp;
sendSms();
};
// Simulate incoming sms sent from remoteNumber to our emulator
runEmulatorCmd("sms send " + REMOTE + " " + inText, function(result) {
is(result[0], "OK", "emulator output");
});
}
.then(() => sendTextSmsToEmulatorAndWait(REMOTE, IN_TEXT))
.then((aMessage) => { incomingSms = aMessage; })
function sendSms() {
log("Sending an SMS.");
manager.onsent = function(event) {
log("Received 'onsent' event.");
gotSmsOnsent = true;
let sentSms = event.message;
ok(sentSms, "outgoing sms");
ok(sentSms.id, "sms id");
outSmsId = sentSms.id;
log("Sent SMS (id: " + outSmsId + ").");
ok(sentSms.threadId, "thread id");
outThreadId = sentSms.threadId;
is(sentSms.body, outText, "msg body");
is(sentSms.delivery, "sent", "delivery");
is(sentSms.deliveryStatus, "pending", "deliveryStatus");
is(sentSms.read, true, "read");
is(sentSms.receiver, REMOTE, "receiver");
is(sentSms.sender, EMULATOR, "sender");
is(sentSms.messageClass, "normal", "messageClass");
outSmsTimeStamp = sentSms.timestamp;
outSmsSentTimeStamp = sentSms.sentTimestamp;
is(sentSms.deliveryTimestamp, 0, "deliveryTimestamp is 0");
.then(() => sendSmsWithSuccess(REMOTE, OUT_TEXT))
.then((aMessage) => { outgoingSms = aMessage; })
if (gotSmsOnsent && gotReqOnsuccess) { getReceivedSms(); }
};
.then(() => getMessage(incomingSms.id))
.then((aMessage) => compareSmsMessage(aMessage, incomingSms))
let requestRet = manager.send(REMOTE, outText);
ok(requestRet, "smsrequest obj returned");
.then(() => getMessage(outgoingSms.id))
.then((aMessage) => compareSmsMessage(aMessage, outgoingSms))
requestRet.onsuccess = function(event) {
log("Received 'onsuccess' smsrequest event.");
gotReqOnsuccess = true;
if(event.target.result){
if (gotSmsOnsent && gotReqOnsuccess) { getReceivedSms(); }
} else {
log("smsrequest returned false for manager.send");
ok(false,"SMS send failed");
cleanUp();
}
};
requestRet.onerror = function(event) {
log("Received 'onerror' smsrequest event.");
ok(event.target.error, "domerror obj");
ok(false, "manager.send request returned unexpected error: "
+ event.target.error.name );
cleanUp();
};
}
function getReceivedSms() {
log("Getting the received SMS message (id: " + inSmsId + ").");
let requestRet = manager.getMessage(inSmsId);
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, inSmsId, "SMS id matches");
log("Got SMS (id: " + foundSms.id + ").");
is(foundSms.threadId, inThreadId, "thread id matches");
is(foundSms.body, inText, "SMS msg text matches");
is(foundSms.delivery, "received", "delivery");
is(foundSms.deliveryStatus, "success", "deliveryStatus");
is(foundSms.read, false, "read");
is(foundSms.receiver, EMULATOR, "receiver");
is(foundSms.sender, REMOTE, "sender");
is(foundSms.messageClass, "normal", "messageClass");
is(foundSms.timestamp, inSmsTimeStamp, "timestamp matches");
is(foundSms.sentTimestamp, inSmsSentTimeStamp, "sentTimestamp matches");
getSentSms();
};
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: " + inSmsId + ") but should have.");
ok(false,"Could not get received SMS");
cleanUp();
};
}
function getSentSms() {
log("Getting the sent SMS message (id: " + outSmsId + ").");
let requestRet = manager.getMessage(outSmsId);
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, outSmsId, "SMS id matches");
log("Got SMS (id: " + foundSms.id + ").");
is(foundSms.threadId, outThreadId, "thread id matches");
is(foundSms.body, outText, "SMS msg text matches");
is(foundSms.delivery, "sent", "delivery");
is(foundSms.deliveryStatus, "pending", "deliveryStatus");
is(foundSms.read, true, "read");
is(foundSms.receiver, REMOTE, "receiver");
is(foundSms.sender, EMULATOR, "sender");
is(foundSms.messageClass, "normal", "messageClass");
is(foundSms.timestamp, outSmsTimeStamp, "timestamp matches");
is(foundSms.sentTimestamp, outSmsSentTimeStamp, "sentTimestamp matches");
deleteMsgs();
};
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 sent SMS");
cleanUp();
};
}
function deleteMsgs() {
log("Deleting SMS (id: " + inSmsId + ").");
let requestRet = manager.delete(inSmsId);
ok(requestRet,"smsrequest obj returned");
requestRet.onsuccess = function(event) {
log("Received 'onsuccess' smsrequest event.");
if(event.target.result){
log("Deleting SMS (id: " + outSmsId + ").");
let nextReqRet = manager.delete(outSmsId);
ok(nextReqRet,"smsrequest obj returned");
nextReqRet.onsuccess = function(event) {
log("Received 'onsuccess' smsrequest event.");
if(event.target.result) {
cleanUp();
} else {
log("smsrequest returned false for manager.delete");
ok(false,"SMS delete failed");
}
};
} else {
log("smsrequest returned false for manager.delete");
ok(false,"SMS delete failed");
}
};
requestRet.onerror = function(event) {
log("Received 'onerror' smsrequest event.");
ok(event.target.error, "domerror obj");
ok(false, "manager.delete request returned unexpected error: "
+ event.target.error.name );
cleanUp();
};
}
function cleanUp() {
manager.onreceived = null;
SpecialPowers.removePermission("sms", document);
SpecialPowers.clearUserPref("dom.sms.enabled");
SpecialPowers.clearUserPref("dom.sms.requestStatusReport");
finish();
}
// Start the test
verifyInitialState();
.then(deleteAllMessages);
});

Просмотреть файл

@ -2,119 +2,49 @@
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = 'head.js';
SpecialPowers.setBoolPref("dom.sms.enabled", true);
SpecialPowers.addPermission("sms", true, document);
const TEXT = "Incoming SMS message. Mozilla Firefox OS!";
const REMOTE = "5559997777";
let manager = window.navigator.mozMobileMessage;
let myNumber = "15555215554";
let inText = "Incoming SMS message. Mozilla Firefox OS!";
let remoteNumber = "5559997777";
let inSmsId = 0;
function getNonExistentMsg(aId) {
log("Attempting to get non-existent message (id: " + aId + ").");
function verifyInitialState() {
log("Verifying initial state.");
ok(manager instanceof MozMobileMessageManager,
"manager is instance of " + manager.constructor);
simulateIncomingSms();
return getMessage(aId)
.then(function onresolve() {
ok(false, "request succeeded when tried to get non-existent sms");
}, function onreject(aEvent) {
let error = aEvent.target.error;
ok(error, "DOMError");
is(error.name, "NotFoundError", "error.name");
});
}
function simulateIncomingSms() {
log("Simulating incoming SMS.");
function getMsgInvalidId(aId) {
log("Attempting to get sms with invalid id (id: " + aId + ").");
manager.onreceived = function onreceived(event) {
log("Received 'onreceived' event.");
let incomingSms = event.message;
ok(incomingSms, "incoming sms");
ok(incomingSms.id, "sms id");
inSmsId = incomingSms.id;
log("Received SMS (id: " + inSmsId + ").");
is(incomingSms.body, inText, "msg body");
is(incomingSms.delivery, "received", "delivery");
getNonExistentMsg();
};
// Simulate incoming sms sent from remoteNumber to our emulator
runEmulatorCmd("sms send " + remoteNumber + " " + inText, function(result) {
is(result[0], "OK", "emulator output");
});
return getMessage(aId)
.then(function onresolve() {
ok(false, "request succeeded when tried to get message with " +
"invalid id (id: " + aId + ").");
}, function onreject(aEvent) {
let error = aEvent.target.error;
ok(error, "DOMError");
is(error.name, "NotFoundError", "error.name");
});
}
function getNonExistentMsg() {
let msgIdNoExist = inSmsId + 1;
log("Attempting to get non-existent message (id: " + msgIdNoExist + ").");
let requestRet = manager.getMessage(msgIdNoExist);
ok(requestRet, "smsrequest obj returned");
startTestBase(function testCaseMain() {
let lastMessageId;
requestRet.onsuccess = function(event) {
log("Received 'onsuccess' smsrequest event.");
ok(event.target.result, "smsrequest event.target.result");
let foundSms = event.target.result;
log("Got SMS (id: " + foundSms.id + ") but should not have.");
ok(false, "Smsrequest successful when tried to get non-existent sms");
getMsgInvalidId();
};
return ensureMobileMessage()
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: " + msgIdNoExist + ") as expected.");
getMsgInvalidId();
};
}
.then(() => sendTextSmsToEmulatorAndWait(REMOTE, TEXT))
.then((aMessage) => { lastMessageId = aMessage.id; })
function getMsgInvalidId() {
invalidId = -1;
log("Attempting to get sms with invalid id (id: " + invalidId + ").");
let requestRet = manager.getMessage(invalidId);
ok(requestRet, "smsrequest obj returned");
.then(() => getNonExistentMsg(lastMessageId + 1))
.then(() => getMsgInvalidId(-1))
.then(() => getMsgInvalidId(0))
requestRet.onsuccess = function(event) {
log("Received 'onsuccess' smsrequest event.");
ok(event.target.result, "smsrequest event.target.result");
let foundSms = event.target.result;
log("Got SMS (id: " + foundSms.id + ") but should not have.");
ok(false, "Smsrequest successful when tried to get message with " +
"invalid id (id: " + invalidId + ").");
deleteMsg();
};
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: -1) as expected.");
deleteMsg();
};
}
function deleteMsg() {
log("Deleting SMS (id: " + inSmsId + ").");
let requestRet = manager.delete(inSmsId);
ok(requestRet,"smsrequest obj returned");
requestRet.onsuccess = function(event) {
log("Received 'onsuccess' smsrequest event.");
if(event.target.result){
cleanUp();
}
};
requestRet.onerror = function(event) {
log("Received 'onerror' smsrequest event.");
ok(event.target.error, "domerror obj");
ok(false, "manager.delete request returned unexpected error: "
+ event.target.error.name );
cleanUp();
};
}
function cleanUp() {
manager.onreceived = null;
SpecialPowers.removePermission("sms", document);
SpecialPowers.setBoolPref("dom.sms.enabled", false);
finish();
}
// Start the test
verifyInitialState();
.then(deleteAllMessages);
});

Просмотреть файл

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

Просмотреть файл

@ -2,50 +2,41 @@
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
SpecialPowers.setBoolPref("dom.sms.enabled", true);
SpecialPowers.addPermission("sms", true, document);
MARIONETTE_HEAD_JS = 'head.js';
const SENDER = "5555552368"; // the remote number
const RECEIVER = "15555215554"; // the emulator's number
let manager = window.navigator.mozMobileMessage;
ok(manager instanceof MozMobileMessageManager,
"manager is instance of " + manager.constructor);
const SHORT_BODY = "Hello SMS world!";
const LONG_BODY = new Array(17).join(SHORT_BODY);
ok(LONG_BODY.length > 160, "LONG_BODY.length");
let body = "Hello SMS world!";
function checkMessage(aMessage, aBody) {
ok(aMessage instanceof MozSmsMessage, "Message is instanceof MozSmsMessage");
let completed = false;
runEmulatorCmd("sms send " + SENDER + " " + body, function(result) {
log("Sent fake SMS: " + result);
is(result[0], "OK", "Emulator command result");
completed = true;
});
manager.onreceived = function onreceived(event) {
log("Received an SMS!");
let message = event.message;
ok(message instanceof MozSmsMessage, "Message is instanceof MozSmsMessage");
ok(message.threadId, "thread id");
is(message.delivery, "received", "Message delivery");
is(message.deliveryStatus, "success", "Delivery status");
is(message.sender, SENDER, "Message sender");
is(message.receiver, RECEIVER, "Message receiver");
is(message.body, body, "Message body");
is(message.messageClass, "normal", "Message class");
is(message.deliveryTimestamp, 0, "deliveryTimestamp is 0");
cleanUp();
is(aMessage.type, "sms", "message.type");
ok(aMessage.id, "message.id");
ok(aMessage.threadId, "message.threadId");
ok(aMessage.iccId, "message.iccId");
is(aMessage.delivery, "received", "message.delivery");
is(aMessage.deliveryStatus, "success", "message.deliveryStatus");
is(aMessage.sender, SENDER, "message.sender");
is(aMessage.receiver, RECEIVER, "message.receiver");
is(aMessage.body, aBody, "message.body");
is(aMessage.messageClass, "normal", "message.messageClass");
ok(aMessage.timestamp, "message.timestamp");
is(aMessage.deliveryTimestamp, 0, "message.deliveryTimestamp");
ok(aMessage.sentTimestamp, "message.sentTimestamp");
is(aMessage.read, false, "message.read");
};
function cleanUp() {
if (!completed) {
window.setTimeout(cleanUp, 100);
return;
}
SpecialPowers.removePermission("sms", document);
finish();
function test(aBody) {
return sendTextSmsToEmulatorAndWait(SENDER, aBody)
.then((aMessage) => checkMessage(aMessage, aBody));
}
startTestBase(function testCaseMain() {
return ensureMobileMessage()
.then(() => test(SHORT_BODY))
.then(() => test(LONG_BODY));
});

Просмотреть файл

@ -1,115 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
SpecialPowers.setBoolPref("dom.sms.enabled", true);
SpecialPowers.addPermission("sms", true, document);
const SENDER = "5555552368"; // the remote number
const RECEIVER = "15555215554"; // the emulator's number
let manager = window.navigator.mozMobileMessage;
function verifyInitialState() {
log("Verifying initial state.");
ok(manager instanceof MozMobileMessageManager,
"manager is instance of " + manager.constructor);
simulateIncomingSms();
}
function simulateIncomingSms() {
let msgText = "";
log("Simulating incoming SMS.");
// Have message text > max SMS size (160 char) so will be a multi-part SMS
for (var x = 1; x <= 24; x++) {
msgText += 'FirefoxOS ';
}
manager.onreceived = function onreceived(event) {
log("Received 'onreceived' event.");
let incomingSms = event.message;
ok(incomingSms, "incoming sms");
ok(incomingSms.id, "sms id");
log("Received SMS (id: " + incomingSms.id + ").");
ok(incomingSms.threadId, "thread id");
is(incomingSms.body, msgText, "msg body");
is(incomingSms.delivery, "received", "delivery");
is(incomingSms.read, false, "read");
is(incomingSms.receiver, RECEIVER, "receiver");
is(incomingSms.sender, SENDER, "sender");
is(incomingSms.deliveryTimestamp, 0, "deliveryTimestamp is 0");
verifySmsExists(incomingSms);
};
runEmulatorCmd("sms send " + SENDER + " " + msgText, function(result) {
is(result[0], "OK", "emulator output");
});
}
function verifySmsExists(incomingSms) {
log("Getting SMS (id: " + incomingSms.id + ").");
let requestRet = manager.getMessage(incomingSms.id);
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, incomingSms.id, "found SMS id matches");
is(foundSms.threadId, incomingSms.threadId, "found SMS thread id matches");
is(foundSms.body, incomingSms.body, "found SMS msg text matches");
is(foundSms.delivery, "received", "delivery");
is(foundSms.read, false, "read");
is(foundSms.receiver, RECEIVER, "receiver");
is(foundSms.sender, SENDER, "sender");
log("Got SMS (id: " + foundSms.id + ") as expected.");
deleteSms(incomingSms);
};
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: " + incomingSms.id + ") but should have.");
ok(false,"SMS was not found");
cleanUp();
};
}
function deleteSms(smsMsgObj){
log("Deleting SMS (id: " + smsMsgObj.id + ") using smsmsg obj parameter.");
let requestRet = manager.delete(smsMsgObj);
ok(requestRet,"smsrequest obj returned");
requestRet.onsuccess = function(event) {
log("Received 'onsuccess' smsrequest event.");
if(event.target.result){
cleanUp();
} else {
log("smsrequest returned false for manager.delete");
ok(false,"SMS delete failed");
cleanUp();
}
};
requestRet.onerror = function(event) {
log("Received 'onerror' smsrequest event.");
ok(event.target.error, "domerror obj");
ok(false, "manager.delete request returned unexpected error: "
+ event.target.error.name );
cleanUp();
};
}
function cleanUp() {
manager.onreceived = null;
SpecialPowers.removePermission("sms", document);
SpecialPowers.clearUserPref("dom.sms.enabled");
finish();
}
// Start the test
verifyInitialState();

Просмотреть файл

@ -2,18 +2,10 @@
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
SpecialPowers.setBoolPref("dom.sms.enabled", true);
SpecialPowers.setBoolPref("dom.sms.strict7BitEncoding", false);
SpecialPowers.setBoolPref("dom.sms.requestStatusReport", true);
SpecialPowers.addPermission("sms", true, document);
MARIONETTE_HEAD_JS = 'head.js';
const SENDER = "15555215554"; // the emulator's number
let manager = window.navigator.mozMobileMessage;
ok(manager instanceof MozMobileMessageManager,
"manager is instance of " + manager.constructor);
const SHORT_BODY = "Hello SMS world!";
const LONG_BODY = "Let me not to the marriage of true minds\n"
+ "Admit impediments. Love is not love\n"
@ -35,8 +27,10 @@ function checkMessage(message, delivery, body) {
ok(message instanceof MozSmsMessage,
"message is instanceof " + message.constructor);
is(message.type, "sms", "message.type");
ok(message.id, "message.id");
ok(message.threadId, "message.threadId");
ok(message.iccId, "message.iccId");
is(message.delivery, delivery, "message.delivery");
is(message.deliveryStatus, "pending", "message.deliveryStatus");
is(message.sender, SENDER, "message.sender");
@ -56,148 +50,105 @@ function checkMessage(message, delivery, body) {
}
}
function doSendMessageAndCheckSuccess(receivers, body, callback) {
let options = {};
function isReceiverMatch(aReceiver, aEvent) {
// Bug 838542: following check throws an exception and fails this case.
// ok(event instanceof MozSmsEvent,
// "event is instanceof " + event.constructor)
ok(aEvent, "sending event is valid");
let message = aEvent.message;
return message.receiver === aReceiver;
}
function doSingleRequest(aRequest, aReceiver, aBody, aNow) {
let sendingGot = false, sentGot = false, successGot = false;
let sendingMessage;
let promises = [];
promises.push(waitForManagerEvent("sending",
isReceiverMatch.bind(null, aReceiver))
.then(function(aEvent) {
log(" onsending event for '" + aReceiver + "' received.");
sendingMessage = aEvent.message;
checkMessage(sendingMessage, "sending", aBody);
// timestamp is in seconds.
ok(Math.floor(sendingMessage.timestamp / 1000) >= Math.floor(aNow / 1000),
"sent timestamp is valid");
ok(!sendingGot, "sending event should not have been triggered");
ok(!sentGot, "sent event should not have been triggered");
ok(!successGot, "success event should not have been triggered");
sendingGot = true;
}));
promises.push(waitForManagerEvent("sent",
isReceiverMatch.bind(null, aReceiver))
.then(function(aEvent) {
log(" onsent event for '" + aReceiver + "' received.");
let message = aEvent.message;
checkMessage(message, "sent", aBody);
// Should be mostly identical to sendingMessage.
is(message.id, sendingMessage.id, "message.id");
is(message.receiver, sendingMessage.receiver, "message.receiver");
is(message.body, sendingMessage.body, "message.body");
is(message.timestamp, sendingMessage.timestamp, "message.timestamp");
ok(sendingGot, "sending event should have been triggered");
ok(!sentGot, "sent event should not have been triggered");
ok(successGot, "success event should have been triggered");
sentGot = true;
}));
promises.push(wrapDomRequestAsPromise(aRequest)
.then(function(aEvent) {
log(" onsuccess event for '" + aReceiver + "' received.");
let message = aEvent.target.result;
checkMessage(message, "sent", aBody);
// Should be mostly identical to sendingMessage.
is(message.id, sendingMessage.id, "message.id");
is(message.receiver, sendingMessage.receiver, "message.receiver");
is(message.body, sendingMessage.body, "message.body");
is(message.timestamp, sendingMessage.timestamp, "message.timestamp");
ok(sendingGot, "sending event should have been triggered");
ok(!sentGot, "sent event should not have been triggered");
ok(!successGot, "success event should not have been triggered");
successGot = true;
}));
return Promise.all(promises);
}
function doSendMessageAndCheckSuccess(receivers, body) {
log("Testing sending message(s) to receiver(s): " + JSON.stringify(receivers));
let now = Date.now();
function done() {
let rs = Array.isArray(receivers) ? receivers : [receivers];
// Make sure we've send a message to each distinct receiver.
for (let i = 0; i < rs.length; i++) {
let opt = options[rs[i]];
if (!(opt && opt.onSentCalled && opt.onRequestSuccessCalled)) {
return;
}
}
manager.removeEventListener("sending", onSmsSending);
manager.removeEventListener("sent", onSmsSent);
log("Done!");
window.setTimeout(callback, 0);
}
function checkSentMessage(message, mark) {
checkMessage(message, "sent", body);
let receiver = message && message.receiver;
if (!receiver) {
ok(false, "message.receiver should be valid.");
return;
}
let opt = options[receiver];
if (!opt) {
ok(false, "onsent should be called after onsending.");
return;
}
let saved = opt.saved;
is(message.id, saved.id, "message.id");
is(message.receiver, saved.receiver, "message.receiver");
is(message.body, saved.body, "message.body");
is(message.timestamp, saved.timestamp, "message.timestamp");
opt[mark] = true;
done();
}
function onRequestSuccess(event) {
log("request.onsuccess event received.");
ok(event.target instanceof DOMRequest,
"event.target is instanceof " + event.target.constructor);
event.target.removeEventListener("success", onRequestSuccess);
checkSentMessage(event.target.result, "onRequestSuccessCalled");
}
function onSmsSending(event) {
log("onsending event received.");
// Bug 838542: following check throws an exception and fails this case.
// ok(event instanceof MozSmsEvent,
// "event is instanceof " + event.constructor)
ok(event, "event is valid");
let message = event.message;
checkMessage(message, "sending", body);
// timestamp is in seconds.
ok(Math.floor(message.timestamp / 1000) >= Math.floor(now / 1000),
"sent timestamp is valid");
let receiver = message.receiver;
if (!receiver) {
return;
}
if (options[receiver]) {
ok(false, "duplicated onsending events found!");
return;
}
options[receiver] = {
saved: message,
onSentCalled: false,
onRequestSuccessCalled: false
};
}
function onSmsSent(event) {
log("onsent event received.");
// Bug 838542: following check throws an exception and fails this case.
// ok(event instanceof MozSmsEvent,
// "event is instanceof " + event.constructor)
ok(event, "event is valid");
checkSentMessage(event.message, "onSentCalled");
}
manager.addEventListener("sending", onSmsSending);
manager.addEventListener("sent", onSmsSent);
let result = manager.send(receivers, body);
is(Array.isArray(result), Array.isArray(receivers),
"send() returns an array of requests if receivers is an array");
if (Array.isArray(receivers)) {
is(result.length, receivers.length, "returned array length");
} else {
result = [result];
return Promise.all(result.map(function(request, index) {
return doSingleRequest(request, receivers[index], body, now);
}));
}
for (let i = 0; i < result.length; i++) {
let request = result[i];
ok(request instanceof DOMRequest,
"request is instanceof " + request.constructor);
request.addEventListener("success", onRequestSuccess);
}
return doSingleRequest(result, receivers, body, now);
}
function testSendMessage() {
log("Testing sending message to one receiver:");
doSendMessageAndCheckSuccess("1", SHORT_BODY, testSendMultipartMessage);
}
function testSendMultipartMessage() {
log("Testing sending message to one receiver:");
doSendMessageAndCheckSuccess("1", LONG_BODY,
testSendMessageToMultipleRecipients);
}
function testSendMessageToMultipleRecipients() {
log("Testing sending message to multiple receivers:");
// TODO: bug 788928 - add test cases for ondelivered event.
doSendMessageAndCheckSuccess(["1", "2"], SHORT_BODY, cleanUp);
}
function cleanUp() {
SpecialPowers.removePermission("sms", document);
SpecialPowers.clearUserPref("dom.sms.enabled");
SpecialPowers.clearUserPref("dom.sms.strict7BitEncoding");
SpecialPowers.clearUserPref("dom.sms.requestStatusReport");
finish();
}
testSendMessage();
startTestBase(function testCaseMain() {
return ensureMobileMessage()
.then(() => pushPrefEnv({ set: [['dom.sms.strict7BitEncoding', false],
['dom.sms.requestStatusReport', true]] }))
.then(() => doSendMessageAndCheckSuccess("1", SHORT_BODY))
.then(() => doSendMessageAndCheckSuccess("1", LONG_BODY))
.then(() => doSendMessageAndCheckSuccess(["1", "2"], SHORT_BODY));
});