package com.vtence.molecule.middlewares; import com.vtence.molecule.Request; import com.vtence.molecule.Response; import com.vtence.molecule.support.LoggingSupport.LogRecordingHandler; import org.junit.Test; import java.time.Clock; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZoneOffset; import java.util.Locale; import static com.vtence.molecule.http.HeaderNames.REFERER; import static com.vtence.molecule.http.HeaderNames.USER_AGENT; import static com.vtence.molecule.http.HttpMethod.DELETE; import static com.vtence.molecule.http.HttpMethod.GET; import static com.vtence.molecule.http.HttpMethod.POST; import static com.vtence.molecule.http.HttpStatus.NO_CONTENT; import static com.vtence.molecule.http.HttpStatus.OK; import static com.vtence.molecule.support.LoggingSupport.anonymousLogger; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsString; public class ApacheCombinedLoggerTest { LogRecordingHandler logRecords = new LogRecordingHandler(); Instant currentTime = LocalDateTime.of(2012, 6, 27, 12, 4, 0).toInstant(ZoneOffset.of("-05:00")); ApacheCombinedLogger logger = new ApacheCombinedLogger(anonymousLogger(logRecords), Clock.fixed(currentTime, ZoneId.of("GMT+01:00")), Locale.US); Request request = new Request().protocol("HTTP/1.1").remoteIp("192.168.0.1"); Response response = new Response(); @Test public void logsRequestsServedInApacheCombinedLogFormat() throws Exception { request.method(GET) .uri("/products?keyword=dogs") .header(REFERER, "http://lama/wool") .header(USER_AGENT, "Mozilla/5.0 (compatible; MSIE 9.0; AOL 9.7)"); logger.handle(request, response); response.status(OK).body("a response with a size of 28").done(); response.await(); logRecords.assertEntries(contains("192.168.0.1 - - [27/Jun/2012:18:04:00 +0100] \"GET /products?keyword=dogs HTTP/1.1\" 200 28 \"http://lama/wool\" \"Mozilla/5.0 (compatible; MSIE 9.0; AOL 9.7)\"")); } @Test public void logsEmptyStringWhenNoUserAgentInRequest() throws Exception { request.method(GET) .uri("/products?keyword=dogs") .header(REFERER, "http://lama/wool"); logger.handle(request, response); response.status(OK).body("a response with a size of 28").done(); response.await(); logRecords.assertEntries(contains("192.168.0.1 - - [27/Jun/2012:18:04:00 +0100] \"GET /products?keyword=dogs HTTP/1.1\" 200 28 \"http://lama/wool\" \"\"")); } @Test public void logsEmptyStringWhenNoRefererInRequest() throws Exception { request.method(GET) .uri("/products?keyword=dogs") .header(USER_AGENT, "Mozilla/5.0 (compatible; MSIE 9.0; AOL 9.7)"); logger.handle(request, response); response.status(OK).body("a response with a size of 28").done(); response.await(); logRecords.assertEntries(contains("192.168.0.1 - - [27/Jun/2012:18:04:00 +0100] \"GET /products?keyword=dogs HTTP/1.1\" 200 28 \"\" \"Mozilla/5.0 (compatible; MSIE 9.0; AOL 9.7)\"")); } @Test public void usesOriginalRequestValues() throws Exception { request.remoteIp("192.168.0.1").method(DELETE).uri("/logout") .header(REFERER, "http://lama/wool") .header(USER_AGENT, "Mozilla/5.0..."); logger.connectTo((request, response) -> { request.uri("/changed").method(POST).remoteIp("100.100.100.1").protocol("HTTPS") .header(REFERER, "?").header(USER_AGENT, "?"); response.status(NO_CONTENT).done(); }); logger.handle(request, response); logRecords.assertEntries(contains(containsString("\"DELETE /logout HTTP/1.1\" 204 - \"http://lama/wool\" \"Mozilla/5.0...\""))); } }