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