package org.jooby.session;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicLong;
import org.jooby.Session;
import org.jooby.test.ServerFeature;
import org.junit.Test;
import com.google.common.base.Splitter;
public class SessionRestoreFeature extends ServerFeature {
private static final CountDownLatch latch = new CountDownLatch(1);
private static final AtomicLong createdAt = new AtomicLong();
private static final AtomicLong lastAccessed = new AtomicLong();
private static final AtomicLong lastSaved = new AtomicLong();
private static final AtomicLong expiryAt = new AtomicLong();
{
createdAt.set(System.currentTimeMillis() - 1000);
lastAccessed.set(System.currentTimeMillis() - 200);
lastSaved.set(lastAccessed.get());
expiryAt.set(lastAccessed.get() + 2000);
session(new Session.Mem() {
@Override
public Session get(final Session.Builder builder) {
assertEquals("678", builder.sessionId());
Map<String, String> attrs = new LinkedHashMap<String, String>();
attrs.put("k1", "v1.1");
Session session = builder
.accessedAt(lastAccessed.get())
.createdAt(createdAt.get())
.savedAt(lastSaved.get())
.set("k1", "v1")
.set(attrs)
.build();
latch.countDown();
return session;
}
}).cookie().maxAge(2);
get("/restore", req -> {
Session session = req.session();
return "createdAt:" + session.createdAt() + "\n" +
"accessedAt:" + session.accessedAt() + "\n" +
"savedAt:" + session.savedAt() + "\n" +
"expiryAt:" + session.expiryAt() + "\n" +
"attributes:" + session.attributes();
});
}
@Test
public void shouldRestoreSessionFromCookieID() throws Exception {
request()
.get("/restore")
.header("Cookie", "jooby.sid=678")
.expect(rsp -> {
Map<String, String> result = new HashMap<>();
Splitter.on("\n").splitToList(rsp).forEach(line -> {
String[] entry = line.split(":");
result.put(entry[0], entry[1]);
});
assertEquals(createdAt.get(), Long.parseLong(result.remove("createdAt")));
assertEquals(lastSaved.get(), Long.parseLong(result.remove("savedAt")));
assertEquals(lastAccessed.get(), Long.parseLong(result.remove("accessedAt")));
assertEquals(expiryAt.get(), Long.parseLong(result.remove("expiryAt")));
assertEquals("{k1=v1.1}", result.remove("attributes"));
assertTrue(result.toString(), result.isEmpty());
})
.expect(200);
latch.await();
}
}