Migrated http_cross_process_test from SDK. (#58)
diff --git a/test/http_cross_process_test.dart b/test/http_cross_process_test.dart
new file mode 100644
index 0000000..5c2a928
--- /dev/null
+++ b/test/http_cross_process_test.dart
@@ -0,0 +1,81 @@
+// Copyright (c) 2018, 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'
+ show Directory, File, InternetAddress, Platform, Process, ProcessResult;
+
+import 'package:http_io/http_io.dart';
+import 'package:test/test.dart';
+
+const int NUM_SERVERS = 10;
+
+void main([List<String> args]) {
+ if (args == null || args.isEmpty) {
+ test('httpCrossProcess', runTest);
+ } else if (args[0] == '--client') {
+ int port = int.parse(args[1]);
+ runClient(port);
+ } else {
+ throw 'Unknown arguments to http_cross_process_test.dart';
+ }
+}
+
+void runTest() {
+ for (int i = 0; i < NUM_SERVERS; ++i) {
+ makeServer().then((server) {
+ runClientProcess(server.port).then((_) => server.close());
+ });
+ }
+}
+
+Future<HttpServer> makeServer() {
+ return HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((server) {
+ server.listen((request) {
+ request.pipe(request.response);
+ });
+ return server;
+ });
+}
+
+Future<Process> runClientProcess(int port) {
+ var script =
+ "${Directory.current.path}/test/http_client_stays_alive_test.dart";
+ if (!(new File(script)).existsSync()) {
+ // If we can't find the file relative to the cwd, then look relative to
+ // Platform.script.
+ script = Platform.script
+ .resolve('http_client_stays_alive_test.dart')
+ .toFilePath();
+ }
+
+ return Process
+ .run(
+ Platform.executable,
+ []
+ ..addAll(Platform.executableArguments)
+ ..add(script)
+ ..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);
+ fail('Client subprocess exit code: ${result.exitCode}');
+ }
+ });
+}
+
+void runClient(int port) {
+ var client = new HttpClient();
+ client
+ .get('127.0.0.1', port, "/")
+ .then((request) => request.close())
+ .then((response) => response.drain())
+ .then((_) => client.close())
+ .then((_) => print('SUCCESS'));
+}