package org.jooby; import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import java.time.ZoneId; import java.util.Optional; import org.jooby.test.MockUnit; import org.jooby.test.MockUnit.Block; 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({RequestLogger.class, System.class }) public class RequestLoggerTest { private Block capture = unit -> { Response rsp = unit.get(Response.class); rsp.complete(unit.capture(Route.Complete.class)); }; private Block onComplete = unit -> { unit.captured(Route.Complete.class).iterator().next() .handle(unit.get(Request.class), unit.get(Response.class), Optional.empty()); }; @Test public void basicUsage() throws Exception { new MockUnit(Request.class, Response.class) .expect(capture) .expect(timestamp(1L)) .expect(ip("127.0.0.1")) .expect(method("GET")) .expect(path("/")) .expect(protocol("HTTP/1.1")) .expect(status(Status.OK)) .expect(len(345L)) .run(unit -> { new RequestLogger() .dateFormatter(ZoneId.of("UTC")) .handle(unit.get(Request.class), unit.get(Response.class)); }, onComplete); } @Test public void latency() throws Exception { new MockUnit(Request.class, Response.class) .expect(capture) .expect(timestamp(7L)) .expect(ip("127.0.0.1")) .expect(method("GET")) .expect(path("/")) .expect(protocol("HTTP/1.1")) .expect(status(Status.OK)) .expect(len(345L)) .expect(unit -> { unit.mockStatic(System.class); expect(System.currentTimeMillis()).andReturn(10L); }) .run(unit -> { new RequestLogger() .dateFormatter(ZoneId.of("UTC")) .latency() .log(line -> assertEquals( "127.0.0.1 - - [01/Jan/1970:00:00:00 +0000] \"GET / HTTP/1.1\" 200 345 3", line)) .handle(unit.get(Request.class), unit.get(Response.class)); }, onComplete); } @Test public void extended() throws Exception { new MockUnit(Request.class, Response.class) .expect(capture) .expect(timestamp(7L)) .expect(ip("127.0.0.1")) .expect(method("GET")) .expect(path("/")) .expect(protocol("HTTP/1.1")) .expect(status(Status.OK)) .expect(len(345L)) .expect(referer("/referer")) .expect(userAgent("ugent")) .run(unit -> { new RequestLogger() .dateFormatter(ZoneId.of("UTC")) .extended() .log(line -> assertEquals( "127.0.0.1 - - [01/Jan/1970:00:00:00 +0000] \"GET / HTTP/1.1\" 200 345 \"/referer\" \"ugent\"", line)) .handle(unit.get(Request.class), unit.get(Response.class)); }, onComplete); } private Block referer(final String referer) { return unit -> { Mutant mutant = unit.mock(Mutant.class); expect(mutant.value("-")).andReturn(referer); Request req = unit.get(Request.class); expect(req.header("Referer")).andReturn(mutant); }; } private Block userAgent(final String userAgent) { return unit -> { Mutant mutant = unit.mock(Mutant.class); expect(mutant.value("-")).andReturn(userAgent); Request req = unit.get(Request.class); expect(req.header("User-Agent")).andReturn(mutant); }; } @Test public void customLog() throws Exception { new MockUnit(Request.class, Response.class) .expect(capture) .expect(timestamp(1L)) .expect(ip("127.0.0.1")) .expect(method("GET")) .expect(path("/")) .expect(protocol("HTTP/1.1")) .expect(status(Status.OK)) .expect(len(345L)) .run(unit -> { new RequestLogger() .dateFormatter(ZoneId.of("UTC")) .log(line -> assertEquals( "127.0.0.1 - - [01/Jan/1970:00:00:00 +0000] \"GET / HTTP/1.1\" 200 345", line)) .handle(unit.get(Request.class), unit.get(Response.class)); }, onComplete); } private Block method(final String method) { return unit -> { Request req = unit.get(Request.class); expect(req.method()).andReturn(method); }; } private Block path(final String path) { return unit -> { Request req = unit.get(Request.class); expect(req.path()).andReturn(path); }; } private Block status(final Status status) { return unit -> { Response rsp = unit.get(Response.class); expect(rsp.status()).andReturn(Optional.ofNullable(status)); }; } private Block len(final Long len) { return unit -> { Mutant mutant = unit.mock(Mutant.class); expect(mutant.value("-")).andReturn(len.toString()); Response rsp = unit.get(Response.class); expect(rsp.header("Content-Length")).andReturn(mutant); }; } private Block protocol(final String protocol) { return unit -> { Request req = unit.get(Request.class); expect(req.protocol()).andReturn(protocol); }; } private Block timestamp(final long ts) { return unit -> { Request req = unit.get(Request.class); expect(req.timestamp()).andReturn(ts); }; } private Block ip(final String ip) { return unit -> { Request req = unit.get(Request.class); expect(req.ip()).andReturn(ip); }; } }