|
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.addPermission("sms", true, document); |
|
7 SpecialPowers.setBoolPref("dom.sms.enabled", true); |
|
8 |
|
9 let manager = window.navigator.mozMobileMessage; |
|
10 let numberMsgs = 10; |
|
11 let smsList = new Array(); |
|
12 |
|
13 function verifyInitialState() { |
|
14 log("Verifying initial state."); |
|
15 ok(manager instanceof MozMobileMessageManager, |
|
16 "manager is instance of " + manager.constructor); |
|
17 // Ensure test is starting clean with no existing sms messages |
|
18 deleteAllMsgs(simulateIncomingSms); |
|
19 } |
|
20 |
|
21 function isIn(aVal, aArray, aMsg) { |
|
22 ok(aArray.indexOf(aVal) >= 0, aMsg); |
|
23 } |
|
24 |
|
25 function deleteAllMsgs(nextFunction) { |
|
26 let msgList = new Array(); |
|
27 let smsFilter = new MozSmsFilter; |
|
28 |
|
29 let cursor = manager.getMessages(smsFilter, false); |
|
30 ok(cursor instanceof DOMCursor, |
|
31 "cursor is instanceof " + cursor.constructor); |
|
32 |
|
33 cursor.onsuccess = function(event) { |
|
34 // Check if message was found |
|
35 if (cursor.result) { |
|
36 msgList.push(cursor.result.id); |
|
37 // Now get next message in the list |
|
38 cursor.continue(); |
|
39 } else { |
|
40 // No (more) messages found |
|
41 if (msgList.length) { |
|
42 log("Found " + msgList.length + " SMS messages to delete."); |
|
43 deleteMsgs(msgList, nextFunction); |
|
44 } else { |
|
45 log("No SMS messages found."); |
|
46 nextFunction(); |
|
47 } |
|
48 } |
|
49 }; |
|
50 |
|
51 cursor.onerror = function(event) { |
|
52 log("Received 'onerror' event."); |
|
53 ok(event.target.error, "domerror obj"); |
|
54 log("manager.getMessages error: " + event.target.error.name); |
|
55 ok(false,"Could not get SMS messages"); |
|
56 cleanUp(); |
|
57 }; |
|
58 } |
|
59 |
|
60 function deleteMsgs(msgList, nextFunction) { |
|
61 let smsId = msgList.shift(); |
|
62 |
|
63 log("Deleting SMS (id: " + smsId + ")."); |
|
64 let request = manager.delete(smsId); |
|
65 ok(request instanceof DOMRequest, |
|
66 "request is instanceof " + request.constructor); |
|
67 |
|
68 request.onsuccess = function(event) { |
|
69 log("Received 'onsuccess' smsrequest event."); |
|
70 if (event.target.result) { |
|
71 // Message deleted, continue until none are left |
|
72 if (msgList.length) { |
|
73 deleteMsgs(msgList, nextFunction); |
|
74 } else { |
|
75 log("Finished deleting SMS messages."); |
|
76 nextFunction(); |
|
77 } |
|
78 } else { |
|
79 log("SMS delete failed."); |
|
80 ok(false,"manager.delete request returned false"); |
|
81 cleanUp(); |
|
82 } |
|
83 }; |
|
84 |
|
85 request.onerror = function(event) { |
|
86 log("Received 'onerror' smsrequest event."); |
|
87 ok(event.target.error, "domerror obj"); |
|
88 ok(false, "manager.delete request returned unexpected error: " |
|
89 + event.target.error.name ); |
|
90 cleanUp(); |
|
91 }; |
|
92 } |
|
93 |
|
94 function simulateIncomingSms() { |
|
95 let text = "Incoming SMS number " + (smsList.length + 1); |
|
96 let remoteNumber = "5552229797"; |
|
97 |
|
98 log("Simulating incoming SMS number " + (smsList.length + 1) + " of " |
|
99 + numberMsgs + "."); |
|
100 |
|
101 // Simulate incoming sms sent from remoteNumber to our emulator |
|
102 rcvdEmulatorCallback = false; |
|
103 runEmulatorCmd("sms send " + remoteNumber + " " + text, function(result) { |
|
104 is(result[0], "OK", "emulator callback"); |
|
105 rcvdEmulatorCallback = true; |
|
106 }); |
|
107 } |
|
108 |
|
109 // Callback for incoming sms |
|
110 manager.onreceived = function onreceived(event) { |
|
111 log("Received 'onreceived' sms event."); |
|
112 let incomingSms = event.message; |
|
113 log("Received SMS (id: " + incomingSms.id + ")."); |
|
114 |
|
115 // Add newly received message to array of received msgs |
|
116 smsList.push(incomingSms); |
|
117 |
|
118 // Wait for emulator to catch up before continuing |
|
119 waitFor(nextRep,function() { |
|
120 return(rcvdEmulatorCallback); |
|
121 }); |
|
122 }; |
|
123 |
|
124 function nextRep() { |
|
125 if (smsList.length < numberMsgs) { |
|
126 simulateIncomingSms(); |
|
127 } else { |
|
128 log("Received " + numberMsgs + " sms messages in total."); |
|
129 getMsgs(false); |
|
130 } |
|
131 } |
|
132 |
|
133 function getMsgs(reverse) { |
|
134 let smsFilter = new MozSmsFilter; |
|
135 let foundSmsCount = 0; |
|
136 let foundSmsList = new Array(); |
|
137 |
|
138 if (!reverse) { |
|
139 log("Getting the sms messages."); |
|
140 } else { |
|
141 log("Getting the sms messages in reverse order."); |
|
142 } |
|
143 |
|
144 // Note: This test is intended for getMessages, so just a basic test with |
|
145 // no filter (default); separate tests will be written for sms filtering |
|
146 let cursor = manager.getMessages(smsFilter, reverse); |
|
147 ok(cursor instanceof DOMCursor, |
|
148 "cursor is instanceof " + cursor.constructor); |
|
149 |
|
150 cursor.onsuccess = function(event) { |
|
151 log("Received 'onsuccess' event."); |
|
152 |
|
153 if (cursor.result) { |
|
154 // Another message found |
|
155 log("Got SMS (id: " + cursor.result.id + ")."); |
|
156 foundSmsCount++; |
|
157 // Store found message |
|
158 foundSmsList.push(cursor.result); |
|
159 // Now get next message in the list |
|
160 cursor.continue(); |
|
161 } else { |
|
162 // No more messages; ensure correct number found |
|
163 if (foundSmsCount == numberMsgs) { |
|
164 log("SMS getMessages returned " + foundSmsCount + |
|
165 " messages as expected."); |
|
166 } else { |
|
167 log("SMS getMessages returned " + foundSmsCount + |
|
168 " messages, but expected " + numberMsgs + "."); |
|
169 ok(false, "Incorrect number of messages returned by manager.getMessages"); |
|
170 } |
|
171 verifyFoundMsgs(foundSmsList, reverse); |
|
172 } |
|
173 }; |
|
174 |
|
175 cursor.onerror = function(event) { |
|
176 log("Received 'onerror' event."); |
|
177 ok(event.target.error, "domerror obj"); |
|
178 log("manager.getMessages error: " + event.target.error.name); |
|
179 ok(false,"Could not get SMS messages"); |
|
180 cleanUp(); |
|
181 }; |
|
182 } |
|
183 |
|
184 function verifyFoundMsgs(foundSmsList, reverse) { |
|
185 if (reverse) { |
|
186 smsList.reverse(); |
|
187 } |
|
188 for (var x = 0; x < numberMsgs; x++) { |
|
189 is(foundSmsList[x].id, smsList[x].id, "id"); |
|
190 is(foundSmsList[x].threadId, smsList[x].threadId, "thread id"); |
|
191 is(foundSmsList[x].body, smsList[x].body, "body"); |
|
192 is(foundSmsList[x].delivery, smsList[x].delivery, "delivery"); |
|
193 is(foundSmsList[x].read, smsList[x].read, "read"); |
|
194 |
|
195 // Bug 805799: receiver null when onreceived event is fired, until do a |
|
196 // getMessage. Default emulator (receiver) phone number is 15555215554 |
|
197 if (!smsList[x].receiver) { |
|
198 isIn(foundSmsList[x].receiver, ["15555215554", "+15555215554"], "receiver"); |
|
199 } else { |
|
200 isIn(foundSmsList[x].receiver, [smsList[x].receiver, "+15555215554"], "receiver"); |
|
201 } |
|
202 |
|
203 isIn(foundSmsList[x].sender, [smsList[x].sender, "+15552229797"], "sender"); |
|
204 is(foundSmsList[x].timestamp, smsList[x].timestamp, "timestamp"); |
|
205 is(foundSmsList[x].sentTimestamp, smsList[x].sentTimestamp, "sentTimestamp"); |
|
206 } |
|
207 |
|
208 log("Content in all of the returned SMS messages is correct."); |
|
209 |
|
210 if (!reverse) { |
|
211 // Now get messages in reverse |
|
212 getMsgs(true); |
|
213 } else { |
|
214 // Finished, delete all messages |
|
215 deleteAllMsgs(cleanUp); |
|
216 }; |
|
217 } |
|
218 |
|
219 function cleanUp() { |
|
220 manager.onreceived = null; |
|
221 SpecialPowers.removePermission("sms", document); |
|
222 SpecialPowers.clearUserPref("dom.sms.enabled"); |
|
223 finish(); |
|
224 } |
|
225 |
|
226 // Start the test |
|
227 verifyInitialState(); |