Migrated http_session_test from SDK standalone tests. (#31)
* Migrated http_session_test from SDK standalone tests.
diff --git a/test/http_session_test.dart b/test/http_session_test.dart
new file mode 100644
index 0000000..a713139
--- /dev/null
+++ b/test/http_session_test.dart
@@ -0,0 +1,208 @@
+// 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 'package:http_io/http_io.dart';
+import 'package:test/test.dart';
+
+const SESSION_ID = "DARTSESSID";
+
+String getSessionId(List<Cookie> cookies) {
+ var id = cookies.fold(null, (last, cookie) {
+ if (last != null) return last;
+ if (cookie.name.toUpperCase() == SESSION_ID) {
+ expect(cookie.httpOnly, isTrue);
+ return cookie.value;
+ }
+ return null;
+ });
+ expect(id, isNotNull);
+ return id;
+}
+
+Future<String> connectGetSession(HttpClient client, int port,
+ [String session]) {
+ return client.get("127.0.0.1", port, "/").then((request) {
+ if (session != null) {
+ request.cookies.add(new Cookie(SESSION_ID, session));
+ }
+ return request.close();
+ }).then((response) {
+ return response.fold(getSessionId(response.cookies), (v, _) => v);
+ });
+}
+
+Future<Null> testSessions(int sessionCount) {
+ final completer = new Completer<Null>();
+ var client = new HttpClient();
+ HttpServer.bind("127.0.0.1", 0).then((server) {
+ var sessions = new Set();
+ server.listen((request) {
+ sessions.add(request.session.id);
+ request.response.close();
+ });
+
+ var futures = <Future>[];
+ for (int i = 0; i < sessionCount; i++) {
+ futures.add(connectGetSession(client, server.port).then((session) {
+ expect(session, isNotNull);
+ expect(sessions.contains(session), isTrue);
+ return connectGetSession(client, server.port, session).then((session2) {
+ expect(session2, equals(session));
+ expect(sessions.contains(session2), isTrue);
+ return session2;
+ });
+ }));
+ }
+ Future.wait(futures).then((clientSessions) {
+ expect(sessions.length, equals(sessionCount));
+ expect(new Set.from(clientSessions), equals(sessions));
+ server.close();
+ client.close();
+ completer.complete();
+ });
+ });
+ return completer.future;
+}
+
+Future<Null> testTimeout(int sessionCount) {
+ final completer = new Completer<Null>();
+ var client = new HttpClient();
+ HttpServer.bind("127.0.0.1", 0).then((server) {
+ server.sessionTimeout = 1;
+ var timeouts = <Future>[];
+ server.listen((request) {
+ var c = new Completer();
+ timeouts.add(c.future);
+ request.session.onTimeout = () {
+ c.complete(null);
+ };
+ request.response.close();
+ });
+
+ var futures = <Future>[];
+ for (int i = 0; i < sessionCount; i++) {
+ futures.add(connectGetSession(client, server.port));
+ }
+ Future.wait(futures).then((clientSessions) {
+ Future.wait(timeouts).then((_) {
+ futures = <Future>[];
+ for (var id in clientSessions) {
+ futures
+ .add(connectGetSession(client, server.port, id).then((session) {
+ expect(session, isNotNull);
+ expect(id == session, isFalse);
+ }));
+ }
+ Future.wait(futures).then((_) {
+ server.close();
+ client.close();
+ completer.complete();
+ });
+ });
+ });
+ });
+ return completer.future;
+}
+
+Future<Null> testSessionsData() {
+ final completer = new Completer<Null>();
+ HttpServer.bind("127.0.0.1", 0).then((server) {
+ bool firstHit = false;
+ bool secondHit = false;
+ server.listen((request) {
+ var session = request.session;
+ if (session.isNew) {
+ expect(firstHit, isFalse);
+ expect(secondHit, isFalse);
+ firstHit = true;
+ session["data"] = "some data";
+ } else {
+ expect(firstHit, isTrue);
+ expect(secondHit, isFalse);
+ secondHit = true;
+ expect(session.containsKey("data"), isTrue);
+ expect("some data", equals(session["data"]));
+ }
+ request.response.close();
+ });
+
+ var client = new HttpClient();
+ client
+ .get("127.0.0.1", server.port, "/")
+ .then((request) => request.close())
+ .then((response) {
+ response.listen((_) {}, onDone: () {
+ var id = getSessionId(response.cookies);
+ expect(id, isNotNull);
+ client.get("127.0.0.1", server.port, "/").then((request) {
+ request.cookies.add(new Cookie(SESSION_ID, id));
+ return request.close();
+ }).then((response) {
+ response.listen((_) {}, onDone: () {
+ expect(firstHit, isTrue);
+ expect(secondHit, isTrue);
+ expect(id, equals(getSessionId(response.cookies)));
+ server.close();
+ client.close();
+ completer.complete();
+ });
+ });
+ });
+ });
+ });
+ return completer.future;
+}
+
+Future<Null> testSessionsDestroy() {
+ final completer = new Completer<Null>();
+ HttpServer.bind("127.0.0.1", 0).then((server) {
+ bool firstHit = false;
+ server.listen((request) {
+ var session = request.session;
+ if (session.isNew) {
+ expect(firstHit, isFalse);
+ firstHit = true;
+ } else {
+ expect(firstHit, isTrue);
+ session.destroy();
+ var session2 = request.session;
+ expect(session.id == session2.id, isFalse);
+ }
+ request.response.close();
+ });
+
+ var client = new HttpClient();
+ client
+ .get("127.0.0.1", server.port, "/")
+ .then((request) => request.close())
+ .then((response) {
+ response.listen((_) {}, onDone: () {
+ var id = getSessionId(response.cookies);
+ expect(id, isNotNull);
+ client.get("127.0.0.1", server.port, "/").then((request) {
+ request.cookies.add(new Cookie(SESSION_ID, id));
+ return request.close();
+ }).then((response) {
+ response.listen((_) {}, onDone: () {
+ expect(firstHit, isTrue);
+ expect(id == getSessionId(response.cookies), isFalse);
+ server.close();
+ client.close();
+ completer.complete();
+ });
+ });
+ });
+ });
+ });
+ return completer.future;
+}
+
+void main() {
+ test('testSessions', () => testSessions(1));
+ test('testTimeout', () => testTimeout(5));
+ test('testSessionsData', () => testSessionsData());
+ test('testSessionsDestroy', () => testSessionsDestroy());
+}