OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Tests launched by extensions/renderer/api/serial/data_sender_unittest.cc | 5 // Tests launched by extensions/renderer/api/serial/data_sender_unittest.cc |
6 | 6 |
7 var test = require('test').binding; | 7 var test = require('test').binding; |
8 var unittestBindings = require('test_environment_specific_bindings'); | 8 var unittestBindings = require('test_environment_specific_bindings'); |
9 | 9 |
10 var BUFFER_SIZE = 11; | 10 var BUFFER_SIZE = 11; |
11 var FATAL_ERROR = 2; | 11 var FATAL_ERROR = 2; |
12 | 12 |
13 function generateData(size, pattern) { | 13 function generateData(size, pattern) { |
14 if (!pattern) | 14 if (!pattern) |
15 pattern = 'a'; | 15 pattern = 'a'; |
16 var buffer = new ArrayBuffer(size); | 16 var buffer = new ArrayBuffer(size); |
17 var intView = new Int8Array(buffer); | 17 var intView = new Int8Array(buffer); |
18 for (var i = 0; i < size; i++) { | 18 for (var i = 0; i < size; i++) { |
19 intView[i] = pattern.charCodeAt(i % pattern.length); | 19 intView[i] = pattern.charCodeAt(i % pattern.length); |
20 } | 20 } |
21 return buffer; | 21 return buffer; |
22 } | 22 } |
23 | 23 |
24 function createSender() { | 24 function createSender() { |
25 return Promise.all([ | 25 return Promise.all([ |
26 requireAsync('content/public/renderer/service_provider'), | 26 requireAsync('content/public/renderer/service_provider'), |
27 requireAsync('data_sender'), | 27 requireAsync('data_sender'), |
28 requireAsync('device/serial/data_stream.mojom'), | 28 requireAsync('device/serial/data_stream.mojom'), |
29 ]).then(test.callbackPass(function(modules) { | 29 ]).then(function(modules) { |
30 var serviceProvider = modules[0]; | 30 var serviceProvider = modules[0]; |
31 var dataSender = modules[1]; | 31 var dataSender = modules[1]; |
32 var dataStream = modules[2]; | 32 var dataStream = modules[2]; |
33 return new dataSender.DataSender( | 33 return new dataSender.DataSender( |
34 serviceProvider.connectToService(dataStream.DataSinkProxy.NAME_), | 34 serviceProvider.connectToService(dataStream.DataSinkProxy.NAME_), |
35 BUFFER_SIZE, | 35 BUFFER_SIZE, |
36 FATAL_ERROR); | 36 FATAL_ERROR); |
37 })); | 37 }); |
38 } | |
39 | |
40 function sendAndExpectSuccess(data, expectedBytesSent) { | |
raymes
2014/09/18 03:16:07
Please add comments for the helpers here too
Sam McNally
2014/09/19 04:58:48
Done.
| |
41 return function(sender) { | |
42 return sender.send(data).then(function(bytesSent) { | |
43 test.assertEq(expectedBytesSent, bytesSent); | |
44 return sender; | |
45 }); | |
46 }; | |
47 } | |
48 | |
49 function sendAndExpectError(data, expectedError, expectedBytesSent) { | |
50 return function(sender) { | |
51 return sender.send(data).catch(function(result) { | |
52 test.assertEq(expectedError, result.error); | |
53 test.assertEq(expectedBytesSent, result.bytesSent); | |
54 return sender; | |
55 }); | |
56 }; | |
57 } | |
58 | |
59 function cancelSend(cancelReason) { | |
60 return function(sender) { | |
61 return sender.cancel(cancelReason).then(function() { | |
62 return sender; | |
63 }); | |
64 }; | |
65 } | |
66 | |
67 function expectOrder(promises) { | |
68 var nextIndex = 0; | |
69 function createOrderChecker(promise, expectedIndex) { | |
70 return promise.then(function(sender) { | |
71 test.assertEq(nextIndex, expectedIndex); | |
72 nextIndex++; | |
73 return sender; | |
74 }); | |
75 } | |
76 var wrappedPromises = []; | |
77 for (var i = 0; i < promises.length; i++) { | |
78 wrappedPromises.push(createOrderChecker(promises[i], i)); | |
79 } | |
80 return Promise.all(wrappedPromises).then(function(results) { | |
81 return results[0]; | |
82 }); | |
83 } | |
84 | |
85 function serializeRoundTrip(sender) { | |
86 return Promise.all([ | |
87 sender.serialize(), | |
88 requireAsync('data_sender'), | |
89 ]).then(function(promises) { | |
90 var serialized = promises[0]; | |
91 var dataSender = promises[1]; | |
raymes
2014/09/18 03:16:07
dataSenderModule
Sam McNally
2014/09/19 04:58:47
Done.
| |
92 return promises[1].DataSender.deserialize(promises[0]); | |
raymes
2014/09/18 03:16:07
same here, use the variable names :)
Sam McNally
2014/09/19 04:58:48
Done.
| |
93 }); | |
94 } | |
95 | |
96 function closeSender(sender) { | |
97 sender.close(); | |
98 return sender; | |
38 } | 99 } |
39 | 100 |
40 unittestBindings.exportTests([ | 101 unittestBindings.exportTests([ |
41 function testSend() { | 102 function testSend() { |
42 createSender().then(test.callbackPass(function(sender) { | 103 var sender = createSender(); |
43 var seen = null; | 104 expectOrder([ |
44 sender.send(generateData(1)).then(test.callbackPass(function(bytesSent) { | 105 sender.then(sendAndExpectSuccess(generateData(1), 1)), |
45 test.assertEq(1, bytesSent); | 106 sender.then(sendAndExpectSuccess(generateData(1), 1)), |
46 test.assertEq(null, seen); | 107 ]).then(closeSender).then(test.succeed, test.fail); |
47 seen = 'first'; | |
48 })); | |
49 sender.send(generateData(1)).then(test.callbackPass(function(bytesSent) { | |
50 sender.close(); | |
51 test.assertEq(1, bytesSent); | |
52 test.assertEq('first', seen); | |
53 seen = 'second'; | |
54 })); | |
55 })); | |
56 }, | 108 }, |
57 | 109 |
58 function testLargeSend() { | 110 function testLargeSend() { |
59 createSender().then(test.callbackPass(function(sender) { | 111 createSender() |
60 sender.send(generateData(BUFFER_SIZE * 3, '123')).then( | 112 .then(sendAndExpectSuccess(generateData(BUFFER_SIZE * 3, '123'), |
61 test.callbackPass(function(bytesSent) { | 113 BUFFER_SIZE * 3)) |
raymes
2014/09/18 03:16:07
I think the indentation should be 2 spaces less he
Sam McNally
2014/09/19 04:58:47
Done.
| |
62 test.assertEq(BUFFER_SIZE * 3, bytesSent); | 114 .then(closeSender).then(test.succeed, test.fail); |
63 sender.close(); | |
64 })); | |
65 })); | |
66 }, | 115 }, |
67 | 116 |
68 function testSendError() { | 117 function testSendError() { |
69 createSender().then(test.callbackPass(function(sender) { | 118 createSender() |
70 sender.send(generateData(BUFFER_SIZE * 3, 'b')).catch(test.callbackPass( | 119 .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 0)) |
71 function(e) { | 120 .then(sendAndExpectSuccess(generateData(1), 1)) |
72 test.assertEq(1, e.error); | 121 .then(closeSender).then(test.succeed, test.fail); |
73 test.assertEq(0, e.bytesSent); | |
74 sender.send(generateData(1)).then(test.callbackPass( | |
75 function(bytesSent) { | |
76 test.assertEq(1, bytesSent); | |
77 sender.close(); | |
78 })); | |
79 })); | |
80 })); | |
81 }, | 122 }, |
82 | 123 |
83 function testSendErrorPartialSuccess() { | 124 function testSendErrorPartialSuccess() { |
84 createSender().then(test.callbackPass(function(sender) { | 125 createSender() |
85 sender.send(generateData(BUFFER_SIZE * 3, 'b')).catch(test.callbackPass( | 126 .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 5)) |
86 function(e) { | 127 .then(sendAndExpectSuccess(generateData(1), 1)) |
87 test.assertEq(1, e.error); | 128 .then(closeSender).then(test.succeed, test.fail); |
88 test.assertEq(5, e.bytesSent); | |
89 sender.send(generateData(1)).then(test.callbackPass( | |
90 function(bytesSent) { | |
91 test.assertEq(1, bytesSent); | |
92 sender.close(); | |
93 })); | |
94 })); | |
95 })); | |
96 }, | 129 }, |
97 | 130 |
98 function testSendErrorBetweenPackets() { | 131 function testSendErrorBetweenPackets() { |
99 createSender().then(test.callbackPass(function(sender) { | 132 var sender = createSender(); |
100 sender.send(generateData(2, 'b')).catch(test.callbackPass(function(e) { | 133 expectOrder([ |
101 test.assertEq(1, e.error); | 134 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 2)), |
102 test.assertEq(2, e.bytesSent); | 135 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 0)), |
103 })); | 136 ]) |
104 // After an error, all sends in progress will be cancelled. | 137 .then(sendAndExpectSuccess(generateData(1), 1)) |
105 sender.send(generateData(2, 'b')).catch(test.callbackPass(function(e) { | 138 .then(closeSender).then(test.succeed, test.fail); |
106 test.assertEq(1, e.error); | |
107 test.assertEq(0, e.bytesSent); | |
108 sender.send(generateData(1)).then(test.callbackPass( | |
109 function(bytesSent) { | |
110 test.assertEq(1, bytesSent); | |
111 sender.close(); | |
112 })); | |
113 })); | |
114 })); | |
115 }, | 139 }, |
116 | 140 |
117 function testSendErrorInSecondPacket() { | 141 function testSendErrorInSecondPacket() { |
118 createSender().then(test.callbackPass(function(sender) { | 142 var sender = createSender(); |
119 sender.send(generateData(2, 'b')).then(test.callbackPass( | 143 expectOrder([ |
120 function(bytesSent) { | 144 sender.then(sendAndExpectSuccess(generateData(2, 'b'), 2)), |
121 test.assertEq(2, bytesSent); | 145 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 1)), |
122 })); | 146 ]) |
123 sender.send(generateData(2, 'b')).catch(test.callbackPass(function(e) { | 147 .then(sendAndExpectSuccess(generateData(1), 1)) |
124 test.assertEq(1, e.error); | 148 .then(closeSender).then(test.succeed, test.fail); |
raymes
2014/09/18 03:16:07
I think the indentation is wrong here - it looks d
Sam McNally
2014/09/19 04:58:48
Done.
| |
125 test.assertEq(1, e.bytesSent); | |
126 sender.send(generateData(1)).then(test.callbackPass( | |
127 function(bytesSent) { | |
128 test.assertEq(1, bytesSent); | |
129 sender.close(); | |
130 })); | |
131 })); | |
132 })); | |
133 }, | 149 }, |
134 | 150 |
135 function testSendErrorInLargeSend() { | 151 function testSendErrorInLargeSend() { |
136 createSender().then(test.callbackPass(function(sender) { | 152 createSender() |
137 sender.send(generateData(BUFFER_SIZE * 3, '1234567890')).catch( | 153 .then(sendAndExpectError( |
138 test.callbackPass(function(e) { | 154 generateData(BUFFER_SIZE * 3, '1234567890'), 1, 12)) |
139 test.assertEq(1, e.error); | 155 .then(sendAndExpectSuccess(generateData(1), 1)) |
140 test.assertEq(12, e.bytesSent); | 156 .then(closeSender).then(test.succeed, test.fail); |
141 sender.send(generateData(1)).then(test.callbackPass( | |
142 function(bytesSent) { | |
143 test.assertEq(1, bytesSent); | |
144 sender.close(); | |
145 })); | |
146 })); | |
147 })); | |
148 }, | 157 }, |
149 | 158 |
150 function testSendErrorBeforeLargeSend() { | 159 function testSendErrorBeforeLargeSend() { |
151 createSender().then(test.callbackPass(function(sender) { | 160 var sender = createSender(); |
152 sender.send(generateData(5, 'b')).catch(test.callbackPass(function(e) { | 161 expectOrder([ |
153 test.assertEq(1, e.error); | 162 sender.then(sendAndExpectError(generateData(5, 'b'), 1, 2)), |
154 test.assertEq(2, e.bytesSent); | 163 sender.then(sendAndExpectError( |
155 })); | 164 generateData(BUFFER_SIZE * 3, '1234567890'), 1, 0)), |
156 sender.send(generateData(BUFFER_SIZE * 3, '1234567890')).catch( | 165 ]) |
157 test.callbackPass(function(e) { | 166 .then(sendAndExpectSuccess(generateData(1), 1)) |
158 test.assertEq(1, e.error); | 167 .then(closeSender).then(test.succeed, test.fail); |
159 test.assertEq(0, e.bytesSent); | |
160 sender.send(generateData(1)).then(test.callbackPass( | |
161 function(bytesSent) { | |
162 test.assertEq(1, bytesSent); | |
163 sender.close(); | |
164 })); | |
165 })); | |
166 })); | |
167 }, | 168 }, |
168 | 169 |
169 function testCancelWithoutSend() { | 170 function testCancelWithoutSend() { |
170 createSender().then(test.callbackPass(function(sender) { | 171 createSender() |
171 sender.cancel(3).then(test.callbackPass(function() { | 172 .then(cancelSend(3)) |
172 sender.close(); | 173 .then(closeSender).then(test.succeed, test.fail); |
173 })); | |
174 })); | |
175 }, | 174 }, |
176 | 175 |
177 function testCancel() { | 176 function testCancel() { |
178 createSender().then(test.callbackPass(function(sender) { | 177 var sender = createSender(); |
179 var seen = null; | 178 expectOrder([ |
180 sender.send(generateData(1, 'b')).catch(test.callbackPass(function(e) { | 179 sender.then(sendAndExpectError(generateData(1, 'b'), 3, 0)), |
181 test.assertEq(3, e.error); | 180 sender.then(cancelSend(3)), |
182 test.assertEq(0, e.bytesSent); | 181 ]) |
183 test.assertEq(null, seen); | 182 .then(closeSender).then(test.succeed, test.fail); |
184 seen = 'send'; | 183 sender.then(function(sender) { |
185 })); | |
186 sender.cancel(3).then(test.callbackPass(function() { | |
187 test.assertEq('send', seen); | |
188 seen = 'cancel'; | |
189 sender.close(); | |
190 })); | |
191 test.assertThrows( | 184 test.assertThrows( |
192 sender.cancel, sender, [], 'Cancel already in progress'); | 185 sender.cancel, sender, [], 'Cancel already in progress'); |
193 test.assertThrows(sender.send, sender, [], 'Cancel in progress'); | 186 test.assertThrows(sender.send, sender, [], 'Cancel in progress'); |
194 })); | 187 }); |
195 }, | 188 }, |
196 | 189 |
197 function testClose() { | 190 function testClose() { |
198 createSender().then(test.callbackPass(function(sender) { | 191 var sender = createSender(); |
199 var seen = null; | 192 expectOrder([ |
200 sender.send(generateData(1, 'b')).catch(test.callbackPass(function(e) { | 193 sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)), |
201 test.assertEq(FATAL_ERROR, e.error); | 194 sender.then(cancelSend(3)), |
202 test.assertEq(0, e.bytesSent); | 195 ]); |
203 test.assertEq(null, seen); | 196 sender.then(closeSender).then(test.succeed, test.fail) |
raymes
2014/09/18 03:16:07
I like having every .then on a separate line :)
Sam McNally
2014/09/19 04:58:47
Done.
| |
204 seen = 'send'; | 197 .then(function(sender) { |
raymes
2014/09/18 03:16:07
Won't this run after the test has passed or failed
Sam McNally
2014/09/19 04:58:47
Done.
| |
205 })); | |
206 sender.cancel(3).then(test.callbackPass(function() { | |
207 test.assertEq('send', seen); | |
208 seen = 'cancel'; | |
209 sender.close(); | |
210 })); | |
211 sender.close(); | |
212 test.assertThrows( | 198 test.assertThrows( |
213 sender.cancel, sender, [], 'DataSender has been closed'); | 199 sender.cancel, sender, [], 'DataSender has been closed'); |
214 test.assertThrows(sender.send, sender, [], 'DataSender has been closed'); | 200 test.assertThrows(sender.send, sender, [], 'DataSender has been closed'); |
215 })); | 201 }); |
202 }, | |
203 | |
204 function testSendWithSerialization() { | |
205 var sender = createSender() | |
206 .then(sendAndExpectSuccess(generateData(1), 1)) | |
207 .then(serializeRoundTrip); | |
208 expectOrder([ | |
209 sender.then(sendAndExpectSuccess(generateData(1), 1)), | |
210 sender.then(sendAndExpectSuccess(generateData(1), 1)), | |
211 ]).then(closeSender).then(test.succeed, test.fail); | |
raymes
2014/09/18 03:16:07
.then on a new line (and lots below)
Sam McNally
2014/09/19 04:58:48
Done.
| |
212 }, | |
213 | |
214 function testSendErrorWithSerialization() { | |
215 createSender() | |
216 .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 0)) | |
217 .then(sendAndExpectSuccess(generateData(1), 1)) | |
218 .then(serializeRoundTrip) | |
219 .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 3, 0)) | |
220 .then(sendAndExpectSuccess(generateData(1, 'c'), 1)) | |
221 .then(closeSender).then(test.succeed, test.fail); | |
222 }, | |
223 | |
224 function testSendErrorPartialSuccessWithSerialization() { | |
225 createSender() | |
226 .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 5)) | |
227 .then(sendAndExpectSuccess(generateData(1), 1)) | |
228 .then(serializeRoundTrip) | |
229 .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'c'), 3, 5)) | |
230 .then(sendAndExpectSuccess(generateData(1, 'd'), 1)) | |
231 .then(closeSender).then(test.succeed, test.fail); | |
232 }, | |
233 | |
234 function testSendErrorBetweenPacketsWithSerialization() { | |
raymes
2014/09/18 03:16:07
Do this test and the next one test something subst
Sam McNally
2014/09/19 04:58:48
Removed these.
| |
235 var sender = createSender(); | |
236 sender = expectOrder([ | |
237 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 2)), | |
238 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 0)), | |
239 ]) | |
240 .then(sendAndExpectSuccess(generateData(1), 1)) | |
241 .then(serializeRoundTrip); | |
242 expectOrder([ | |
243 sender.then(sendAndExpectError(generateData(2, 'c'), 3, 2)), | |
244 sender.then(sendAndExpectError(generateData(2, 'c'), 3, 0)), | |
245 ]) | |
246 .then(sendAndExpectSuccess(generateData(1, 'd'), 1)) | |
247 .then(closeSender).then(test.succeed, test.fail); | |
248 }, | |
249 | |
250 function testSendErrorInSecondPacketWithSerialization() { | |
251 var sender = createSender(); | |
252 sender = expectOrder([ | |
253 sender.then(sendAndExpectSuccess(generateData(2, 'b'), 2)), | |
254 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 1)), | |
255 ]) | |
256 .then(sendAndExpectSuccess(generateData(1), 1)) | |
257 .then(serializeRoundTrip); | |
258 expectOrder([ | |
259 sender.then(sendAndExpectSuccess(generateData(2, 'c'), 2)), | |
260 sender.then(sendAndExpectError(generateData(2, 'c'), 3, 1)), | |
261 ]) | |
262 .then(sendAndExpectSuccess(generateData(1, 'd'), 1)) | |
263 .then(closeSender).then(test.succeed, test.fail); | |
264 | |
265 }, | |
266 | |
267 function testCancelWithSerialization() { | |
raymes
2014/09/18 03:16:07
does this test actually check anything?
Sam McNally
2014/09/19 04:58:47
Just that cancel still works the same after serial
| |
268 var sender = createSender(); | |
269 sender = expectOrder([ | |
270 sender.then(sendAndExpectError(generateData(1, 'b'), 3, 0)), | |
271 sender.then(cancelSend(3)), | |
272 ]).then(serializeRoundTrip); | |
273 expectOrder([ | |
274 sender.then(sendAndExpectError(generateData(1, 'b'), 4, 0)), | |
275 sender.then(cancelSend(4)), | |
276 ]).then(closeSender).then(test.succeed, test.fail); | |
277 sender.then(function(sender) { | |
278 test.assertThrows( | |
279 sender.cancel, sender, [], 'Cancel already in progress'); | |
280 test.assertThrows(sender.send, sender, [], 'Cancel in progress'); | |
281 }); | |
282 }, | |
283 | |
284 function testSerializeWithSendsInProgress() { | |
raymes
2014/09/18 03:16:07
does this test actually check anything?
Sam McNally
2014/09/19 04:58:48
Yes. This checks that serialize() cancels any send
| |
285 var sender = createSender(); | |
286 expectOrder([ | |
287 sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)), | |
288 sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)), | |
289 sender.then(serializeRoundTrip), | |
290 ]).then(closeSender).then(test.succeed, test.fail); | |
291 }, | |
292 | |
293 function testSerializeWithSendAndCancelInProgress() { | |
294 var sender = createSender(); | |
295 expectOrder([ | |
296 sender.then(sendAndExpectError(generateData(1, 'b'), 3, 0)), | |
297 sender.then(cancelSend(3)), | |
298 sender.then(serializeRoundTrip), | |
raymes
2014/09/18 03:16:07
does this test actually check anything?
Sam McNally
2014/09/19 04:58:47
Yes. This checks that serialize() doesn't override
| |
299 ]).then(closeSender).then(test.succeed, test.fail); | |
300 }, | |
301 | |
302 function testSerializeAfterClose() { | |
303 function sendAfterClose(sender) { | |
304 test.assertThrows(sender.send, sender, [], 'DataSender has been closed'); | |
305 } | |
306 | |
307 createSender() | |
308 .then(closeSender) | |
309 .then(serializeRoundTrip) | |
310 .then(sendAfterClose).then(test.succeed, test.fail); | |
216 }, | 311 }, |
217 | 312 |
218 ], test.runTests, exports); | 313 ], test.runTests, exports); |
OLD | NEW |