Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: extensions/test/data/data_sender_unittest.js

Issue 571333002: Add serialization support to the JS DataSender and DataReceiver. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@stash-service
Patch Set: address comments Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698