Add http_connection_close_test (#26)

* Add http_connection_close_test

* Fix http_close_test
diff --git a/test/http_close_test.dart b/test/http_close_test.dart
index be28db2..62213be 100644
--- a/test/http_close_test.dart
+++ b/test/http_close_test.dart
@@ -120,18 +120,24 @@
 
 Future<Null> testClientCloseWhileSendingRequest(int connections) {
   Completer<Null> completer = new Completer();
-  HttpServer.bind("127.0.0.1", 0).then((server) {
+  HttpServer.bind("127.0.0.1", 0).then((server) async {
     server.listen((request) {
-      request.listen((_) {});
+      request.listen((_) {}, onError: (e) {
+        // A race may cause the connection to be closed while the server is
+        // receiving the insufficient number of bytes.
+        expect(e is HttpException, isTrue);
+      });
     });
     var client = new HttpClient();
     int closed = 0;
     for (int i = 0; i < connections; i++) {
-      client.post("127.0.0.1", server.port, "/").then((request) {
+      await client.post("127.0.0.1", server.port, "/").then((request) {
         request.contentLength = 110;
         request.write("0123456789");
+        // This triggers an error because fewer bytes were written than
+        // specified in contentLength.
         return request.close();
-      }).catchError((_) {
+      }).catchError((e) {
         closed++;
         if (closed == connections) {
           server.close();
diff --git a/test/http_connection_close_test.dart b/test/http_connection_close_test.dart
new file mode 100644
index 0000000..876566a
--- /dev/null
+++ b/test/http_connection_close_test.dart
@@ -0,0 +1,90 @@
+// 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" hide HttpServer, HttpClient;
+
+import "package:http_io/http_io.dart";
+import "package:test/test.dart";
+
+Future<Null> testHttp10Close(bool closeRequest) {
+  Completer<Null> completer = new Completer();
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    server.listen((request) {
+      request.response.close();
+    });
+
+    Socket.connect("127.0.0.1", server.port).then((socket) {
+      socket.write("GET / HTTP/1.0\r\n\r\n");
+      socket.listen((data) {}, onDone: () {
+        if (!closeRequest) socket.destroy();
+        server.close();
+        completer.complete(null);
+      });
+      if (closeRequest) socket.close();
+    });
+  });
+  return completer.future;
+}
+
+Future<Null> testHttp11Close(bool closeRequest) {
+  Completer<Null> completer = new Completer();
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    server.listen((request) {
+      request.response.close();
+    });
+
+    Socket.connect("127.0.0.1", server.port).then((socket) {
+      socket.write("GET / HTTP/1.1\r\nConnection: close\r\n\r\n");
+      socket.listen((data) {}, onDone: () {
+        if (!closeRequest) socket.destroy();
+        server.close();
+        completer.complete(null);
+      });
+      if (closeRequest) socket.close();
+    });
+  });
+  return completer.future;
+}
+
+Future<Null> testStreamResponse() {
+  Completer<Null> completer = new Completer();
+  HttpServer.bind("127.0.0.1", 0).then((server) {
+    server.listen((request) {
+      var timer = new Timer.periodic(const Duration(milliseconds: 0), (_) {
+        request.response
+            .write('data:${new DateTime.now().millisecondsSinceEpoch}\n\n');
+      });
+      request.response.done.whenComplete(() {
+        timer.cancel();
+      }).catchError((_) {});
+    });
+
+    var client = new HttpClient();
+    client
+        .getUrl(Uri.parse("http://127.0.0.1:${server.port}"))
+        .then((request) => request.close())
+        .then((response) {
+      int bytes = 0;
+      response.listen((data) {
+        bytes += data.length;
+        if (bytes > 100) {
+          client.close(force: true);
+        }
+      }, onError: (error) {
+        server.close();
+        completer.complete(null);
+      });
+    });
+  });
+  return completer.future;
+}
+
+main() {
+  test('Http10Close', () => testHttp10Close(false));
+  test('Http10Close close request', () => testHttp10Close(true));
+  test('Http11Close', () => testHttp11Close(false));
+  test('Http11Close close request', () => testHttp11Close(true));
+  test('StreamResponse', testStreamResponse);
+}