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

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: 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 // Returns a promise to a newly created DataSender.
24 function createSender() { 25 function createSender() {
25 return Promise.all([ 26 return Promise.all([
26 requireAsync('content/public/renderer/service_provider'), 27 requireAsync('content/public/renderer/service_provider'),
27 requireAsync('data_sender'), 28 requireAsync('data_sender'),
28 requireAsync('device/serial/data_stream.mojom'), 29 requireAsync('device/serial/data_stream.mojom'),
29 ]).then(test.callbackPass(function(modules) { 30 ]).then(function(modules) {
30 var serviceProvider = modules[0]; 31 var serviceProvider = modules[0];
31 var dataSender = modules[1]; 32 var dataSender = modules[1];
32 var dataStream = modules[2]; 33 var dataStream = modules[2];
33 return new dataSender.DataSender( 34 return new dataSender.DataSender(
34 serviceProvider.connectToService(dataStream.DataSinkProxy.NAME_), 35 serviceProvider.connectToService(dataStream.DataSinkProxy.NAME_),
35 BUFFER_SIZE, 36 BUFFER_SIZE,
36 FATAL_ERROR); 37 FATAL_ERROR);
37 })); 38 });
39 }
40
41 // Returns a function that sends data to a provided DataSender |sender|,
42 // checks that the send completes successfully and returns a promise that will
43 // resolve to |sender|.
44 function sendAndExpectSuccess(data) {
45 return function(sender) {
46 return sender.send(data).then(function(bytesSent) {
47 test.assertEq(data.byteLength, bytesSent);
48 return sender;
49 });
50 };
51 }
52
53 // Returns a function that sends data to a provided DataSender |sender|,
54 // checks that the send fails with the expected error and expected number of
55 // bytes sent, and returns a promise that will resolve to |sender|.
56 function sendAndExpectError(data, expectedError, expectedBytesSent) {
57 return function(sender) {
58 return sender.send(data).catch(function(result) {
59 test.assertEq(expectedError, result.error);
60 test.assertEq(expectedBytesSent, result.bytesSent);
61 return sender;
62 });
63 };
64 }
65
66 // Returns a function that cancels sends on the provided DataSender |sender|
67 // with error |cancelReason|, returning a promise that will resolve to |sender|
68 // once the cancel completes.
69 function cancelSend(cancelReason) {
70 return function(sender) {
71 return sender.cancel(cancelReason).then(function() {
72 return sender;
73 });
74 };
75 }
76
77 // Checks that attempting to start a send with |sender| fails.
78 function sendAfterClose(sender) {
79 test.assertThrows(sender.send, sender, [], 'DataSender has been closed');
80 }
81
82 // Checks that the provided promises resolve in order, returning the result of
83 // the first.
84 function expectOrder(promises) {
85 var nextIndex = 0;
86 function createOrderChecker(promise, expectedIndex) {
87 return promise.then(function(sender) {
88 test.assertEq(nextIndex, expectedIndex);
89 nextIndex++;
90 return sender;
91 });
92 }
93 var wrappedPromises = [];
94 for (var i = 0; i < promises.length; i++) {
95 wrappedPromises.push(createOrderChecker(promises[i], i));
96 }
97 return Promise.all(wrappedPromises).then(function(results) {
98 return results[0];
99 });
100 }
101
102 // Serializes and deserializes the provided DataSender |sender|, returning a
103 // promise that will resolve to the newly deserialized DataSender.
104 function serializeRoundTrip(sender) {
105 return Promise.all([
106 sender.serialize(),
107 requireAsync('data_sender'),
108 ]).then(function(promises) {
109 var serialized = promises[0];
110 var dataSenderModule = promises[1];
111 return dataSenderModule.DataSender.deserialize(serialized);
112 });
113 }
114
115 function closeSender(sender) {
116 sender.close();
117 return sender;
38 } 118 }
39 119
40 unittestBindings.exportTests([ 120 unittestBindings.exportTests([
41 function testSend() { 121 function testSend() {
42 createSender().then(test.callbackPass(function(sender) { 122 var sender = createSender();
43 var seen = null; 123 expectOrder([
44 sender.send(generateData(1)).then(test.callbackPass(function(bytesSent) { 124 sender.then(sendAndExpectSuccess(generateData(1))),
45 test.assertEq(1, bytesSent); 125 sender.then(sendAndExpectSuccess(generateData(1))),
46 test.assertEq(null, seen); 126 ])
47 seen = 'first'; 127 .then(closeSender)
48 })); 128 .then(test.succeed, test.fail);
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 }, 129 },
57 130
58 function testLargeSend() { 131 function testLargeSend() {
59 createSender().then(test.callbackPass(function(sender) { 132 createSender()
60 sender.send(generateData(BUFFER_SIZE * 3, '123')).then( 133 .then(sendAndExpectSuccess(generateData(BUFFER_SIZE * 3, '123')))
61 test.callbackPass(function(bytesSent) { 134 .then(closeSender)
62 test.assertEq(BUFFER_SIZE * 3, bytesSent); 135 .then(test.succeed, test.fail);
63 sender.close();
64 }));
65 }));
66 }, 136 },
67 137
68 function testSendError() { 138 function testSendError() {
69 createSender().then(test.callbackPass(function(sender) { 139 createSender()
70 sender.send(generateData(BUFFER_SIZE * 3, 'b')).catch(test.callbackPass( 140 .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 0))
71 function(e) { 141 .then(sendAndExpectSuccess(generateData(1)))
72 test.assertEq(1, e.error); 142 .then(closeSender)
73 test.assertEq(0, e.bytesSent); 143 .then(test.succeed, test.fail);
74 sender.send(generateData(1)).then(test.callbackPass(
75 function(bytesSent) {
76 test.assertEq(1, bytesSent);
77 sender.close();
78 }));
79 }));
80 }));
81 }, 144 },
82 145
83 function testSendErrorPartialSuccess() { 146 function testSendErrorPartialSuccess() {
84 createSender().then(test.callbackPass(function(sender) { 147 createSender()
85 sender.send(generateData(BUFFER_SIZE * 3, 'b')).catch(test.callbackPass( 148 .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 5))
86 function(e) { 149 .then(sendAndExpectSuccess(generateData(1)))
87 test.assertEq(1, e.error); 150 .then(closeSender)
88 test.assertEq(5, e.bytesSent); 151 .then(test.succeed, test.fail);
89 sender.send(generateData(1)).then(test.callbackPass(
90 function(bytesSent) {
91 test.assertEq(1, bytesSent);
92 sender.close();
93 }));
94 }));
95 }));
96 }, 152 },
97 153
98 function testSendErrorBetweenPackets() { 154 function testSendErrorBetweenPackets() {
99 createSender().then(test.callbackPass(function(sender) { 155 var sender = createSender();
100 sender.send(generateData(2, 'b')).catch(test.callbackPass(function(e) { 156 expectOrder([
101 test.assertEq(1, e.error); 157 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 2)),
102 test.assertEq(2, e.bytesSent); 158 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 0)),
103 })); 159 ])
104 // After an error, all sends in progress will be cancelled. 160 .then(sendAndExpectSuccess(generateData(1)))
105 sender.send(generateData(2, 'b')).catch(test.callbackPass(function(e) { 161 .then(closeSender)
106 test.assertEq(1, e.error); 162 .then(test.succeed, test.fail);
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 }, 163 },
116 164
117 function testSendErrorInSecondPacket() { 165 function testSendErrorInSecondPacket() {
118 createSender().then(test.callbackPass(function(sender) { 166 var sender = createSender();
119 sender.send(generateData(2, 'b')).then(test.callbackPass( 167 expectOrder([
120 function(bytesSent) { 168 sender.then(sendAndExpectSuccess(generateData(2, 'b'))),
121 test.assertEq(2, bytesSent); 169 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 1)),
122 })); 170 ])
123 sender.send(generateData(2, 'b')).catch(test.callbackPass(function(e) { 171 .then(sendAndExpectSuccess(generateData(1)))
124 test.assertEq(1, e.error); 172 .then(closeSender)
125 test.assertEq(1, e.bytesSent); 173 .then(test.succeed, test.fail);
126 sender.send(generateData(1)).then(test.callbackPass(
127 function(bytesSent) {
128 test.assertEq(1, bytesSent);
129 sender.close();
130 }));
131 }));
132 }));
133 }, 174 },
134 175
135 function testSendErrorInLargeSend() { 176 function testSendErrorInLargeSend() {
136 createSender().then(test.callbackPass(function(sender) { 177 createSender()
137 sender.send(generateData(BUFFER_SIZE * 3, '1234567890')).catch( 178 .then(sendAndExpectError(
138 test.callbackPass(function(e) { 179 generateData(BUFFER_SIZE * 3, '1234567890'), 1, 12))
139 test.assertEq(1, e.error); 180 .then(sendAndExpectSuccess(generateData(1)))
140 test.assertEq(12, e.bytesSent); 181 .then(closeSender)
141 sender.send(generateData(1)).then(test.callbackPass( 182 .then(test.succeed, test.fail);
142 function(bytesSent) {
143 test.assertEq(1, bytesSent);
144 sender.close();
145 }));
146 }));
147 }));
148 }, 183 },
149 184
150 function testSendErrorBeforeLargeSend() { 185 function testSendErrorBeforeLargeSend() {
151 createSender().then(test.callbackPass(function(sender) { 186 var sender = createSender();
152 sender.send(generateData(5, 'b')).catch(test.callbackPass(function(e) { 187 expectOrder([
153 test.assertEq(1, e.error); 188 sender.then(sendAndExpectError(generateData(5, 'b'), 1, 2)),
154 test.assertEq(2, e.bytesSent); 189 sender.then(sendAndExpectError(
155 })); 190 generateData(BUFFER_SIZE * 3, '1234567890'), 1, 0)),
156 sender.send(generateData(BUFFER_SIZE * 3, '1234567890')).catch( 191 ])
157 test.callbackPass(function(e) { 192 .then(sendAndExpectSuccess(generateData(1)))
158 test.assertEq(1, e.error); 193 .then(closeSender)
159 test.assertEq(0, e.bytesSent); 194 .then(test.succeed, test.fail);
160 sender.send(generateData(1)).then(test.callbackPass(
161 function(bytesSent) {
162 test.assertEq(1, bytesSent);
163 sender.close();
164 }));
165 }));
166 }));
167 }, 195 },
168 196
169 function testCancelWithoutSend() { 197 function testCancelWithoutSend() {
170 createSender().then(test.callbackPass(function(sender) { 198 createSender()
171 sender.cancel(3).then(test.callbackPass(function() { 199 .then(cancelSend(3))
172 sender.close(); 200 .then(closeSender)
173 })); 201 .then(test.succeed, test.fail);
174 }));
175 }, 202 },
176 203
177 function testCancel() { 204 function testCancel() {
178 createSender().then(test.callbackPass(function(sender) { 205 var sender = createSender();
179 var seen = null; 206 expectOrder([
180 sender.send(generateData(1, 'b')).catch(test.callbackPass(function(e) { 207 sender.then(sendAndExpectError(generateData(1, 'b'), 3, 0)),
181 test.assertEq(3, e.error); 208 sender.then(cancelSend(3)),
182 test.assertEq(0, e.bytesSent); 209 ])
183 test.assertEq(null, seen); 210 .then(closeSender)
184 seen = 'send'; 211 .then(test.succeed, test.fail);
185 })); 212 sender.then(function(sender) {
186 sender.cancel(3).then(test.callbackPass(function() {
187 test.assertEq('send', seen);
188 seen = 'cancel';
189 sender.close();
190 }));
191 test.assertThrows( 213 test.assertThrows(
192 sender.cancel, sender, [], 'Cancel already in progress'); 214 sender.cancel, sender, [], 'Cancel already in progress');
193 test.assertThrows(sender.send, sender, [], 'Cancel in progress'); 215 test.assertThrows(sender.send, sender, [], 'Cancel in progress');
194 })); 216 });
195 }, 217 },
196 218
197 function testClose() { 219 function testClose() {
198 createSender().then(test.callbackPass(function(sender) { 220 var sender = createSender();
199 var seen = null; 221 expectOrder([
200 sender.send(generateData(1, 'b')).catch(test.callbackPass(function(e) { 222 sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)),
201 test.assertEq(FATAL_ERROR, e.error); 223 sender.then(cancelSend(3)),
202 test.assertEq(0, e.bytesSent); 224 ]);
203 test.assertEq(null, seen); 225 sender
204 seen = 'send'; 226 .then(closeSender)
205 })); 227 .then(sendAfterClose)
206 sender.cancel(3).then(test.callbackPass(function() { 228 .then(test.succeed, test.fail);
207 test.assertEq('send', seen); 229 },
208 seen = 'cancel'; 230
209 sender.close(); 231 function testSendAfterSerialization() {
210 })); 232 var sender = createSender().then(serializeRoundTrip);
211 sender.close(); 233 expectOrder([
212 test.assertThrows( 234 sender.then(sendAndExpectSuccess(generateData(1))),
213 sender.cancel, sender, [], 'DataSender has been closed'); 235 sender.then(sendAndExpectSuccess(generateData(1))),
214 test.assertThrows(sender.send, sender, [], 'DataSender has been closed'); 236 ])
215 })); 237 .then(closeSender)
238 .then(test.succeed, test.fail);
239 },
240
241 function testSendErrorAfterSerialization() {
242 createSender()
243 .then(serializeRoundTrip)
244 .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 0))
245 .then(sendAndExpectSuccess(generateData(1)))
246 .then(closeSender)
247 .then(test.succeed, test.fail);
248 },
249
250
251 function testCancelAfterSerialization() {
252 var sender = createSender().then(serializeRoundTrip);
253 expectOrder([
254 sender.then(sendAndExpectError(generateData(1, 'b'), 4, 0)),
255 sender.then(cancelSend(4)),
256 ])
257 .then(closeSender)
258 .then(test.succeed, test.fail);
259 },
260
261 function testSerializeCancelsSendsInProgress() {
262 var sender = createSender();
263 expectOrder([
264 sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)),
265 sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)),
266 sender.then(serializeRoundTrip),
267 ])
268 .then(closeSender)
269 .then(test.succeed, test.fail);
270 },
271
272 function testSerializeWaitsForCancel() {
273 var sender = createSender();
274 expectOrder([
275 sender.then(sendAndExpectError(generateData(1, 'b'), 3, 0)),
276 sender.then(cancelSend(3)),
277 sender.then(serializeRoundTrip),
278 ])
279 .then(closeSender)
280 .then(test.succeed, test.fail);
281 },
282
283 function testSerializeAfterClose() {
284 createSender()
285 .then(closeSender)
286 .then(serializeRoundTrip)
287 .then(sendAfterClose)
288 .then(test.succeed, test.fail);
216 }, 289 },
217 290
218 ], test.runTests, exports); 291 ], test.runTests, exports);
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698