package org.jooby.internal;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.time.Instant;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import org.jooby.Cookie;
import org.jooby.test.MockUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Cookie.Definition.class, CookieImpl.class, System.class })
public class CookieImplTest {
static final DateTimeFormatter fmt = DateTimeFormatter
.ofPattern("E, dd-MMM-yyyy HH:mm:ss z", Locale.ENGLISH)
.withZone(ZoneId.of("GMT"));
@Test
public void encodeNameAndValue() throws Exception {
assertEquals("jooby.sid=1234;Version=1", new Cookie.Definition("jooby.sid", "1234").toCookie()
.encode());
}
@Test
public void escapeQuote() throws Exception {
assertEquals("jooby.sid=\"a\\\"b\";Version=1", new Cookie.Definition("jooby.sid", "a\"b").toCookie()
.encode());
}
@Test
public void escapeSlash() throws Exception {
assertEquals("jooby.sid=\"a\\\\b\";Version=1", new Cookie.Definition("jooby.sid", "a\\b").toCookie()
.encode());
}
@Test
public void oneChar() throws Exception {
assertEquals("jooby.sid=1;Version=1", new Cookie.Definition("jooby.sid", "1").toCookie()
.encode());
}
@Test
public void escapeValueStartingWithQuoute() throws Exception {
assertEquals("jooby.sid=\"\\\"1\";Version=1", new Cookie.Definition("jooby.sid", "\"1").toCookie()
.encode());
}
@Test(expected = IllegalArgumentException.class)
public void badChar() throws Exception {
char ch = '\n';
new Cookie.Definition("name", "" + ch).toCookie().encode();
}
@Test(expected = IllegalArgumentException.class)
public void badChar2() throws Exception {
char ch = 0x7f;
new Cookie.Definition("name", "" + ch).toCookie().encode();
}
@Test
public void encodeSessionCookie() throws Exception {
assertEquals("jooby.sid=1234;Version=1", new Cookie.Definition("jooby.sid", "1234").maxAge(-1)
.toCookie().encode());
}
@Test
public void nullValue() throws Exception {
assertEquals("jooby.sid=;Version=1", new Cookie.Definition("jooby.sid", "").maxAge(-1)
.toCookie().encode());
}
@Test
public void emptyValue() throws Exception {
assertEquals("jooby.sid=;Version=1", new Cookie.Definition("jooby.sid", "").maxAge(-1)
.toCookie().encode());
}
@Test
public void quotedValue() throws Exception {
assertEquals("jooby.sid=\"val 1\";Version=1", new Cookie.Definition("jooby.sid", "\"val 1\"")
.maxAge(-1)
.toCookie().encode());
}
@Test
public void encodeHttpOnly() throws Exception {
assertEquals("jooby.sid=1234;Version=1;HttpOnly",
new Cookie.Definition("jooby.sid", "1234").httpOnly(true).toCookie()
.encode());
}
@Test
public void encodeSecure() throws Exception {
assertEquals("jooby.sid=1234;Version=1;Secure",
new Cookie.Definition("jooby.sid", "1234").secure(true).toCookie()
.encode());
}
@Test
public void encodePath() throws Exception {
assertEquals("jooby.sid=1234;Version=1;Path=/",
new Cookie.Definition("jooby.sid", "1234").path("/").toCookie().encode());
}
@Test
public void encodeDomain() throws Exception {
assertEquals("jooby.sid=1234;Version=1;Domain=example.com",
new Cookie.Definition("jooby.sid", "1234").domain("example.com").toCookie().encode());
}
@Test
public void encodeComment() throws Exception {
assertEquals("jooby.sid=1234;Version=1;Comment=\"1,2,3\"",
new Cookie.Definition("jooby.sid", "1234").comment("1,2,3").toCookie()
.encode());
}
@Test
public void encodeMaxAge0() throws Exception {
assertEquals("jooby.sid=1234;Version=1;Max-Age=0;Expires=Thu, 01-Jan-1970 00:00:00 GMT",
new Cookie.Definition("jooby.sid", "1234").maxAge(0).toCookie().encode());
}
@Test
public void encodeMaxAge60() throws Exception {
assertTrue(new Cookie.Definition("jooby.sid", "1234")
.maxAge(60).toCookie().encode().startsWith("jooby.sid=1234;Version=1;Max-Age=60"));
long millis = 1428708685066L;
new MockUnit()
.expect(unit -> {
unit.mockStatic(System.class);
expect(System.currentTimeMillis()).andReturn(millis);
})
.run(unit -> {
Instant instant = Instant.ofEpochMilli(millis + 60 * 1000L);
assertEquals("jooby.sid=1234;Version=1;Max-Age=60;Expires=" + fmt.format(instant),
new Cookie.Definition("jooby.sid", "1234").maxAge(60).toCookie().encode());
});
}
@Test
public void encodeEverything() throws Exception {
assertTrue(new Cookie.Definition("jooby.sid", "1234")
.maxAge(60).toCookie().encode().startsWith("jooby.sid=1234;Version=1;Max-Age=60"));
long millis = 1428708685066L;
new MockUnit()
.expect(unit -> {
unit.mockStatic(System.class);
expect(System.currentTimeMillis()).andReturn(millis);
})
.run(
unit -> {
Instant instant = Instant.ofEpochMilli(millis + 120 * 1000L);
assertEquals(
"jooby.sid=1234;Version=1;Path=/;Domain=example.com;Secure;HttpOnly;Max-Age=120;Expires="
+ fmt.format(instant) + ";Comment=c",
new Cookie.Definition("jooby.sid", "1234")
.comment("c")
.domain("example.com")
.httpOnly(true)
.maxAge(120)
.path("/")
.secure(true)
.toCookie()
.encode()
);
});
}
}