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));
+}