| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 // Tests launched by extensions/renderer/api/serial/data_sender_unittest.cc | |
| 6 | |
| 7 var test = require('test').binding; | |
| 8 var unittestBindings = require('test_environment_specific_bindings'); | |
| 9 | |
| 10 var BUFFER_SIZE = 11; | |
| 11 var FATAL_ERROR = 2; | |
| 12 | |
| 13 function generateData(size, pattern) { | |
| 14 if (!pattern) | |
| 15 pattern = 'a'; | |
| 16 var buffer = new ArrayBuffer(size); | |
| 17 var intView = new Int8Array(buffer); | |
| 18 for (var i = 0; i < size; i++) { | |
| 19 intView[i] = pattern.charCodeAt(i % pattern.length); | |
| 20 } | |
| 21 return buffer; | |
| 22 } | |
| 23 | |
| 24 // Returns a promise to a newly created DataSender. | |
| 25 function createSender() { | |
| 26 return Promise.all([ | |
| 27 requireAsync('content/public/renderer/frame_interfaces'), | |
| 28 requireAsync('data_sender'), | |
| 29 requireAsync('device/serial/data_stream.mojom'), | |
| 30 ]).then(function(modules) { | |
| 31 var frameInterfaces = modules[0]; | |
| 32 var dataSender = modules[1]; | |
| 33 var dataStream = modules[2]; | |
| 34 return new dataSender.DataSender( | |
| 35 frameInterfaces.getInterface(dataStream.DataSink.name), | |
| 36 BUFFER_SIZE, | |
| 37 FATAL_ERROR); | |
| 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; | |
| 118 } | |
| 119 | |
| 120 unittestBindings.exportTests([ | |
| 121 function testSend() { | |
| 122 var sender = createSender(); | |
| 123 expectOrder([ | |
| 124 sender.then(sendAndExpectSuccess(generateData(1))), | |
| 125 sender.then(sendAndExpectSuccess(generateData(1))), | |
| 126 ]) | |
| 127 .then(closeSender) | |
| 128 .then(test.succeed, test.fail); | |
| 129 }, | |
| 130 | |
| 131 function testLargeSend() { | |
| 132 createSender() | |
| 133 .then(sendAndExpectSuccess(generateData(BUFFER_SIZE * 3, '123'))) | |
| 134 .then(closeSender) | |
| 135 .then(test.succeed, test.fail); | |
| 136 }, | |
| 137 | |
| 138 function testSendError() { | |
| 139 createSender() | |
| 140 .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 0)) | |
| 141 .then(sendAndExpectSuccess(generateData(1))) | |
| 142 .then(closeSender) | |
| 143 .then(test.succeed, test.fail); | |
| 144 }, | |
| 145 | |
| 146 function testSendErrorPartialSuccess() { | |
| 147 createSender() | |
| 148 .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 5)) | |
| 149 .then(sendAndExpectSuccess(generateData(1))) | |
| 150 .then(closeSender) | |
| 151 .then(test.succeed, test.fail); | |
| 152 }, | |
| 153 | |
| 154 function testSendErrorBetweenPackets() { | |
| 155 var sender = createSender(); | |
| 156 expectOrder([ | |
| 157 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 2)), | |
| 158 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 0)), | |
| 159 ]) | |
| 160 .then(sendAndExpectSuccess(generateData(1))) | |
| 161 .then(closeSender) | |
| 162 .then(test.succeed, test.fail); | |
| 163 }, | |
| 164 | |
| 165 function testSendErrorInSecondPacket() { | |
| 166 var sender = createSender(); | |
| 167 expectOrder([ | |
| 168 sender.then(sendAndExpectSuccess(generateData(2, 'b'))), | |
| 169 sender.then(sendAndExpectError(generateData(2, 'b'), 1, 1)), | |
| 170 ]) | |
| 171 .then(sendAndExpectSuccess(generateData(1))) | |
| 172 .then(closeSender) | |
| 173 .then(test.succeed, test.fail); | |
| 174 }, | |
| 175 | |
| 176 function testSendErrorInLargeSend() { | |
| 177 createSender() | |
| 178 .then(sendAndExpectError( | |
| 179 generateData(BUFFER_SIZE * 3, '1234567890'), 1, 12)) | |
| 180 .then(sendAndExpectSuccess(generateData(1))) | |
| 181 .then(closeSender) | |
| 182 .then(test.succeed, test.fail); | |
| 183 }, | |
| 184 | |
| 185 function testSendErrorBeforeLargeSend() { | |
| 186 var sender = createSender(); | |
| 187 expectOrder([ | |
| 188 sender.then(sendAndExpectError(generateData(5, 'b'), 1, 2)), | |
| 189 sender.then(sendAndExpectError( | |
| 190 generateData(BUFFER_SIZE * 3, '1234567890'), 1, 0)), | |
| 191 ]) | |
| 192 .then(sendAndExpectSuccess(generateData(1))) | |
| 193 .then(closeSender) | |
| 194 .then(test.succeed, test.fail); | |
| 195 }, | |
| 196 | |
| 197 function testCancelWithoutSend() { | |
| 198 createSender() | |
| 199 .then(cancelSend(3)) | |
| 200 .then(closeSender) | |
| 201 .then(test.succeed, test.fail); | |
| 202 }, | |
| 203 | |
| 204 function testCancel() { | |
| 205 var sender = createSender(); | |
| 206 expectOrder([ | |
| 207 sender.then(sendAndExpectError(generateData(1, 'b'), 3, 0)), | |
| 208 sender.then(cancelSend(3)), | |
| 209 ]) | |
| 210 .then(closeSender) | |
| 211 .then(test.succeed, test.fail); | |
| 212 sender.then(function(sender) { | |
| 213 test.assertThrows( | |
| 214 sender.cancel, sender, [], 'Cancel already in progress'); | |
| 215 test.assertThrows(sender.send, sender, [], 'Cancel in progress'); | |
| 216 }); | |
| 217 }, | |
| 218 | |
| 219 function testClose() { | |
| 220 var sender = createSender(); | |
| 221 expectOrder([ | |
| 222 sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)), | |
| 223 sender.then(cancelSend(3)), | |
| 224 ]); | |
| 225 sender | |
| 226 .then(closeSender) | |
| 227 .then(sendAfterClose) | |
| 228 .then(test.succeed, test.fail); | |
| 229 }, | |
| 230 | |
| 231 function testSendAfterSerialization() { | |
| 232 var sender = createSender().then(serializeRoundTrip); | |
| 233 expectOrder([ | |
| 234 sender.then(sendAndExpectSuccess(generateData(1))), | |
| 235 sender.then(sendAndExpectSuccess(generateData(1))), | |
| 236 ]) | |
| 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); | |
| 289 }, | |
| 290 | |
| 291 ], test.runTests, exports); | |
| OLD | NEW |