// Copyright (c) 2013, 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:io'; import "package:expect/expect.dart"; const int serversCount = 10; void main(List args) { if (args.isEmpty) { for (int i = 0; i < serversCount; ++i) { makeServer().then((server) { runClientProcess(server.port).then((_) => server.close()); }); } } else if (args[0] == '--client') { int port = int.parse(args[1]); runClient(port); } else { Expect.fail('Unknown arguments to raw_socket_cross_process_test.dart'); } } Future makeServer() { return RawServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) { server.listen((connection) { connection.writeEventsEnabled = false; connection.listen((event) { switch (event) { case RawSocketEvent.read: Expect.fail("No read event expected"); break; case RawSocketEvent.readClosed: connection.shutdown(SocketDirection.send); break; case RawSocketEvent.write: Expect.fail("No write event expected"); break; } }); }); return server; }); } Future runClientProcess(int port) { return Process.run( Platform.executable, [] ..addAll(Platform.executableArguments) ..add(Platform.script.toFilePath()) ..add('--client') ..add(port.toString())) .then((ProcessResult result) { if (result.exitCode != 0 || !result.stdout.contains('SUCCESS')) { print("Client failed, exit code ${result.exitCode}"); print(" stdout:"); print(result.stdout); print(" stderr:"); print(result.stderr); Expect.fail('Client subprocess exit code: ${result.exitCode}'); } }); } runClient(int port) { RawSocket.connect(InternetAddress.loopbackIPv4, port).then((connection) { connection.listen((_) {}, onDone: () => print('SUCCESS')); connection.shutdown(SocketDirection.send); }); }