blob: e41049876fbdc0f97203298b65ec988164f6e231 [file] [log] [blame]
// 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 "package:expect/expect.dart";
import 'dart:async';
import 'dart:io';
const SESSION_ID = "DARTSESSID";
String getSessionId(List<Cookie> cookies) {
var id = cookies.fold<String?>(null, (last, cookie) {
if (last != null) return last;
if (cookie.name.toUpperCase() == SESSION_ID) {
Expect.isTrue(cookie.httpOnly);
return cookie.value;
}
return null;
});
Expect.isNotNull(id);
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);
});
}
void testSessions(int sessionCount) {
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.isNotNull(session);
Expect.isTrue(sessions.contains(session));
return connectGetSession(client, server.port, session).then((session2) {
Expect.equals(session2, session);
Expect.isTrue(sessions.contains(session2));
return session2;
});
}));
}
Future.wait(futures).then((clientSessions) {
Expect.equals(sessions.length, sessionCount);
Expect.setEquals(new Set.from(clientSessions), sessions);
server.close();
client.close();
});
});
}
void testTimeout(int sessionCount) {
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.isNotNull(session);
Expect.notEquals(id, session);
}));
}
Future.wait(futures).then((_) {
server.close();
client.close();
});
});
});
});
}
void testSessionsData() {
HttpServer.bind("127.0.0.1", 0).then((server) {
bool firstHit = false;
bool secondHit = false;
server.listen((request) {
var c = new Completer();
var session = request.session;
if (session.isNew) {
Expect.isFalse(firstHit);
Expect.isFalse(secondHit);
firstHit = true;
session["data"] = "some data";
} else {
Expect.isTrue(firstHit);
Expect.isFalse(secondHit);
secondHit = true;
Expect.isTrue(session.containsKey("data"));
Expect.equals("some data", 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.isNotNull(id);
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.isTrue(firstHit);
Expect.isTrue(secondHit);
Expect.equals(id, getSessionId(response.cookies));
server.close();
client.close();
});
});
});
});
});
}
void testSessionsDestroy() {
HttpServer.bind("127.0.0.1", 0).then((server) {
bool firstHit = false;
server.listen((request) {
var session = request.session;
if (session.isNew) {
Expect.isFalse(firstHit);
firstHit = true;
} else {
Expect.isTrue(firstHit);
session.destroy();
var session2 = request.session;
Expect.notEquals(session.id, session2.id);
}
;
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.isNotNull(id);
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.isTrue(firstHit);
Expect.notEquals(id, getSessionId(response.cookies));
server.close();
client.close();
});
});
});
});
});
}
void main() {
testSessions(1);
testTimeout(5);
testSessionsData();
testSessionsDestroy();
}