Skip to content

Commit a2c5c7b

Browse files
committed
API Change: Remove session.timeout from server fix #61
1 parent ff314a2 commit a2c5c7b

23 files changed

Lines changed: 421 additions & 133 deletions
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.jooby.session;
2+
3+
import static org.junit.Assert.assertEquals;
4+
5+
import org.jooby.Session;
6+
import org.jooby.test.ServerFeature;
7+
import org.junit.Test;
8+
9+
public class SessionAttrsFeature extends ServerFeature {
10+
11+
{
12+
13+
get("/attrs", req -> {
14+
Session session = req.session();
15+
session.set("bool", true);
16+
assertEquals(true, session.get("bool").booleanValue());
17+
session.set("byte", (byte) 7);
18+
assertEquals((byte) 7, session.get("byte").byteValue());
19+
session.set("c", 'c');
20+
assertEquals('c', session.get("c").charValue());
21+
session.set("seq", new StringBuilder("seq"));
22+
assertEquals("seq", session.get("seq").value());
23+
session.set("d", 6d);
24+
assertEquals(6d, session.get("d").doubleValue(), 0);
25+
session.set("f", 31.9f);
26+
assertEquals(31.9f, session.get("f").floatValue(), 0);
27+
session.set("i", 78);
28+
assertEquals(78, session.get("i").intValue());
29+
session.set("l", 9L);
30+
assertEquals(9L, session.get("l").longValue());
31+
session.set("s", (short) 2);
32+
assertEquals((short) 2, session.get("s").shortValue());
33+
return "done";
34+
});
35+
36+
}
37+
38+
@Test
39+
public void locals() throws Exception {
40+
request()
41+
.get("/attrs")
42+
.expect("done");
43+
44+
}
45+
46+
}

coverage-report/src/test/java/org/jooby/session/SessionConfigCookieFeature.java

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public class SessionConfigCookieFeature extends ServerFeature {
3232
.withValue("application.session.cookie.httpOnly", ConfigValueFactory.fromAnyRef(true))
3333
.withValue("application.session.cookie.secure", ConfigValueFactory.fromAnyRef(false)));
3434

35-
session(new Session.MemoryStore());
35+
session(new Session.Mem());
3636

