Adds http_close_test.dart (#23)

diff --git a/test/http_close_test.dart b/test/http_close_test.dart
new file mode 100644
index 0000000..be28db2
--- /dev/null
+++ b/test/http_close_test.dart
@@ -0,0 +1,153 @@
+// 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:math";
+import "dart:typed_data";
+
+import "package:http_io/http_io.dart";
+import "package:test/test.dart";
+
+Future<Null> testClientAndServerCloseNoListen(int connections) {
+  Completer<Null> completer = new Completer();
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    int closed = 0;
+    server.listen((request) {
+      request.response.close();
+      request.response.done.then((_) {
+        closed++;
+        if (closed == connections) {
+          expect(0, equals(server.connectionsInfo().active));
+          expect(server.connectionsInfo().total,
+              equals(server.connectionsInfo().idle));
+          server.close();
+          completer.complete(null);
+        }
+      });
+    });
+    var client = new HttpClient();
+    for (int i = 0; i < connections; i++) {
+      client
+          .get("127.0.0.1", server.port, "/")
+          .then((request) => request.close())
+          .then((response) {});
+    }
+  });
+  return completer.future;
+}
+
+Future<Null> testClientCloseServerListen(int connections) {
+  Completer<Null> completer = new Completer();
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    int closed = 0;
+    void check() {
+      closed++;
+      if (closed == connections * 2) {
+        expect(0, equals(server.connectionsInfo().active));
+        expect(server.connectionsInfo().total,
+            equals(server.connectionsInfo().idle));
+        server.close();
+        completer.complete(null);
+      }
+    }
+
+    server.listen((request) {
+      request.listen((_) {}, onDone: () {
+        request.response.close();
+        request.response.done.then((_) => check());
+      });
+    });
+    var client = new HttpClient();
+    for (int i = 0; i < connections; i++) {
+      client
+          .get("127.0.0.1", server.port, "/")
+          .then((request) => request.close())
+          .then((response) => check());
+    }
+  });
+  return completer.future;
+}
+
+Future<Null> testClientCloseSendingResponse(int connections) {
+  Completer<Null> completer = new Completer();
+  var buffer = new Uint8List(64 * 1024);
+  var rand = new Random();
+  for (int i = 0; i < buffer.length; i++) {
+    buffer[i] = rand.nextInt(256);
+  }
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    int closed = 0;
+    void check() {
+      closed++;
+      // Wait for both server and client to see the connections as closed.
+      if (closed == connections * 2) {
+        expect(0, equals(server.connectionsInfo().active));
+        expect(server.connectionsInfo().total,
+            equals(server.connectionsInfo().idle));
+        server.close();
+        completer.complete(null);
+      }
+    }
+
+    server.listen((request) {
+      var timer = new Timer.periodic(const Duration(milliseconds: 50), (_) {
+        request.response.add(buffer);
+      });
+      request.response.done.catchError((_) {}).whenComplete(() {
+        check();
+        timer.cancel();
+      });
+    });
+    var client = new HttpClient();
+    for (int i = 0; i < connections; i++) {
+      client
+          .get("127.0.0.1", server.port, "/")
+          .then((request) => request.close())
+          .then((response) {
+        // Ensure we don't accept the response until we have send the entire
+        // request.
+        var subscription = response.listen((_) {});
+        new Timer(const Duration(milliseconds: 20), () {
+          subscription.cancel();
+          check();
+        });
+      });
+    }
+  });
+  return completer.future;
+}
+
+Future<Null> testClientCloseWhileSendingRequest(int connections) {
+  Completer<Null> completer = new Completer();
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    server.listen((request) {
+      request.listen((_) {});
+    });
+    var client = new HttpClient();
+    int closed = 0;
+    for (int i = 0; i < connections; i++) {
+      client.post("127.0.0.1", server.port, "/").then((request) {
+        request.contentLength = 110;
+        request.write("0123456789");
+        return request.close();
+      }).catchError((_) {
+        closed++;
+        if (closed == connections) {
+          server.close();
+          completer.complete(null);
+        }
+      });
+    }
+  });
+  return completer.future;
+}
+
+void main() {
+  test('ClientAndServerCloseNoListen',
+      () => testClientAndServerCloseNoListen(10));
+  test('ClientCloseServerListen', () => testClientCloseServerListen(10));
+  test('ClientCloseSendingResponse', () => testClientCloseSendingResponse(10));
+  test('ClientCloseWhileSendingRequest',
+      () => testClientCloseWhileSendingRequest(10));
+}