|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 * http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 MARIONETTE_TIMEOUT = 60000; |
|
5 |
|
6 SpecialPowers.setBoolPref("dom.sms.enabled", true); |
|
7 SpecialPowers.addPermission("sms", true, document); |
|
8 |
|
9 const SENDER = "5555552368"; // the remote number |
|
10 const RECEIVER = "15555215554"; // the emulator's number |
|
11 |
|
12 let manager = window.navigator.mozMobileMessage; |
|
13 let MSG_TEXT = "Mozilla Firefox OS!"; |
|
14 let SMS_NUMBER = 100; |
|
15 |
|
16 let SmsList = []; |
|
17 let checkDone = true; |
|
18 let emulatorReady = true; |
|
19 |
|
20 let pendingEmulatorCmdCount = 0; |
|
21 function sendSmsToEmulator(from, text) { |
|
22 ++pendingEmulatorCmdCount; |
|
23 |
|
24 let cmd = "sms send " + from + " " + text; |
|
25 runEmulatorCmd(cmd, function(result) { |
|
26 --pendingEmulatorCmdCount; |
|
27 |
|
28 is(result[0], "OK", "Emulator response"); |
|
29 }); |
|
30 } |
|
31 |
|
32 let tasks = { |
|
33 // List of test fuctions. Each of them should call |tasks.next()| when |
|
34 // completed or |tasks.finish()| to jump to the last one. |
|
35 _tasks: [], |
|
36 _nextTaskIndex: 0, |
|
37 |
|
38 push: function(func) { |
|
39 this._tasks.push(func); |
|
40 }, |
|
41 |
|
42 next: function() { |
|
43 let index = this._nextTaskIndex++; |
|
44 let task = this._tasks[index]; |
|
45 try { |
|
46 task(); |
|
47 } catch (ex) { |
|
48 ok(false, "test task[" + index + "] throws: " + ex); |
|
49 // Run last task as clean up if possible. |
|
50 if (index != this._tasks.length - 1) { |
|
51 this.finish(); |
|
52 } |
|
53 } |
|
54 }, |
|
55 |
|
56 finish: function() { |
|
57 this._tasks[this._tasks.length - 1](); |
|
58 }, |
|
59 |
|
60 run: function() { |
|
61 this.next(); |
|
62 } |
|
63 }; |
|
64 |
|
65 function taskNextWrapper() { |
|
66 tasks.next(); |
|
67 } |
|
68 |
|
69 function verifySmsExists(incomingSms) { |
|
70 log("Getting SMS (id: " + incomingSms.id + ")."); |
|
71 let requestRet = manager.getMessage(incomingSms.id); |
|
72 ok(requestRet, "smsrequest obj returned"); |
|
73 |
|
74 requestRet.onsuccess = function(event) { |
|
75 log("Received 'onsuccess' smsrequest event."); |
|
76 ok(event.target.result, "smsrequest event.target.result"); |
|
77 let foundSms = event.target.result; |
|
78 is(foundSms.id, incomingSms.id, "found SMS id matches"); |
|
79 is(foundSms.threadId, incomingSms.threadId, "found SMS thread id matches"); |
|
80 is(foundSms.body, MSG_TEXT, "found SMS msg text matches"); |
|
81 is(foundSms.delivery, "received", "delivery"); |
|
82 is(foundSms.deliveryStatus, "success", "deliveryStatus"); |
|
83 is(foundSms.read, false, "read"); |
|
84 is(foundSms.receiver, RECEIVER, "receiver"); |
|
85 is(foundSms.sender, SENDER, "sender"); |
|
86 is(foundSms.messageClass, "normal", "messageClass"); |
|
87 log("Got SMS (id: " + foundSms.id + ") as expected."); |
|
88 |
|
89 SmsList.push(incomingSms); |
|
90 }; |
|
91 |
|
92 requestRet.onerror = function(event) { |
|
93 log("Received 'onerror' smsrequest event."); |
|
94 ok(event.target.error, "domerror obj"); |
|
95 is(event.target.error.name, "NotFoundError", "error returned"); |
|
96 log("Could not get SMS (id: " + incomingSms.id + ") but should have."); |
|
97 ok(false,"SMS was not found"); |
|
98 tasks.finish(); |
|
99 }; |
|
100 } |
|
101 |
|
102 let verifDeletedCount = 0; |
|
103 function verifySmsDeleted(smsId) { |
|
104 log("Getting SMS (id: " + smsId + ")."); |
|
105 let requestRet = manager.getMessage(smsId); |
|
106 ok(requestRet, "smsrequest obj returned"); |
|
107 |
|
108 requestRet.onsuccess = function(event) { |
|
109 log("Received 'onsuccess' smsrequest event."); |
|
110 ok(event.target.result, "smsrequest event.target.result"); |
|
111 let foundSms = event.target.result; |
|
112 is(foundSms.id, smsId, "found SMS id matches"); |
|
113 is(foundSms.body, MSG_TEXT, "found SMS msg text matches"); |
|
114 log("Got SMS (id: " + foundSms.id + ") but should not have."); |
|
115 ok(false, "SMS was not deleted"); |
|
116 tasks.finish(); |
|
117 }; |
|
118 |
|
119 requestRet.onerror = function(event) { |
|
120 log("Received 'onerror' smsrequest event."); |
|
121 ok(event.target.error, "domerror obj"); |
|
122 is(event.target.error.name, "NotFoundError", "error returned"); |
|
123 log("Could not get SMS (id: " + smsId + ") as expected."); |
|
124 verifDeletedCount++; |
|
125 }; |
|
126 } |
|
127 |
|
128 tasks.push(function init() { |
|
129 log("Initialize test object."); |
|
130 ok(manager instanceof MozMobileMessageManager, |
|
131 "manager is instance of " + manager.constructor); |
|
132 |
|
133 // Callback for incoming sms |
|
134 manager.onreceived = function onreceived(event) { |
|
135 log("Received 'onreceived' event."); |
|
136 let incomingSms = event.message; |
|
137 ok(incomingSms, "incoming sms"); |
|
138 ok(incomingSms.id, "sms id"); |
|
139 log("Received SMS (id: " + incomingSms.id + ")."); |
|
140 ok(incomingSms.threadId, "thread id"); |
|
141 is(incomingSms.body, MSG_TEXT, "msg body"); |
|
142 is(incomingSms.delivery, "received", "delivery"); |
|
143 is(incomingSms.deliveryStatus, "success", "deliveryStatus"); |
|
144 is(incomingSms.read, false, "read"); |
|
145 is(incomingSms.receiver, RECEIVER, "receiver"); |
|
146 is(incomingSms.sender, SENDER, "sender"); |
|
147 is(incomingSms.messageClass, "normal", "messageClass"); |
|
148 is(incomingSms.deliveryTimestamp, 0, "deliveryTimestamp is 0"); |
|
149 |
|
150 verifySmsExists(incomingSms); |
|
151 }; |
|
152 |
|
153 tasks.next(); |
|
154 }); |
|
155 |
|
156 tasks.push(function sendAllSms() { |
|
157 log("Send " + SMS_NUMBER + " SMS"); |
|
158 for (let i = 0; i < SMS_NUMBER; i++) { |
|
159 sendSmsToEmulator(SENDER, MSG_TEXT); |
|
160 } |
|
161 |
|
162 waitFor(taskNextWrapper, function() { |
|
163 return (pendingEmulatorCmdCount === 0) && (SmsList.length === SMS_NUMBER); |
|
164 }); |
|
165 }); |
|
166 |
|
167 tasks.push(function deleteAllSms() { |
|
168 log("Deleting SMS using smsmsg obj array parameter."); |
|
169 let deleteStart = Date.now(); |
|
170 log("deleteStart: " + deleteStart); |
|
171 log("SmsList: " + JSON.stringify(SmsList)); |
|
172 let requestRet = manager.delete(SmsList); |
|
173 ok(requestRet,"smsrequest obj returned"); |
|
174 |
|
175 requestRet.onsuccess = function(event) { |
|
176 let deleteDone = Date.now(); |
|
177 log("Delete " + SMS_NUMBER + " SMS takes " + (deleteDone - deleteStart) + " ms."); |
|
178 log("Received 'onsuccess' smsrequest event."); |
|
179 if (event.target.result) { |
|
180 for (let i = 0; i < SmsList.length; i++) { |
|
181 verifySmsDeleted(SmsList[i].id); |
|
182 } |
|
183 } else { |
|
184 log("smsrequest returned false for manager.delete"); |
|
185 ok(false, "SMS delete failed"); |
|
186 } |
|
187 }; |
|
188 |
|
189 requestRet.onerror = function(event) { |
|
190 log("Received 'onerror' smsrequest event."); |
|
191 ok(event.target.error, "domerror obj"); |
|
192 ok(false, "manager.delete request returned unexpected error: " |
|
193 + event.target.error.name); |
|
194 tasks.finish(); |
|
195 }; |
|
196 |
|
197 waitFor(taskNextWrapper, function() { |
|
198 return verifDeletedCount === SMS_NUMBER; |
|
199 }); |
|
200 }); |
|
201 |
|
202 // WARNING: All tasks should be pushed before this!!! |
|
203 tasks.push(function cleanUp() { |
|
204 if (pendingEmulatorCmdCount) { |
|
205 window.setTimeout(cleanUp, 100); |
|
206 return; |
|
207 } |
|
208 |
|
209 manager.onreceived = null; |
|
210 SpecialPowers.removePermission("sms", document); |
|
211 SpecialPowers.setBoolPref("dom.sms.enabled", false); |
|
212 log("Finish!!!"); |
|
213 finish(); |
|
214 }); |
|
215 |
|
216 // Start the test |
|
217 tasks.run(); |