Migrated http_shutdown_test.dart from SDK standalone tests. (#28)
diff --git a/test/http_shutdown_test.dart b/test/http_shutdown_test.dart
new file mode 100644
index 0000000..cb32e85
--- /dev/null
+++ b/test/http_shutdown_test.dart
@@ -0,0 +1,205 @@
+// 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 "package:http_io/http_io.dart";
+import "package:test/test.dart";
+
+Future<Null> test1(int totalConnections) {
+ final completer = new Completer<Null>();
+ // Server which just closes immediately.
+ HttpServer.bind("127.0.0.1", 0).then((server) {
+ server.listen((HttpRequest request) {
+ request.response.close();
+ });
+
+ int count = 0;
+ HttpClient client = new HttpClient();
+ for (int i = 0; i < totalConnections; i++) {
+ client
+ .get("127.0.0.1", server.port, "/")
+ .then((HttpClientRequest request) => request.close())
+ .then((HttpClientResponse response) {
+ response.listen((_) {}, onDone: () {
+ count++;
+ if (count == totalConnections) {
+ client.close();
+ server.close();
+ completer.complete();
+ }
+ });
+ });
+ }
+ });
+ return completer.future;
+}
+
+Future<Null> test2(int totalConnections, int outputStreamWrites) {
+ final completer = new Completer<Null>();
+ // Server which responds without waiting for request body.
+ HttpServer.bind("127.0.0.1", 0).then((server) {
+ server.listen((HttpRequest request) {
+ request.response.write("!dlrow ,olleH");
+ request.response.close();
+ });
+
+ int count = 0;
+ HttpClient client = new HttpClient();
+ for (int i = 0; i < totalConnections; i++) {
+ client
+ .get("127.0.0.1", server.port, "/")
+ .then((HttpClientRequest request) {
+ request.contentLength = -1;
+ for (int i = 0; i < outputStreamWrites; i++) {
+ request.write("Hello, world!");
+ }
+ request.done.catchError((_) {});
+ return request.close();
+ }).then((HttpClientResponse response) {
+ response.listen((_) {}, onDone: () {
+ count++;
+ if (count == totalConnections) {
+ client.close(force: true);
+ server.close();
+ completer.complete();
+ }
+ }, onError: (e) {} /* ignore */);
+ }).catchError((error) {
+ count++;
+ if (count == totalConnections) {
+ client.close();
+ server.close();
+ completer.complete();
+ }
+ });
+ }
+ });
+ return completer.future;
+}
+
+Future<Null> test3(int totalConnections) {
+ final completer = new Completer<Null>();
+ // Server which responds when request body has been received.
+ HttpServer.bind("127.0.0.1", 0).then((server) {
+ server.listen((HttpRequest request) {
+ request.listen((_) {}, onDone: () {
+ request.response.write("!dlrow ,olleH");
+ request.response.close();
+ });
+ });
+
+ int count = 0;
+ HttpClient client = new HttpClient();
+ for (int i = 0; i < totalConnections; i++) {
+ client
+ .get("127.0.0.1", server.port, "/")
+ .then((HttpClientRequest request) {
+ request.contentLength = -1;
+ request.write("Hello, world!");
+ return request.close();
+ }).then((HttpClientResponse response) {
+ response.listen((_) {}, onDone: () {
+ count++;
+ if (count == totalConnections) {
+ client.close();
+ server.close();
+ completer.complete();
+ }
+ });
+ });
+ }
+ });
+ return completer.future;
+}
+
+Future<Null> test4() {
+ final completer = new Completer<Null>();
+ HttpServer.bind("127.0.0.1", 0).then((server) {
+ server.listen((var request) {
+ request.listen((_) {}, onDone: () {
+ new Timer.periodic(new Duration(milliseconds: 100), (timer) {
+ if (server.connectionsInfo().total == 0) {
+ server.close();
+ timer.cancel();
+ completer.complete();
+ }
+ });
+ request.response.close();
+ });
+ });
+
+ var client = new HttpClient();
+ client
+ .get("127.0.0.1", server.port, "/")
+ .then((request) => request.close())
+ .then((response) {
+ response.listen((_) {}, onDone: () {
+ client.close();
+ });
+ });
+ });
+ return completer.future;
+}
+
+Future<Null> test5(int totalConnections) {
+ final completer = new Completer<Null>();
+ HttpServer.bind("127.0.0.1", 0).then((server) {
+ server.listen((request) {
+ request.listen((_) {}, onDone: () {
+ request.response.close();
+ request.response.done.catchError((e) {});
+ }, onError: (error) {});
+ }, onError: (error) {});
+
+ // Create a number of client requests and keep then active. Then
+ // close the client and wait for the server to lose all active
+ // connections.
+ var client = new HttpClient();
+ client.maxConnectionsPerHost = totalConnections;
+ for (int i = 0; i < totalConnections; i++) {
+ client
+ .post("127.0.0.1", server.port, "/")
+ .then((request) {
+ request.add([0]);
+ // TODO(sgjesse): Make this test work with
+ //request.response instead of request.close() return
+ //return request.response;
+ request.done.catchError((e) {});
+ return request.close();
+ })
+ .then((response) {})
+ .catchError((e) {}, test: (e) => e is HttpException);
+ }
+ bool clientClosed = false;
+ new Timer.periodic(new Duration(milliseconds: 100), (timer) {
+ if (!clientClosed) {
+ if (server.connectionsInfo().total == totalConnections) {
+ clientClosed = true;
+ client.close(force: true);
+ }
+ } else {
+ if (server.connectionsInfo().total == 0) {
+ server.close();
+ timer.cancel();
+ completer.complete();
+ }
+ }
+ });
+ });
+ return completer.future;
+}
+
+void main() {
+ test('test1_1', () => test1(1));
+ test('test1_10', () => test1(10));
+ test('test2_1_10', () => test2(1, 10));
+ test('test2_10_10', () => test2(10, 10));
+ test('test2_10_1000', () => test2(10, 1000));
+ test('test3_1', () => test3(1));
+ test('test3_10', () => test3(10));
+ test('test4', () => test4());
+ test('test5_1', () => test5(1));
+ test('test5_10', () => test5(10));
+}