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

Unified 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: clean up jsdoc 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « extensions/test/data/data_receiver_unittest.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « extensions/test/data/data_receiver_unittest.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698