| Index: extensions/test/data/data_sender_unittest.js
|
| diff --git a/extensions/test/data/data_sender_unittest.js b/extensions/test/data/data_sender_unittest.js
|
| index 78568c90740baa68a8c0035ce3be8c7e6cbd7470..46db7100a47e34185b65a621d87a82f63f33089d 100644
|
| --- a/extensions/test/data/data_sender_unittest.js
|
| +++ b/extensions/test/data/data_sender_unittest.js
|
| @@ -21,12 +21,13 @@ function generateData(size, pattern) {
|
| return buffer;
|
| }
|
|
|
| +// Returns a promise to a newly created DataSender.
|
| function createSender() {
|
| return Promise.all([
|
| requireAsync('content/public/renderer/service_provider'),
|
| requireAsync('data_sender'),
|
| requireAsync('device/serial/data_stream.mojom'),
|
| - ]).then(test.callbackPass(function(modules) {
|
| + ]).then(function(modules) {
|
| var serviceProvider = modules[0];
|
| var dataSender = modules[1];
|
| var dataStream = modules[2];
|
| @@ -34,185 +35,257 @@ function createSender() {
|
| serviceProvider.connectToService(dataStream.DataSinkProxy.NAME_),
|
| BUFFER_SIZE,
|
| FATAL_ERROR);
|
| - }));
|
| + });
|
| +}
|
| +
|
| +// Returns a function that sends data to a provided DataSender |sender|,
|
| +// checks that the send completes successfully and returns a promise that will
|
| +// resolve to |sender|.
|
| +function sendAndExpectSuccess(data) {
|
| + return function(sender) {
|
| + return sender.send(data).then(function(bytesSent) {
|
| + test.assertEq(data.byteLength, bytesSent);
|
| + return sender;
|
| + });
|
| + };
|
| +}
|
| +
|
| +// Returns a function that sends data to a provided DataSender |sender|,
|
| +// checks that the send fails with the expected error and expected number of
|
| +// bytes sent, and returns a promise that will resolve to |sender|.
|
| +function sendAndExpectError(data, expectedError, expectedBytesSent) {
|
| + return function(sender) {
|
| + return sender.send(data).catch(function(result) {
|
| + test.assertEq(expectedError, result.error);
|
| + test.assertEq(expectedBytesSent, result.bytesSent);
|
| + return sender;
|
| + });
|
| + };
|
| +}
|
| +
|
| +// Returns a function that cancels sends on the provided DataSender |sender|
|
| +// with error |cancelReason|, returning a promise that will resolve to |sender|
|
| +// once the cancel completes.
|
| +function cancelSend(cancelReason) {
|
| + return function(sender) {
|
| + return sender.cancel(cancelReason).then(function() {
|
| + return sender;
|
| + });
|
| + };
|
| +}
|
| +
|
| +// Checks that attempting to start a send with |sender| fails.
|
| +function sendAfterClose(sender) {
|
| + test.assertThrows(sender.send, sender, [], 'DataSender has been closed');
|
| +}
|
| +
|
| +// Checks that the provided promises resolve in order, returning the result of
|
| +// the first.
|
| +function expectOrder(promises) {
|
| + var nextIndex = 0;
|
| + function createOrderChecker(promise, expectedIndex) {
|
| + return promise.then(function(sender) {
|
| + test.assertEq(nextIndex, expectedIndex);
|
| + nextIndex++;
|
| + return sender;
|
| + });
|
| + }
|
| + var wrappedPromises = [];
|
| + for (var i = 0; i < promises.length; i++) {
|
| + wrappedPromises.push(createOrderChecker(promises[i], i));
|
| + }
|
| + return Promise.all(wrappedPromises).then(function(results) {
|
| + return results[0];
|
| + });
|
| +}
|
| +
|
| +// Serializes and deserializes the provided DataSender |sender|, returning a
|
| +// promise that will resolve to the newly deserialized DataSender.
|
| +function serializeRoundTrip(sender) {
|
| + return Promise.all([
|
| + sender.serialize(),
|
| + requireAsync('data_sender'),
|
| + ]).then(function(promises) {
|
| + var serialized = promises[0];
|
| + var dataSenderModule = promises[1];
|
| + return dataSenderModule.DataSender.deserialize(serialized);
|
| + });
|
| +}
|
| +
|
| +function closeSender(sender) {
|
| + sender.close();
|
| + return sender;
|
| }
|
|
|
| unittestBindings.exportTests([
|
| function testSend() {
|
| - createSender().then(test.callbackPass(function(sender) {
|
| - var seen = null;
|
| - sender.send(generateData(1)).then(test.callbackPass(function(bytesSent) {
|
| - test.assertEq(1, bytesSent);
|
| - test.assertEq(null, seen);
|
| - seen = 'first';
|
| - }));
|
| - sender.send(generateData(1)).then(test.callbackPass(function(bytesSent) {
|
| - sender.close();
|
| - test.assertEq(1, bytesSent);
|
| - test.assertEq('first', seen);
|
| - seen = 'second';
|
| - }));
|
| - }));
|
| + var sender = createSender();
|
| + expectOrder([
|
| + sender.then(sendAndExpectSuccess(generateData(1))),
|
| + sender.then(sendAndExpectSuccess(generateData(1))),
|
| + ])
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| },
|
|
|
| function testLargeSend() {
|
| - createSender().then(test.callbackPass(function(sender) {
|
| - sender.send(generateData(BUFFER_SIZE * 3, '123')).then(
|
| - test.callbackPass(function(bytesSent) {
|
| - test.assertEq(BUFFER_SIZE * 3, bytesSent);
|
| - sender.close();
|
| - }));
|
| - }));
|
| + createSender()
|
| + .then(sendAndExpectSuccess(generateData(BUFFER_SIZE * 3, '123')))
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| },
|
|
|
| function testSendError() {
|
| - createSender().then(test.callbackPass(function(sender) {
|
| - sender.send(generateData(BUFFER_SIZE * 3, 'b')).catch(test.callbackPass(
|
| - function(e) {
|
| - test.assertEq(1, e.error);
|
| - test.assertEq(0, e.bytesSent);
|
| - sender.send(generateData(1)).then(test.callbackPass(
|
| - function(bytesSent) {
|
| - test.assertEq(1, bytesSent);
|
| - sender.close();
|
| - }));
|
| - }));
|
| - }));
|
| + createSender()
|
| + .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 0))
|
| + .then(sendAndExpectSuccess(generateData(1)))
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| },
|
|
|
| function testSendErrorPartialSuccess() {
|
| - createSender().then(test.callbackPass(function(sender) {
|
| - sender.send(generateData(BUFFER_SIZE * 3, 'b')).catch(test.callbackPass(
|
| - function(e) {
|
| - test.assertEq(1, e.error);
|
| - test.assertEq(5, e.bytesSent);
|
| - sender.send(generateData(1)).then(test.callbackPass(
|
| - function(bytesSent) {
|
| - test.assertEq(1, bytesSent);
|
| - sender.close();
|
| - }));
|
| - }));
|
| - }));
|
| + createSender()
|
| + .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 5))
|
| + .then(sendAndExpectSuccess(generateData(1)))
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| },
|
|
|
| function testSendErrorBetweenPackets() {
|
| - createSender().then(test.callbackPass(function(sender) {
|
| - sender.send(generateData(2, 'b')).catch(test.callbackPass(function(e) {
|
| - test.assertEq(1, e.error);
|
| - test.assertEq(2, e.bytesSent);
|
| - }));
|
| - // After an error, all sends in progress will be cancelled.
|
| - sender.send(generateData(2, 'b')).catch(test.callbackPass(function(e) {
|
| - test.assertEq(1, e.error);
|
| - test.assertEq(0, e.bytesSent);
|
| - sender.send(generateData(1)).then(test.callbackPass(
|
| - function(bytesSent) {
|
| - test.assertEq(1, bytesSent);
|
| - sender.close();
|
| - }));
|
| - }));
|
| - }));
|
| + var sender = createSender();
|
| + expectOrder([
|
| + sender.then(sendAndExpectError(generateData(2, 'b'), 1, 2)),
|
| + sender.then(sendAndExpectError(generateData(2, 'b'), 1, 0)),
|
| + ])
|
| + .then(sendAndExpectSuccess(generateData(1)))
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| },
|
|
|
| function testSendErrorInSecondPacket() {
|
| - createSender().then(test.callbackPass(function(sender) {
|
| - sender.send(generateData(2, 'b')).then(test.callbackPass(
|
| - function(bytesSent) {
|
| - test.assertEq(2, bytesSent);
|
| - }));
|
| - sender.send(generateData(2, 'b')).catch(test.callbackPass(function(e) {
|
| - test.assertEq(1, e.error);
|
| - test.assertEq(1, e.bytesSent);
|
| - sender.send(generateData(1)).then(test.callbackPass(
|
| - function(bytesSent) {
|
| - test.assertEq(1, bytesSent);
|
| - sender.close();
|
| - }));
|
| - }));
|
| - }));
|
| + var sender = createSender();
|
| + expectOrder([
|
| + sender.then(sendAndExpectSuccess(generateData(2, 'b'))),
|
| + sender.then(sendAndExpectError(generateData(2, 'b'), 1, 1)),
|
| + ])
|
| + .then(sendAndExpectSuccess(generateData(1)))
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| },
|
|
|
| function testSendErrorInLargeSend() {
|
| - createSender().then(test.callbackPass(function(sender) {
|
| - sender.send(generateData(BUFFER_SIZE * 3, '1234567890')).catch(
|
| - test.callbackPass(function(e) {
|
| - test.assertEq(1, e.error);
|
| - test.assertEq(12, e.bytesSent);
|
| - sender.send(generateData(1)).then(test.callbackPass(
|
| - function(bytesSent) {
|
| - test.assertEq(1, bytesSent);
|
| - sender.close();
|
| - }));
|
| - }));
|
| - }));
|
| + createSender()
|
| + .then(sendAndExpectError(
|
| + generateData(BUFFER_SIZE * 3, '1234567890'), 1, 12))
|
| + .then(sendAndExpectSuccess(generateData(1)))
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| },
|
|
|
| function testSendErrorBeforeLargeSend() {
|
| - createSender().then(test.callbackPass(function(sender) {
|
| - sender.send(generateData(5, 'b')).catch(test.callbackPass(function(e) {
|
| - test.assertEq(1, e.error);
|
| - test.assertEq(2, e.bytesSent);
|
| - }));
|
| - sender.send(generateData(BUFFER_SIZE * 3, '1234567890')).catch(
|
| - test.callbackPass(function(e) {
|
| - test.assertEq(1, e.error);
|
| - test.assertEq(0, e.bytesSent);
|
| - sender.send(generateData(1)).then(test.callbackPass(
|
| - function(bytesSent) {
|
| - test.assertEq(1, bytesSent);
|
| - sender.close();
|
| - }));
|
| - }));
|
| - }));
|
| + var sender = createSender();
|
| + expectOrder([
|
| + sender.then(sendAndExpectError(generateData(5, 'b'), 1, 2)),
|
| + sender.then(sendAndExpectError(
|
| + generateData(BUFFER_SIZE * 3, '1234567890'), 1, 0)),
|
| + ])
|
| + .then(sendAndExpectSuccess(generateData(1)))
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| },
|
|
|
| function testCancelWithoutSend() {
|
| - createSender().then(test.callbackPass(function(sender) {
|
| - sender.cancel(3).then(test.callbackPass(function() {
|
| - sender.close();
|
| - }));
|
| - }));
|
| + createSender()
|
| + .then(cancelSend(3))
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| },
|
|
|
| function testCancel() {
|
| - createSender().then(test.callbackPass(function(sender) {
|
| - var seen = null;
|
| - sender.send(generateData(1, 'b')).catch(test.callbackPass(function(e) {
|
| - test.assertEq(3, e.error);
|
| - test.assertEq(0, e.bytesSent);
|
| - test.assertEq(null, seen);
|
| - seen = 'send';
|
| - }));
|
| - sender.cancel(3).then(test.callbackPass(function() {
|
| - test.assertEq('send', seen);
|
| - seen = 'cancel';
|
| - sender.close();
|
| - }));
|
| + var sender = createSender();
|
| + expectOrder([
|
| + sender.then(sendAndExpectError(generateData(1, 'b'), 3, 0)),
|
| + sender.then(cancelSend(3)),
|
| + ])
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| + sender.then(function(sender) {
|
| test.assertThrows(
|
| sender.cancel, sender, [], 'Cancel already in progress');
|
| test.assertThrows(sender.send, sender, [], 'Cancel in progress');
|
| - }));
|
| + });
|
| },
|
|
|
| function testClose() {
|
| - createSender().then(test.callbackPass(function(sender) {
|
| - var seen = null;
|
| - sender.send(generateData(1, 'b')).catch(test.callbackPass(function(e) {
|
| - test.assertEq(FATAL_ERROR, e.error);
|
| - test.assertEq(0, e.bytesSent);
|
| - test.assertEq(null, seen);
|
| - seen = 'send';
|
| - }));
|
| - sender.cancel(3).then(test.callbackPass(function() {
|
| - test.assertEq('send', seen);
|
| - seen = 'cancel';
|
| - sender.close();
|
| - }));
|
| - sender.close();
|
| - test.assertThrows(
|
| - sender.cancel, sender, [], 'DataSender has been closed');
|
| - test.assertThrows(sender.send, sender, [], 'DataSender has been closed');
|
| - }));
|
| + var sender = createSender();
|
| + expectOrder([
|
| + sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)),
|
| + sender.then(cancelSend(3)),
|
| + ]);
|
| + sender
|
| + .then(closeSender)
|
| + .then(sendAfterClose)
|
| + .then(test.succeed, test.fail);
|
| + },
|
| +
|
| + function testSendAfterSerialization() {
|
| + var sender = createSender().then(serializeRoundTrip);
|
| + expectOrder([
|
| + sender.then(sendAndExpectSuccess(generateData(1))),
|
| + sender.then(sendAndExpectSuccess(generateData(1))),
|
| + ])
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| + },
|
| +
|
| + function testSendErrorAfterSerialization() {
|
| + createSender()
|
| + .then(serializeRoundTrip)
|
| + .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 0))
|
| + .then(sendAndExpectSuccess(generateData(1)))
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| + },
|
| +
|
| +
|
| + function testCancelAfterSerialization() {
|
| + var sender = createSender().then(serializeRoundTrip);
|
| + expectOrder([
|
| + sender.then(sendAndExpectError(generateData(1, 'b'), 4, 0)),
|
| + sender.then(cancelSend(4)),
|
| + ])
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| + },
|
| +
|
| + function testSerializeCancelsSendsInProgress() {
|
| + var sender = createSender();
|
| + expectOrder([
|
| + sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)),
|
| + sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)),
|
| + sender.then(serializeRoundTrip),
|
| + ])
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| + },
|
| +
|
| + function testSerializeWaitsForCancel() {
|
| + var sender = createSender();
|
| + expectOrder([
|
| + sender.then(sendAndExpectError(generateData(1, 'b'), 3, 0)),
|
| + sender.then(cancelSend(3)),
|
| + sender.then(serializeRoundTrip),
|
| + ])
|
| + .then(closeSender)
|
| + .then(test.succeed, test.fail);
|
| + },
|
| +
|
| + function testSerializeAfterClose() {
|
| + createSender()
|
| + .then(closeSender)
|
| + .then(serializeRoundTrip)
|
| + .then(sendAfterClose)
|
| + .then(test.succeed, test.fail);
|
| },
|
|
|
| ], test.runTests, exports);
|
|
|