Migrated http_response_deadline_test from SDK. (#39)
diff --git a/test/http_response_deadline_test.dart b/test/http_response_deadline_test.dart
new file mode 100644
index 0000000..c6b69c9
--- /dev/null
+++ b/test/http_response_deadline_test.dart
@@ -0,0 +1,109 @@
+// 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 BytesBuilder;
+
+import 'package:http_io/http_io.dart';
+import 'package:test/test.dart';
+
+Future<Null> testSimpleDeadline(int connections) {
+ final completer = new Completer<Null>();
+ HttpServer.bind('localhost', 0).then((server) {
+ server.listen((request) {
+ request.response.deadline = const Duration(seconds: 1000);
+ request.response.write("stuff");
+ request.response.close();
+ });
+
+ var futures = <Future>[];
+ var client = new HttpClient();
+ for (int i = 0; i < connections; i++) {
+ futures.add(client
+ .get('localhost', server.port, '/')
+ .then((request) => request.close())
+ .then((response) => response.drain()));
+ }
+ Future.wait(futures).then((_) {
+ server.close();
+ completer.complete();
+ });
+ });
+ return completer.future;
+}
+
+Future<Null> testExceedDeadline(int connections) {
+ final completer = new Completer<Null>();
+ HttpServer.bind('localhost', 0).then((server) {
+ server.listen((request) {
+ request.response.deadline = const Duration(milliseconds: 100);
+ request.response.contentLength = 10000;
+ request.response.write("stuff");
+ });
+
+ var futures = <Future>[];
+ var client = new HttpClient();
+ for (int i = 0; i < connections; i++) {
+ futures.add(client
+ .get('localhost', server.port, '/')
+ .then((request) => request.close())
+ .then((response) => response.drain())
+ .then((_) {
+ fail("Expected error");
+ }, onError: (e) {
+ // expect error.
+ }));
+ }
+ Future.wait(futures).then((_) {
+ server.close();
+ completer.complete();
+ });
+ });
+ return completer.future;
+}
+
+Future<Null> testDeadlineAndDetach(int connections) {
+ final completer = new Completer<Null>();
+ HttpServer.bind('localhost', 0).then((server) {
+ server.listen((request) {
+ request.response.deadline = const Duration(milliseconds: 0);
+ request.response.contentLength = 5;
+ request.response.persistentConnection = false;
+ request.response.detachSocket().then((socket) {
+ new Timer(const Duration(milliseconds: 100), () {
+ socket.write('stuff');
+ socket.close();
+ socket.listen(null);
+ });
+ });
+ });
+
+ var futures = <Future>[];
+ var client = new HttpClient();
+ for (int i = 0; i < connections; i++) {
+ futures.add(client
+ .get('localhost', server.port, '/')
+ .then((request) => request.close())
+ .then((response) {
+ return response
+ .fold(new BytesBuilder(), (b, d) => b..add(d))
+ .then((builder) {
+ expect(
+ 'stuff', equals(new String.fromCharCodes(builder.takeBytes())));
+ });
+ }));
+ }
+ Future.wait(futures).then((_) {
+ server.close();
+ completer.complete();
+ });
+ });
+ return completer.future;
+}
+
+void main() {
+ test('simpleDeadline', () => testSimpleDeadline(10));
+ test('exceedDeadline', () => testExceedDeadline(10));
+ test('deadlineAndDetach', () => testDeadlineAndDetach(10));
+}