24#include <catch2/catch.hpp>
27#include <nawa/connection/ConnectionInitContainer.h>
33TEST_CASE(
"nawa::Session class",
"[unit][session]") {
34 ConnectionInitContainer connectionInit;
35 connectionInit.requestInit.environment[
"REMOTE_ADDR"] =
"1.2.3.4";
37 SECTION(
"Basic session handling") {
41 auto& session = connection.
session();
43 CHECK_NOTHROW(session.set(
"testKey",
"testVal"));
44 CHECK(any_cast<string>(session[
"testKey"]) ==
"testVal");
45 sessionId = session.getID();
48 ConnectionInitContainer connectionInit1 = connectionInit;
49 connectionInit1.requestInit.cookieVars.insert({
"SESSION", sessionId});
51 auto& session = connection.
session();
53 REQUIRE(session.getID() == sessionId);
54 CHECK(any_cast<string>(session[
"testKey"]) ==
"testVal");
58 SECTION(
"Session autostart") {
59 ConnectionInitContainer connectionInit1 = connectionInit;
60 connectionInit1.config.set({
"session",
"autostart"},
"on");
64 auto& session = connection.
session();
65 CHECK_NOTHROW(session.set(
"testKey",
"testVal"));
66 CHECK(any_cast<string>(session[
"testKey"]) ==
"testVal");
67 sessionId = session.getID();
70 connectionInit1.requestInit.cookieVars.insert({
"SESSION", sessionId});
72 auto& session = connection.
session();
73 REQUIRE(session.getID() == sessionId);
74 CHECK(any_cast<string>(session[
"testKey"]) ==
"testVal");
78 SECTION(
"Attempt to access and modify inactive session") {
80 auto& session = connection.
session();
81 CHECK_THROWS_AS(session.set(
"testKey",
"testVal"),
Exception);
82 CHECK_THROWS_AS(session.unset(
"testKey"),
Exception);
83 CHECK_NOTHROW(session[
"testKey"]);
86 SECTION(
"Invalidation of sessions") {
88 auto& session = connection.
session();
90 CHECK_NOTHROW(session.set(
"testKey",
"testVal"));
92 CHECK_THROWS_AS(session.set(
"testKey",
"testVal"),
Exception);
95 SECTION(
"Client IP check: same IP") {
96 ConnectionInitContainer connectionInit1 = connectionInit;
97 string clientIPCheckMode = GENERATE(
"lax",
"strict");
98 connectionInit1.config.set({
"session",
"validate_ip"}, clientIPCheckMode);
102 auto& session = connection.
session();
104 CHECK_NOTHROW(session.set(
"testKey",
"testVal"));
105 CHECK(any_cast<string>(session[
"testKey"]) ==
"testVal");
106 sessionId = session.getID();
109 connectionInit1.requestInit.cookieVars.insert({
"SESSION", sessionId});
111 auto& session = connection.
session();
113 REQUIRE(session.getID() == sessionId);
114 CHECK(any_cast<string>(session[
"testKey"]) ==
"testVal");
118 SECTION(
"Client IP check: different IP (lax)") {
119 ConnectionInitContainer connectionInit1 = connectionInit;
120 connectionInit1.config.set({
"session",
"validate_ip"},
"lax");
124 auto& session = connection.
session();
126 CHECK_NOTHROW(session.set(
"testKey",
"testVal"));
127 CHECK(any_cast<string>(session[
"testKey"]) ==
"testVal");
128 sessionId = session.getID();
131 ConnectionInitContainer connectionInit2 = connectionInit1;
132 connectionInit2.requestInit.cookieVars.insert({
"SESSION", sessionId});
133 connectionInit2.requestInit.environment[
"REMOTE_ADDR"] =
"1.2.3.5";
135 auto& session = connection.
session();
137 CHECK_FALSE(session.getID() == sessionId);
138 CHECK_FALSE(session.isSet(
"testKey"));
141 connectionInit1.requestInit.cookieVars.insert({
"SESSION", sessionId});
143 auto& session = connection.
session();
145 REQUIRE(session.getID() == sessionId);
146 CHECK(any_cast<string>(session[
"testKey"]) ==
"testVal");
150 SECTION(
"Client IP check: different IP (strict)") {
151 ConnectionInitContainer connectionInit1 = connectionInit;
152 connectionInit1.config.set({
"session",
"validate_ip"},
"strict");
156 auto& session = connection.
session();
158 CHECK_NOTHROW(session.set(
"testKey",
"testVal"));
159 CHECK(any_cast<string>(session[
"testKey"]) ==
"testVal");
160 sessionId = session.getID();
163 ConnectionInitContainer connectionInit2 = connectionInit1;
164 connectionInit2.requestInit.cookieVars.insert({
"SESSION", sessionId});
165 connectionInit2.requestInit.environment[
"REMOTE_ADDR"] =
"1.2.3.5";
167 auto& session = connection.
session();
169 CHECK_FALSE(session.getID() == sessionId);
170 CHECK_FALSE(session.isSet(
"testKey"));
173 connectionInit1.requestInit.cookieVars.insert({
"SESSION", sessionId});
175 auto& session = connection.
session();
177 CHECK_FALSE(session.getID() == sessionId);
178 CHECK_FALSE(session.isSet(
"testKey"));
Response object to be passed back to NAWA and accessor to the request.
Exception class that can be used by apps to catch errors resulting from nawa function calls.
Class for managing sessions and getting and setting connection-independent session data.
nawa::Session & session() noexcept
void start(nawa::Cookie properties=Cookie())
TEST_CASE("nawa::Session class", "[unit][session]")