3737
get("/session", (req, rsp) -> {
3838
rsp.send(req.session().id());
@@ -51,27 +51,25 @@ public void cookieConfig() throws Exception {
5151
request()
5252
.get("/session")
5353
.expect(200)
54-
.header(
55-
"Set-Cookie",
56-
value -> {
57-
List<String> setCookie = Lists.newArrayList(
58-
Splitter.onPattern(";\\s*")
59-
.splitToList(value)
60-
);
54+
.header("Set-Cookie", value -> {
55+
List<String> setCookie = Lists.newArrayList(
56+
Splitter.onPattern(";\\s*")
57+
.splitToList(value)
58+
);
6159

62-
assertTrue(setCookie.remove(0).startsWith("custom.sid"));
63-
assertTrue(setCookie.remove("Path=/session") || setCookie.remove("Path=\"/session\""));
64-
assertTrue(setCookie.remove("HttpOnly") || setCookie.remove("HTTPOnly"));
65-
assertTrue(setCookie.remove("Max-Age=60"));
66-
assertTrue(setCookie.remove("Domain=localhost"));
67-
assertTrue(setCookie.remove("Version=1"));
68-
setCookie.remove("Comment=\"jooby cookie\"");
69-
if (setCookie.size() > 0) {
70-
// Expires is optional on version=1?
71-
assertTrue(setCookie.remove(0).startsWith(
72-
"Expires=" + formatter.format(utc).replace("GMT", "")));
73-
}
74-
});
60+
assertTrue(setCookie.remove(0).startsWith("custom.sid"));
61+
assertTrue(setCookie.remove("Path=/session") || setCookie.remove("Path=\"/session\""));
62+
assertTrue(setCookie.remove("HttpOnly") || setCookie.remove("HTTPOnly"));
63+
assertTrue(value, setCookie.remove("Max-Age=60"));
64+
assertTrue(setCookie.remove("Domain=localhost"));
65+
assertTrue(value, setCookie.remove("Version=1"));
66+
setCookie.remove("Comment=\"jooby cookie\"");
67+
if (setCookie.size() > 0) {
68+
// Expires is optional on version=1?
69+
assertTrue(setCookie.remove(0).startsWith(
70+
"Expires=" + formatter.format(utc).replace("GMT", "")));
71+
}
72+
});
7573
}
7674

7775
}

coverage-report/src/test/java/org/jooby/session/SessionCookieFeature.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class SessionCookieFeature extends ServerFeature {
2323
use(ConfigFactory.empty().withValue("application.secret",
2424
ConfigValueFactory.fromAnyRef("fixed")));
2525

26-
session(new Session.MemoryStore()).cookie()
26+
session(new Session.Mem()).cookie()
2727
.name("custom.sid")
2828
.path("/session")
2929
.comment("jooby cookie")

coverage-report/src/test/java/org/jooby/session/SessionCookieNoSecretFeature.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
public class SessionCookieNoSecretFeature extends ServerFeature {
1919

2020
{
21-
session(new Session.MemoryStore()).cookie()
21+
session(Session.Mem.class).cookie()
2222
.name("custom.sid")
2323
.path("/session")
2424
.maxAge(60);

coverage-report/src/test/java/org/jooby/session/SessionDataFeature.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ public void locals() throws Exception {
3838
.expect("{v1=v1}")
3939
.request(r1 ->
4040
r1.get("/s2")
41-
.expect("Optional[v1]")
41+
.expect("v1")
4242
.request(r2 ->
4343
r2.get("/s2")
44-
.expect("Optional.empty")
44+
.expect("")
4545
)
4646
);
4747

@@ -54,13 +54,13 @@ public void unsetall() throws Exception {
5454
.expect("{v1=v1}")
5555
.request(r1 ->
5656
r1.get("/unset-all")
57-
.expect("Optional[v1]")
57+
.expect("v1")
5858
.request(r2 ->
5959
r2.get("/s2")
60-
.expect("Optional.empty")
60+
.expect("")
6161
.request(r3 ->
6262
r3.get("/s2")
63-
.expect("Optional.empty")
63+
.expect("")
6464
)
6565
)
6666
);
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package org.jooby.session;
2+
3+
import static org.junit.Assert.assertNotEquals;
4+
import static org.junit.Assert.assertTrue;
5+
6+
import java.util.concurrent.atomic.AtomicReference;
7+
8+
import org.jooby.Session;
9+
import org.jooby.test.ServerFeature;
10+
import org.junit.Test;
11+
12+
import com.google.common.collect.Sets;
13+
14+
public class SessionDefMaxAgeShouldSendHeaderJustOnceFeature extends ServerFeature {
15+
16+
private static AtomicReference<String> ID = new AtomicReference<String>();
17+
18+
{
19+
session(new Session.Mem() {
20+
@Override
21+
public String generateID() {
22+
String id = super.generateID();
23+
ID.set(id);
24+
return id;
25+
}
26+
}).cookie().maxAge(-1);
27+
28+
get("/session", req -> {
29+
Session session = req.session();
30+
return session.id();
31+
});
32+
33+
}
34+
35+
@Test
36+
public void shouldRestoreSessionFromCookieID() throws Exception {
37+
ID.set(null);
38+
39+
request()
40+
.get("/session")
41+
.expect(200)
42+
.header("Set-Cookie", h -> {
43+
assertTrue(h, Sets.newHashSet(
44+
"jooby.sid=" + ID.get() + "; Version=1; Path=/; HttpOnly",
45+
"jooby.sid=" + ID.get() + ";Version=1;Path=/;HttpOnly",
46+
"jooby.sid=" + ID.get() + "; Path=\"/\"; HTTPOnly; Version=1"
47+
).contains(h));
48+
});
49+
50+
String existingID = ID.get();
51+
52+
request()
53+
.get("/session")
54+
.expect(200)
55+
.header("Set-Cookie", (String) null);
56+
57+
request()
58+
.get("/session")
59+
.expect(200)
60+
.header("Set-Cookie", (String) null);
61+
62+
// browser close
63+
request()
64+
.resetCookies()
65+
.get("/session")
66+
.expect(200)
67+
.header("Set-Cookie", h -> {
68+
assertNotEquals(ID.get(), existingID);
69+
assertTrue(h, Sets.newHashSet(
70+
"jooby.sid=" + ID.get() + "; Version=1; Path=/; HttpOnly",
71+
"jooby.sid=" + ID.get() + ";Version=1;Path=/;HttpOnly",
72+
"jooby.sid=" + ID.get() + "; Path=\"/\"; HTTPOnly; Version=1"
73+
).contains(h));
74+
});
75+
}
76+
77+
}

coverage-report/src/test/java/org/jooby/session/SessionIdWithSecretFeature.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,11 @@ public class SessionIdWithSecretFeature extends ServerFeature {
1313
use(ConfigFactory.empty().withValue("application.secret",
1414
ConfigValueFactory.fromAnyRef("1234$")));
1515

16-
session(new Session.MemoryStore() {
16+
session(new Session.Mem() {
1717
@Override
1818
public String generateID() {
1919
return "1234";
2020
}
21-
2221
});
2322

2423
get("/session", (req, rsp) -> {

coverage-report/src/test/java/org/jooby/session/SessionRestoreFeature.java

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.jooby.session;
22

33
import static org.junit.Assert.assertEquals;
4+
import static org.junit.Assert.assertTrue;
45

6+
import java.util.HashMap;
57
import java.util.LinkedHashMap;
68
import java.util.Map;
79
import java.util.concurrent.CountDownLatch;
@@ -11,6 +13,8 @@
1113
import org.jooby.test.ServerFeature;
1214
import org.junit.Test;
1315

16+
import com.google.common.base.Splitter;
17+
1418
public class SessionRestoreFeature extends ServerFeature {
1519

1620
private static final CountDownLatch latch = new CountDownLatch(1);
@@ -28,11 +32,12 @@ public class SessionRestoreFeature extends ServerFeature {
2832
lastAccessed.set(System.currentTimeMillis() - 200);
2933
lastSaved.set(lastAccessed.get());
3034
expiryAt.set(lastAccessed.get() + 2000);
31-
session(new Session.MemoryStore() {
35+
36+
session(new Session.Mem() {
3237
@Override
3338
public Session get(final Session.Builder builder) {
3439
assertEquals("678", builder.sessionId());
35-
Map<String, Object> attrs = new LinkedHashMap<String, Object>();
40+
Map<String, String> attrs = new LinkedHashMap<String, String>();
3641
attrs.put("k1", "v1.1");
3742
Session session = builder
3843
.accessedAt(lastAccessed.get())
@@ -44,14 +49,15 @@ public Session get(final Session.Builder builder) {
4449
latch.countDown();
4550
return session;
4651
}
52+
}).cookie().maxAge(2);
4753

48-
}).timeout(2);
49-
50-
get("/restore", (req, rsp) -> {
54+
get("/restore", req -> {
5155
Session session = req.session();
52-
rsp.send(session.createdAt() + "; " + session.accessedAt() + "; " + session.savedAt()
53-
+ "; " + session.expiryAt()
54-
+ "; " + session.attributes());
56+
return "createdAt:" + session.createdAt() + "\n" +
57+
"accessedAt:" + session.accessedAt() + "\n" +
58+
"savedAt:" + session.savedAt() + "\n" +
59+
"expiryAt:" + session.expiryAt() + "\n" +
60+
"attributes:" + session.attributes();
5561
});
5662

5763
}
@@ -61,8 +67,19 @@ public void shouldRestoreSessionFromCookieID() throws Exception {
6167
request()
6268
.get("/restore")
6369
.header("Cookie", "jooby.sid=678")
64-
.expect(createdAt + "; " + lastAccessed + "; " + lastSaved + "; " + expiryAt
65-
+ "; {k1=v1.1}")
70+
.expect(rsp -> {
71+
Map<String, String> result = new HashMap<>();
72+
Splitter.on("\n").splitToList(rsp).forEach(line -> {
73+
String[] entry = line.split(":");
74+
result.put(entry[0], entry[1]);
75+
});
76+
assertEquals(createdAt.get(), Long.parseLong(result.remove("createdAt")));
77+
assertEquals(lastSaved.get(), Long.parseLong(result.remove("savedAt")));
78+
assertEquals(lastAccessed.get(), Long.parseLong(result.remove("accessedAt")));
79+
assertEquals(expiryAt.get(), Long.parseLong(result.remove("expiryAt")));
80+
assertEquals("{k1=v1.1}", result.remove("attributes"));
81+
assertTrue(result.toString(), result.isEmpty());
82+
})
6683
.expect(200);
6784

6885
latch.await();

coverage-report/src/test/java/org/jooby/session/SessionSaveIntervalFeature.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,11 @@ public class SessionSaveIntervalFeature extends ServerFeature {
1313
private static final CountDownLatch saveCalls = new CountDownLatch(2);
1414

1515
{
16-
session(new Session.MemoryStore() {
16+
session(new Session.Mem() {
1717
@Override
1818
public void save(final Session session) {
1919
saveCalls.countDown();
2020
}
21-
2221
}).saveInterval(1);
2322

2423
get("/session", (req, rsp) -> {

0 commit comments

Comments
 (0)