blob: 646b5f641deaf424f3cc4b5a1ffd3fd2d962ea89 [file] [log] [blame]
// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'dart:convert';
import 'dart:io' as io;
import 'package:observatory/service_io.dart';
import 'package:unittest/unittest.dart';
import 'test_helper.dart';
Future setupTCP() async {
// Note that we don't close after us, by design we leave the sockets opens
// to allow us to query them from the other isolate.
var serverSocket = await io.ServerSocket.bind('127.0.0.1', 0);
serverSocket.listen((s) {
s.transform(UTF8.decoder).listen(print);
s.close();
});
var socket = await io.Socket.connect("127.0.0.1", serverSocket.port);
socket.write("foobar");
socket.write("foobar");
await socket.flush();
var socket2 = await io.Socket.connect("127.0.0.1", serverSocket.port);
socket2.write("foobarfoobar");
await socket2.flush();
}
var tcpTests = [
// Initial.
(Isolate isolate) async {
var result =
await isolate.invokeRpcNoUpgrade('ext.dart.io.getOpenSockets', {});
expect(result['type'], equals('_opensockets'));
// We expect 3 sockets to be open (in this order):
// The server socket accepting connections, on port X
// The accepted connection on the client, on port Y
// The client connection, on port X
if (result['data'].length != 5) {
print(result['data']);
}
expect(result['data'].length, equals(5));
// The first socket will have a name like listening:127.0.0.1:X
// The second will have a name like 127.0.0.1:Y
// The third will have a name like 127.0.0.1:X
expect(result['data'][0]['name'].startsWith('listening:127.0.0.1'), isTrue);
expect(result['data'][1]['name'].startsWith('127.0.0.1:'), isTrue);
expect(result['data'][2]['name'].startsWith('127.0.0.1:'), isTrue);
var listening = await isolate.invokeRpcNoUpgrade(
'ext.dart.io.getSocketByID', { 'id' : result['data'][0]['id'] });
expect(listening['id'], equals(result['data'][0]['id']));
expect(listening['listening'], isTrue);
expect(listening['socketType'], equals('TCP'));
expect(listening['port'], greaterThanOrEqualTo(1024));
expect(listening['lastRead'], greaterThan(0));
expect(listening['totalRead'], equals(2));
expect(listening['lastWrite'], equals(0));
expect(listening['totalWritten'], equals(0));
expect(listening['writeCount'], equals(0));
expect(listening['readCount'], equals(2));
expect(listening['remoteHost'], equals('NA'));
expect(listening['remotePort'], equals('NA'));
var client = await isolate.invokeRpcNoUpgrade(
'ext.dart.io.getSocketByID', { 'id' : result['data'][1]['id'] });
expect(client['id'], equals(result['data'][1]['id']));
var server = await isolate.invokeRpcNoUpgrade(
'ext.dart.io.getSocketByID', { 'id' : result['data'][2]['id'] });
expect(server['id'], equals(result['data'][2]['id']));
// We expect the client to be connected on the port and
// host of the listening socket.
expect(client['remotePort'], equals(listening['port']));
expect(client['remoteHost'], equals(listening['host']));
// We expect the third socket (accepted server) to be connected to the
// same port and host as the listening socket (the listening one).
expect(server['port'], equals(listening['port']));
expect(server['host'], equals(listening['host']));
expect(client['listening'], isFalse);
expect(server['listening'], isFalse);
expect(client['socketType'], equals('TCP'));
expect(server['socketType'], equals('TCP'));
// We are using no reserved ports.
expect(client['port'], greaterThanOrEqualTo(1024));
expect(server['port'], greaterThanOrEqualTo(1024));
// The client and server "mirror" each other in reads and writes, and the
// timestamps are in correct order.
expect(client['lastRead'], equals(0));
expect(server['lastRead'], greaterThan(0));
expect(client['totalRead'], equals(0));
expect(server['totalRead'], equals(12));
expect(client['readCount'], equals(0));
expect(server['readCount'], greaterThanOrEqualTo(1));
expect(client['lastWrite'], greaterThan(0));
expect(server['lastWrite'], equals(0));
expect(client['totalWritten'], equals(12));
expect(server['totalWritten'], equals(0));
expect(client['writeCount'], greaterThanOrEqualTo(2));
expect(server['writeCount'], equals(0));
// Order
// Stopwatch resolution on windows can make us have the same timestamp.
if (io.Platform.isWindows) {
expect(server['lastRead'], greaterThanOrEqualTo(client['lastWrite']));
} else {
expect(server['lastRead'], greaterThan(client['lastWrite']));
}
var secondClient = await isolate.invokeRpcNoUpgrade(
'ext.dart.io.getSocketByID', { 'id' : result['data'][3]['id'] });
expect(secondClient['id'], equals(result['data'][3]['id']));
var secondServer = await isolate.invokeRpcNoUpgrade(
'ext.dart.io.getSocketByID', { 'id' : result['data'][4]['id'] });
expect(secondServer['id'], equals(result['data'][4]['id']));
// We expect the client to be connected on the port and
// host of the listening socket.
expect(secondClient['remotePort'], equals(listening['port']));
expect(secondClient['remoteHost'], equals(listening['host']));
// We expect the third socket (accepted server) to be connected to the
// same port and host as the listening socket (the listening one).
expect(secondServer['port'], equals(listening['port']));
expect(secondServer['host'], equals(listening['host']));
expect(secondClient['listening'], isFalse);
expect(secondServer['listening'], isFalse);
expect(secondClient['socketType'], equals('TCP'));
expect(secondServer['socketType'], equals('TCP'));
// We are using no reserved ports.
expect(secondClient['port'], greaterThanOrEqualTo(1024));
expect(secondServer['port'], greaterThanOrEqualTo(1024));
// The client and server "mirror" each other in reads and writes, and the
// timestamps are in correct order.
expect(secondClient['lastRead'], equals(0));
expect(secondServer['lastRead'], greaterThan(0));
expect(secondClient['totalRead'], equals(0));
expect(secondServer['totalRead'], equals(12));
expect(secondClient['readCount'], equals(0));
expect(secondServer['readCount'], greaterThanOrEqualTo(1));
expect(secondClient['lastWrite'], greaterThan(0));
expect(secondServer['lastWrite'], equals(0));
expect(secondClient['totalWritten'], equals(12));
expect(secondServer['totalWritten'], equals(0));
expect(secondClient['writeCount'], greaterThanOrEqualTo(1));
expect(secondServer['writeCount'], equals(0));
// Order
// Stopwatch resolution on windows make us sometimes report the same value.
if (io.Platform.isWindows) {
expect(server['lastRead'], greaterThanOrEqualTo(client['lastWrite']));
} else {
expect(server['lastRead'], greaterThan(client['lastWrite']));
}
},
];
main(args) async => runIsolateTests(args, tcpTests, testeeBefore:setupTCP);