3433d8cfc3
The tests are also now dartfmt. Bug: https://github.com/dart-lang/sdk/issues/40040 Change-Id: I8dece8097b37b70d47a5374dae2f3fadb0fc4b90 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/134338 Commit-Queue: Jonas Termansen <sortie@google.com> Reviewed-by: Bob Nystrom <rnystrom@google.com>
199 lines
5.6 KiB
Dart
199 lines
5.6 KiB
Dart
// 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();
|
|
}
|