103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file.
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Tests launched by extensions/renderer/api/serial/data_sender_unittest.cc
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)var test = require('test').binding;
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)var unittestBindings = require('test_environment_specific_bindings');
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)var BUFFER_SIZE = 11;
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)var FATAL_ERROR = 2;
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)function generateData(size, pattern) {
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!pattern)
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    pattern = 'a';
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  var buffer = new ArrayBuffer(size);
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  var intView = new Int8Array(buffer);
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (var i = 0; i < size; i++) {
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    intView[i] = pattern.charCodeAt(i % pattern.length);
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return buffer;
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Returns a promise to a newly created DataSender.
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)function createSender() {
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return Promise.all([
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    requireAsync('content/public/renderer/service_provider'),
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    requireAsync('data_sender'),
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    requireAsync('device/serial/data_stream.mojom'),
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ]).then(function(modules) {
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    var serviceProvider = modules[0];
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    var dataSender = modules[1];
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    var dataStream = modules[2];
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return new dataSender.DataSender(
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        serviceProvider.connectToService(dataStream.DataSinkProxy.NAME_),
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        BUFFER_SIZE,
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        FATAL_ERROR);
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  });
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Returns a function that sends data to a provided DataSender |sender|,
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// checks that the send completes successfully and returns a promise that will
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// resolve to |sender|.
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction sendAndExpectSuccess(data) {
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return function(sender) {
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return sender.send(data).then(function(bytesSent) {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.assertEq(data.byteLength, bytesSent);
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return sender;
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Returns a function that sends data to a provided DataSender |sender|,
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// checks that the send fails with the expected error and expected number of
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// bytes sent, and returns a promise that will resolve to |sender|.
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction sendAndExpectError(data, expectedError, expectedBytesSent) {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return function(sender) {
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return sender.send(data).catch(function(result) {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.assertEq(expectedError, result.error);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.assertEq(expectedBytesSent, result.bytesSent);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return sender;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Returns a function that cancels sends on the provided DataSender |sender|
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// with error |cancelReason|, returning a promise that will resolve to |sender|
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// once the cancel completes.
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction cancelSend(cancelReason) {
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return function(sender) {
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return sender.cancel(cancelReason).then(function() {
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return sender;
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Checks that attempting to start a send with |sender| fails.
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction sendAfterClose(sender) {
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test.assertThrows(sender.send, sender, [], 'DataSender has been closed');
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Checks that the provided promises resolve in order, returning the result of
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// the first.
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction expectOrder(promises) {
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var nextIndex = 0;
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function createOrderChecker(promise, expectedIndex) {
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return promise.then(function(sender) {
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.assertEq(nextIndex, expectedIndex);
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      nextIndex++;
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return sender;
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var wrappedPromises = [];
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (var i = 0; i < promises.length; i++) {
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    wrappedPromises.push(createOrderChecker(promises[i], i));
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return Promise.all(wrappedPromises).then(function(results) {
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return results[0];
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  });
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Serializes and deserializes the provided DataSender |sender|, returning a
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// promise that will resolve to the newly deserialized DataSender.
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction serializeRoundTrip(sender) {
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return Promise.all([
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sender.serialize(),
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    requireAsync('data_sender'),
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ]).then(function(promises) {
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var serialized = promises[0];
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var dataSenderModule = promises[1];
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return dataSenderModule.DataSender.deserialize(serialized);
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  });
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction closeSender(sender) {
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sender.close();
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return sender;
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)unittestBindings.exportTests([
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  function testSend() {
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var sender = createSender();
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expectOrder([
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectSuccess(generateData(1))),
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectSuccess(generateData(1))),
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  function testLargeSend() {
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    createSender()
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectSuccess(generateData(BUFFER_SIZE * 3, '123')))
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  function testSendError() {
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    createSender()
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 0))
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectSuccess(generateData(1)))
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  function testSendErrorPartialSuccess() {
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    createSender()
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 5))
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectSuccess(generateData(1)))
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  function testSendErrorBetweenPackets() {
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var sender = createSender();
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expectOrder([
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectError(generateData(2, 'b'), 1, 2)),
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectError(generateData(2, 'b'), 1, 0)),
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectSuccess(generateData(1)))
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
16403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  function testSendErrorInSecondPacket() {
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var sender = createSender();
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expectOrder([
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectSuccess(generateData(2, 'b'))),
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectError(generateData(2, 'b'), 1, 1)),
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectSuccess(generateData(1)))
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  function testSendErrorInLargeSend() {
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    createSender()
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectError(
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            generateData(BUFFER_SIZE * 3, '1234567890'), 1, 12))
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectSuccess(generateData(1)))
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
18403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
18503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  function testSendErrorBeforeLargeSend() {
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var sender = createSender();
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expectOrder([
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectError(generateData(5, 'b'), 1, 2)),
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectError(
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            generateData(BUFFER_SIZE * 3, '1234567890'), 1, 0)),
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectSuccess(generateData(1)))
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
19603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  function testCancelWithoutSend() {
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    createSender()
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(cancelSend(3))
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
20403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  function testCancel() {
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var sender = createSender();
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expectOrder([
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectError(generateData(1, 'b'), 3, 0)),
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(cancelSend(3)),
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sender.then(function(sender) {
21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      test.assertThrows(
21403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          sender.cancel, sender, [], 'Cancel already in progress');
21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      test.assertThrows(sender.send, sender, [], 'Cancel in progress');
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  function testClose() {
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var sender = createSender();
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expectOrder([
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)),
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(cancelSend(3)),
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ]);
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sender
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAfterClose)
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSendAfterSerialization() {
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var sender = createSender().then(serializeRoundTrip);
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expectOrder([
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectSuccess(generateData(1))),
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectSuccess(generateData(1))),
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSendErrorAfterSerialization() {
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    createSender()
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(serializeRoundTrip)
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectError(generateData(BUFFER_SIZE * 3, 'b'), 1, 0))
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAndExpectSuccess(generateData(1)))
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testCancelAfterSerialization() {
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var sender = createSender().then(serializeRoundTrip);
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expectOrder([
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectError(generateData(1, 'b'), 4, 0)),
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(cancelSend(4)),
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSerializeCancelsSendsInProgress() {
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var sender = createSender();
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expectOrder([
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)),
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectError(generateData(1, 'b'), FATAL_ERROR, 0)),
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(serializeRoundTrip),
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSerializeWaitsForCancel() {
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var sender = createSender();
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    expectOrder([
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(sendAndExpectError(generateData(1, 'b'), 3, 0)),
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(cancelSend(3)),
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        sender.then(serializeRoundTrip),
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ])
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSerializeAfterClose() {
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    createSender()
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(closeSender)
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(serializeRoundTrip)
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(sendAfterClose)
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        .then(test.succeed, test.fail);
28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  },
29003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
29103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)], test.runTests, exports);
292