15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/**
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * Unit tests for the JS serial service client.
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) *
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * These test that configuration and data are correctly transmitted between the
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * client and the service. They are launched by
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * extensions/renderer/api/serial/serial_api_unittest.cc.
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)var test = require('test').binding;
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)var serial = require('serial').binding;
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)var unittestBindings = require('test_environment_specific_bindings');
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar utils = require('utils');
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar timeoutManager = new unittestBindings.TimeoutManager();
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TuccitimeoutManager.installGlobals();
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar BUFFER_SIZE = 10;
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)var connectionId = null;
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)function connect(callback, options) {
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  options = options || {
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    name: 'test connection',
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bufferSize: BUFFER_SIZE,
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    receiveTimeout: 12345,
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    sendTimeout: 6789,
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    persistent: true,
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  serial.connect('device', options, test.callbackPass(function(connectionInfo) {
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connectionId = connectionInfo.connectionId;
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (callback)
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      callback(connectionInfo);
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }));
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Sets a function to be called once when data is received. Returns a promise
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// that will resolve once the hook is installed.
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction addReceiveHook(callback) {
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return requireAsync('serial_service').then(function(serialService) {
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var called = false;
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var dataReceived = serialService.Connection.prototype.onDataReceived_;
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    serialService.Connection.prototype.onDataReceived_ = function() {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      var result = $Function.apply(dataReceived, this, arguments);
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!called)
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        callback();
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      called = true;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return result;
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    };
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  });
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Sets a function to be called once when a receive error is received. Returns a
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// promise that will resolve once the hook is installed.
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction addReceiveErrorHook(callback) {
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return requireAsync('serial_service').then(function(serialService) {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var called = false;
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var receiveError = serialService.Connection.prototype.onReceiveError_;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    serialService.Connection.prototype.onReceiveError_ = function() {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      var result = $Function.apply(receiveError, this, arguments);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      if (!called)
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        callback();
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      called = true;
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return result;
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    };
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  });
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)function disconnect() {
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  serial.disconnect(connectionId, test.callbackPass(function(success) {
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    test.assertTrue(success);
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connectionId = null;
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }));
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)function checkClientConnectionInfo(connectionInfo) {
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test.assertFalse(connectionInfo.persistent);
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test.assertEq('test connection', connectionInfo.name);
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test.assertEq(12345, connectionInfo.receiveTimeout);
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test.assertEq(6789, connectionInfo.sendTimeout);
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test.assertEq(BUFFER_SIZE, connectionInfo.bufferSize);
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test.assertFalse(connectionInfo.paused);
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)function checkServiceConnectionInfo(connectionInfo) {
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test.assertEq(9600, connectionInfo.bitrate);
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test.assertEq('eight', connectionInfo.dataBits);
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test.assertEq('no', connectionInfo.parityBit);
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test.assertEq('one', connectionInfo.stopBits);
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  test.assertFalse(connectionInfo.ctsFlowControl);
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)function checkConnectionInfo(connectionInfo) {
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  checkClientConnectionInfo(connectionInfo);
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  checkServiceConnectionInfo(connectionInfo);
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction runReceiveErrorTest(expectedError) {
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  connect();
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test.listenOnce(serial.onReceiveError, function(result) {
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    serial.getInfo(connectionId, test.callbackPass(function(connectionInfo) {
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      disconnect();
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.assertTrue(connectionInfo.paused);
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }));
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test.assertEq(connectionId, result.connectionId);
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test.assertEq(expectedError, result.error);
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  });
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction runSendErrorTest(expectedError) {
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  connect(function() {
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var buffer = new ArrayBuffer(1);
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    serial.send(connectionId, buffer, test.callbackPass(function(sendInfo) {
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      disconnect();
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.assertEq(0, sendInfo.bytesSent);
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.assertEq(expectedError, sendInfo.error);
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }));
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  });
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction sendData() {
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var data = 'data';
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var buffer = new ArrayBuffer(data.length);
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var byteBuffer = new Int8Array(buffer);
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (var i = 0; i < data.length; i++) {
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    byteBuffer[i] = data.charCodeAt(i);
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return utils.promise(serial.send, connectionId, buffer);
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccifunction checkReceivedData(result) {
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var data = 'data';
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test.assertEq(connectionId, result.connectionId);
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  test.assertEq(data.length, result.data.byteLength);
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var resultByteBuffer = new Int8Array(result.data);
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (var i = 0; i < data.length; i++) {
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test.assertEq(data.charCodeAt(i), resultByteBuffer[i]);
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)unittestBindings.exportTests([
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that getDevices correctly transforms the data returned by the
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // SerialDeviceEnumerator.
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  function testGetDevices() {
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    serial.getDevices(test.callbackPass(function(devices) {
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      test.assertEq(3, devices.length);
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      test.assertEq(4, $Object.keys(devices[0]).length);
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      test.assertEq('device', devices[0].path);
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      test.assertEq(1234, devices[0].vendorId);
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      test.assertEq(5678, devices[0].productId);
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      test.assertEq('foo', devices[0].displayName);
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      test.assertEq(1, $Object.keys(devices[1]).length);
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      test.assertEq('another_device', devices[1].path);
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      test.assertEq(1, $Object.keys(devices[2]).length);
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      test.assertEq('', devices[2].path);
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }));
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  },
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that the correct error message is returned when an error occurs in
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // connecting to the port. This test uses an IoHandler that fails to connect.
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testConnectFail() {
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    serial.connect('device',
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   test.callbackFail('Failed to connect to the port.'));
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that the correct error message is returned when an error occurs in
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // calling getPortInfo after connecting to the port. This test uses an
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // IoHandler that fails on calls to GetPortInfo.
1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testGetInfoFailOnConnect() {
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    serial.connect('device',
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                   test.callbackFail('Failed to connect to the port.'));
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that the correct error message is returned when an invalid bit-rate
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // value is passed to connect.
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testConnectInvalidBitrate() {
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    serial.connect('device', {bitrate: -1}, test.callbackFail(
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        'Failed to connect to the port.'));
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a successful connect returns the expected connection info.
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testConnect() {
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connect(function(connectionInfo) {
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      disconnect();
1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      checkConnectionInfo(connectionInfo);
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    });
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a connection created with no options has the correct default
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // options.
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testConnectDefaultOptions() {
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connect(function(connectionInfo) {
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      disconnect();
1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test.assertEq(9600, connectionInfo.bitrate);
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test.assertEq('eight', connectionInfo.dataBits);
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test.assertEq('no', connectionInfo.parityBit);
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test.assertEq('one', connectionInfo.stopBits);
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test.assertFalse(connectionInfo.ctsFlowControl);
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test.assertFalse(connectionInfo.persistent);
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test.assertEq('', connectionInfo.name);
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test.assertEq(0, connectionInfo.receiveTimeout);
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test.assertEq(0, connectionInfo.sendTimeout);
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      test.assertEq(4096, connectionInfo.bufferSize);
2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }, {});
2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a getInfo call correctly converts the service-side info from the
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Mojo format and returns both it and the client-side configuration.
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testGetInfo() {
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connect(function() {
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      serial.getInfo(connectionId,
2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     test.callbackPass(function(connectionInfo) {
2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        disconnect();
2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        checkConnectionInfo(connectionInfo);
2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }));
2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    });
2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that only client-side options are returned when the service fails a
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // getInfo call. This test uses an IoHandler that fails GetPortInfo calls
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // after the initial call during connect.
2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testGetInfoFailToGetPortInfo() {
2266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connect(function() {
2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      serial.getInfo(connectionId,
2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                     test.callbackPass(function(connectionInfo) {
2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        disconnect();
2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        checkClientConnectionInfo(connectionInfo);
2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertFalse('bitrate' in connectionInfo);
2326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertFalse('dataBits' in connectionInfo);
2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertFalse('parityBit' in connectionInfo);
2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertFalse('stopBit' in connectionInfo);
2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertFalse('ctsFlowControl' in connectionInfo);
2366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }));
2376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    });
2386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
2396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that getConnections returns an array containing the open connection.
2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testGetConnections() {
2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connect(function() {
2436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      serial.getConnections(test.callbackPass(function(connections) {
2446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        disconnect();
2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertEq(1, connections.length);
2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        checkConnectionInfo(connections[0]);
2476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }));
2486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    });
2496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that getControlSignals correctly converts the Mojo format result. This
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // test uses an IoHandler that returns values matching the pattern being
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // tested.
2546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testGetControlSignals() {
2556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connect(function() {
2566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      var calls = 0;
2576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      function checkControlSignals(signals) {
2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        if (calls == 15) {
2596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          disconnect();
2606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        } else {
2616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          serial.getControlSignals(
2626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              connectionId,
2636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              test.callbackPass(checkControlSignals));
2646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertEq(!!(calls & 1), signals.dcd);
2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertEq(!!(calls & 2), signals.cts);
2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertEq(!!(calls & 4), signals.ri);
2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertEq(!!(calls & 8), signals.dsr);
2696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        calls++;
2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }
2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      serial.getControlSignals(connectionId,
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                               test.callbackPass(checkControlSignals));
2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    });
2746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
2756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that setControlSignals correctly converts to the Mojo format result.
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This test uses an IoHandler that returns values following the same table of
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // values as |signalsValues|.
2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testSetControlSignals() {
2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connect(function() {
2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      var signalsValues = [
2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {},
2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {dtr: false},
2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {dtr: true},
2856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {rts: false},
2866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {dtr: false, rts: false},
2876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {dtr: true, rts: false},
2886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {rts: true},
2896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {dtr: false, rts: true},
2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {dtr: true, rts: true},
2916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ];
2926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      var calls = 0;
2936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      function setControlSignals(success) {
2946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        if (calls == signalsValues.length) {
2956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          disconnect();
2966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        } else {
2976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          serial.setControlSignals(connectionId,
2986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                   signalsValues[calls++],
2996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                   test.callbackPass(setControlSignals));
3006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
3016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertTrue(success);
3026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }
3036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      setControlSignals(true);
3046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    });
3056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that update correctly passes values to the service only for
3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // service-side options and that all update calls are reflected by the result
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // of getInfo calls. This test uses an IoHandler that expects corresponding
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // ConfigurePort calls.
3116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testUpdate() {
3126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connect(function() {
3136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      var optionsValues = [
3146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {},  // SetPortOptions is called once during connection.
3156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {bitrate: 57600},
3166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {dataBits: 'seven'},
3176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {dataBits: 'eight'},
3186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {parityBit: 'no'},
3196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {parityBit: 'odd'},
3206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {parityBit: 'even'},
3216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {stopBits: 'one'},
3226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {stopBits: 'two'},
3236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {ctsFlowControl: false},
3246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {ctsFlowControl: true},
3256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {bufferSize: 1},
3266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {sendTimeout: 0},
3276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {receiveTimeout: 0},
3286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {persistent: false},
3296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        {name: 'name'},
3306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ];
3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      var calls = 0;
3326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      function checkInfo(info) {
3336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        for (var key in optionsValues[calls]) {
3346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          test.assertEq(optionsValues[calls][key], info[key]);
3356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        setOptions();
3376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }
3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      function setOptions() {
3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        if (++calls == optionsValues.length) {
3406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          disconnect();
3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        } else {
3426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          serial.update(connectionId,
3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        optionsValues[calls],
3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                        test.callbackPass(function(success) {
3456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            serial.getInfo(connectionId, test.callbackPass(checkInfo));
3466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            test.assertTrue(success);
3476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          }));
3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
3496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }
3506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      setOptions();
3516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    });
3526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
3536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that passing an invalid bit-rate reslts in an error.
3556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testUpdateInvalidBitrate() {
3566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connect(function() {
3576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      serial.update(connectionId,
3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    {bitrate: -1},
3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                    test.callbackPass(function(success) {
3606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        disconnect();
3616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertFalse(success);
3626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }));
3636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    });
3646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
3656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test flush. This test uses an IoHandler that counts the number of flush
3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // calls.
3686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testFlush() {
3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connect(function() {
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      serial.flush(connectionId, test.callbackPass(function(success) {
3716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        disconnect();
3726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        test.assertTrue(success);
3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }));
3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    });
3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that setPaused values are reflected by the results returned by getInfo
3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // calls.
3796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testSetPaused() {
3806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    connect(function() {
3816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      serial.setPaused(connectionId, true, test.callbackPass(function() {
3826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        serial.getInfo(connectionId, test.callbackPass(function(info) {
3836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          serial.setPaused(connectionId, false, test.callbackPass(function() {
3846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            serial.getInfo(connectionId, test.callbackPass(function(info) {
3856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              test.assertFalse(info.paused);
3866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)              disconnect();
3876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            }));
3886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          }));
3896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          test.assertTrue(info.paused);
3906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }));
3916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      }));
3926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    });
3936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
3946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a send and a receive correctly echoes data. This uses an
3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // IoHandler that echoes data sent to it.
3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testEcho() {
3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connect(function() {
3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sendData().then(test.callbackPass(function(sendInfo) {
4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(4, sendInfo.bytesSent);
4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(undefined, sendInfo.error);
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }));
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.listenOnce(serial.onReceive, function(result) {
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        checkReceivedData(result);
4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        disconnect();
4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      });
4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a send while another send is in progress returns a pending error.
4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSendDuringExistingSend() {
4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connect(function() {
4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sendData().then(test.callbackPass(function(sendInfo) {
4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(4, sendInfo.bytesSent);
4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(undefined, sendInfo.error);
4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        disconnect();
4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }));
4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sendData().then(test.callbackPass(function(sendInfo) {
4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(0, sendInfo.bytesSent);
4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq('pending', sendInfo.error);
4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }));
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a second send after the first finishes is successful. This uses
4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // an IoHandler that echoes data sent to it.
4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSendAfterSuccessfulSend() {
4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connect(function() {
4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sendData().then(test.callbackPass(function(sendInfo) {
4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(4, sendInfo.bytesSent);
4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(undefined, sendInfo.error);
4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return sendData();
4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      })).then(test.callbackPass(function(sendInfo) {
4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(4, sendInfo.bytesSent);
4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(undefined, sendInfo.error);
4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }));
4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Check that the correct data is echoed twice.
4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.listenOnce(serial.onReceive, function(result) {
4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        checkReceivedData(result);
4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.listenOnce(serial.onReceive, function(result) {
4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          checkReceivedData(result);
4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          disconnect();
4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        });
4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      });
4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a second send after the first fails is successful. This uses an
4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // IoHandler that returns system_error for only the first send.
4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSendPartialSuccessWithError() {
4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connect(function() {
4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sendData().then(test.callbackPass(function(sendInfo) {
4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(2, sendInfo.bytesSent);
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq('system_error', sendInfo.error);
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        return sendData();
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      })).then(test.callbackPass(function(sendInfo) {
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(4, sendInfo.bytesSent);
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(undefined, sendInfo.error);
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        disconnect();
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }));
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a timed-out send returns a timeout error and that changing the
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // send timeout during a send does not affect its timeout. This test uses an
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // IoHandle that never completes sends.
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSendTimeout() {
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connect(function() {
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sendData().then(test.callbackPass(function(sendInfo) {
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(0, sendInfo.bytesSent);
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq('timeout', sendInfo.error);
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(5, timeoutManager.currentTime);
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        disconnect();
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }));
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      serial.update(connectionId, {sendTimeout: 10}, test.callbackPass(
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          timeoutManager.run.bind(timeoutManager, 1)));
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }, {sendTimeout: 5});
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a timed-out send returns a timeout error and that disabling the
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // send timeout during a send does not affect its timeout. This test uses an
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // IoHandle that never completes sends.
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testDisableSendTimeout() {
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connect(function() {
4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      sendData().then(test.callbackPass(function(sendInfo) {
4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(0, sendInfo.bytesSent);
4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq('timeout', sendInfo.error);
4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(6, timeoutManager.currentTime);
4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        disconnect();
4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }));
4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      serial.update(connectionId, {sendTimeout: 0}, test.callbackPass(
4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          timeoutManager.run.bind(timeoutManager, 1)));
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }, {sendTimeout: 6});
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that data received while the connection is paused is queued and
4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // dispatched once the connection is unpaused.
4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testPausedReceive() {
4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Wait until the receive hook is installed, then start the test.
5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    addReceiveHook(function() {
5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Unpause the connection after the connection has queued the received
5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // data to ensure the queued data is dispatched when the connection is
5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // unpaused.
5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      serial.setPaused(connectionId, false, test.callbackPass());
5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Check that setPaused(false) is idempotent.
5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      serial.setPaused(connectionId, false, test.callbackPass());
5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }).then(function() {
5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      connect(function() {
5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        // Check that setPaused(true) is idempotent.
5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        serial.setPaused(connectionId, true, test.callbackPass());
5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        serial.setPaused(connectionId, true, test.callbackPass());
5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      });
5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test.listenOnce(serial.onReceive, function(result) {
5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      checkReceivedData(result);
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      disconnect();
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a receive error received while the connection is paused is queued
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // and dispatched once the connection is unpaused.
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testPausedReceiveError() {
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    addReceiveErrorHook(function() {
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Unpause the connection after the connection has queued the receive
5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // error to ensure the queued error is dispatched when the connection is
5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // unpaused.
5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      serial.setPaused(connectionId, false, test.callbackPass());
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }).then(test.callbackPass(function() {
5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      connect(function() {
5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        serial.setPaused(connectionId, true, test.callbackPass());
5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      });
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }));
5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    test.listenOnce(serial.onReceiveError, function(result) {
5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      serial.getInfo(connectionId, test.callbackPass(function(connectionInfo) {
5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        disconnect();
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertTrue(connectionInfo.paused);
5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      }));
5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.assertEq(connectionId, result.connectionId);
5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.assertEq('device_lost', result.error);
5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    serial.onReceive.addListener(function() {
5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.fail('unexpected onReceive event');
5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    });
5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that receive timeouts trigger after the timeout time elapses and that
5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // changing the receive timeout does not affect a wait in progress.
5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testReceiveTimeout() {
5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connect(function() {
5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.listenOnce(serial.onReceiveError, function(result) {
5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(connectionId, result.connectionId);
5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq('timeout', result.error);
5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(20, timeoutManager.currentTime);
5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        serial.getInfo(connectionId, test.callbackPass(
5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            function(connectionInfo) {
5571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          test.assertFalse(connectionInfo.paused);
5581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          disconnect();
5591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }));
5601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      });
5611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Changing the timeout does not take effect until the current timeout
5621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // expires or a receive completes.
5631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      serial.update(connectionId, {receiveTimeout: 10}, test.callbackPass(
5641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          timeoutManager.run.bind(timeoutManager, 1)));
5651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }, {receiveTimeout: 20});
5661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
5671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that receive timeouts trigger after the timeout time elapses and that
5691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // disabling the receive timeout does not affect a wait in progress.
5701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testDisableReceiveTimeout() {
5711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connect(function() {
5721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      test.listenOnce(serial.onReceiveError, function(result) {
5731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(connectionId, result.connectionId);
5741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq('timeout', result.error);
5751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        test.assertEq(30, timeoutManager.currentTime);
5761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        serial.getInfo(connectionId, test.callbackPass(
5771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            function(connectionInfo) {
5781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          disconnect();
5791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          test.assertFalse(connectionInfo.paused);
5801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        }));
5811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      });
5821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // Disabling the timeout does not take effect until the current timeout
5831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // expires or a receive completes.
5841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      serial.update(connectionId, {receiveTimeout: 0}, test.callbackPass(
5851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          timeoutManager.run.bind(timeoutManager, 1)));
5861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }, {receiveTimeout: 30});
5871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
5881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a receive error from the service is correctly dispatched. This
5901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // test uses an IoHandler that only reports 'disconnected' receive errors.
5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testReceiveErrorDisconnected() {
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    runReceiveErrorTest('disconnected');
5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a receive error from the service is correctly dispatched. This
5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // test uses an IoHandler that only reports 'device_lost' receive errors.
5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testReceiveErrorDeviceLost() {
5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    runReceiveErrorTest('device_lost');
5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a receive from error the service is correctly dispatched. This
6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // test uses an IoHandler that only reports 'system_error' receive errors.
6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testReceiveErrorSystemError() {
6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    runReceiveErrorTest('system_error');
6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a send error from the service is correctly returned as the send
6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // result. This test uses an IoHandler that only reports 'disconnected' send
6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // errors.
6101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSendErrorDisconnected() {
6111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    runSendErrorTest('disconnected');
6121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
6131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that a send error from the service is correctly returned as the send
6151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // result. This test uses an IoHandler that only reports 'system_error' send
6161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // errors.
6171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSendErrorSystemError() {
6181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    runSendErrorTest('system_error');
6191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
6201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that disconnect returns the correct error for a connection ID that
6221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // does not exist.
6236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testDisconnectUnknownConnectionId() {
6246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    serial.disconnect(-1, test.callbackFail('Serial connection not found.'));
6256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
6266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that getInfo returns the correct error for a connection ID that does
6281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // not exist.
6296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testGetInfoUnknownConnectionId() {
6306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    serial.getInfo(-1, test.callbackFail('Serial connection not found.'));
6316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
6326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that update returns the correct error for a connection ID that does
6341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // not exist.
6356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testUpdateUnknownConnectionId() {
6366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    serial.update(-1, {}, test.callbackFail('Serial connection not found.'));
6376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
6386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that setControlSignals returns the correct error for a connection ID
6401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // that does not exist.
6416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testSetControlSignalsUnknownConnectionId() {
6426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    serial.setControlSignals(-1, {}, test.callbackFail(
6436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        'Serial connection not found.'));
6446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
6456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that getControlSignals returns the correct error for a connection ID
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // that does not exist.
6486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testGetControlSignalsUnknownConnectionId() {
6496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    serial.getControlSignals(-1, test.callbackFail(
6506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        'Serial connection not found.'));
6516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
6526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that flush returns the correct error for a connection ID that does not
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // exist.
6556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testFlushUnknownConnectionId() {
6566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    serial.flush(-1, test.callbackFail('Serial connection not found.'));
6576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
6586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that setPaused returns the correct error for a connection ID that does
6601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // not exist.
6616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  function testSetPausedUnknownConnectionId() {
6626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    serial.setPaused(
6636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        -1, true, test.callbackFail('Serial connection not found.'));
6646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    serial.setPaused(
6656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        -1, false, test.callbackFail('Serial connection not found.'));
6666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  },
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Test that send returns the correct error for a connection ID that does not
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // exist.
6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  function testSendUnknownConnectionId() {
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    var buffer = new ArrayBuffer(1);
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    serial.send(-1, buffer, test.callbackFail('Serial connection not found.'));
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
6745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)], test.runTests, exports);
675