blob: 1b6e389e2b5a0ec0f2bf851d3ed79a7bd404fe77 [file] [log] [blame]
// ***************************************************************************************************************************
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
// * with the License. You may obtain a copy of the License at *
// * *
// * http://www.apache.org/licenses/LICENSE-2.0 *
// * *
// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
// * specific language governing permissions and limitations under the License. *
// ***************************************************************************************************************************
package org.apache.juneau.rest;
import static org.junit.Assert.*;
import static org.junit.runners.MethodSorters.*;
import static org.apache.juneau.rest.RestCallLoggingDetail.*;
import static java.util.logging.Level.*;
import java.util.logging.*;
import java.util.regex.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.rest.mock2.*;
import org.apache.juneau.utils.*;
import org.junit.*;
@FixMethodOrder(NAME_ASCENDING)
public class BasicRestCallLogger_Test {
//------------------------------------------------------------------------------------------------------------------
// No logging
//------------------------------------------------------------------------------------------------------------------
@Test
public void a01a_noRules() {
RestCallLoggerConfig lc = config().build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc);
MockServletRequest req = req();
MockServletResponse res = res();
cl.log(lc, req, res);
tc.check(null, null, false);
cl.log(lcw, req, res);
tc.check(null, null, false);
}
@Test
public void a02_levelOff() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").level(OFF).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc);
MockServletRequest req = req();
MockServletResponse res = res();
cl.log(lc, req, res);
tc.check(null, null, false);
cl.log(lcw, req, res);
tc.check(null, null, false);
}
//------------------------------------------------------------------------------------------------------------------
// Basic logging
//------------------------------------------------------------------------------------------------------------------
@Test
public void b01_short_short() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(SHORT).res(SHORT).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc);
MockServletRequest req = req().uri("/foo");
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "[200] HTTP GET /foo", false);
cl.log(lcw, req, res);
tc.check(INFO, "[200] HTTP GET /foo", false);
}
@Test
public void b02_short_short_default() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc);
MockServletRequest req = req().uri("/foo");
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "[200] HTTP GET /foo", false);
cl.log(lcw, req, res);
tc.check(INFO, "[200] HTTP GET /foo", false);
}
//------------------------------------------------------------------------------------------------------------------
// Stack trace hashing.
//------------------------------------------------------------------------------------------------------------------
@Test
public void c01_stackTraceHashing_on() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(SHORT).res(SHORT).build()
)
.useStackTraceHashing()
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
Exception e = new StringIndexOutOfBoundsException();
MockServletRequest req = req().uri("/foo").attribute("Exception", e);
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "[200,*.1] HTTP GET /foo", true);
cl.log(lc, req, res);
tc.check(INFO, "[200,*.2] HTTP GET /foo", false);
cl.resetStackTraces();
cl.log(lcw, req, res);
tc.check(INFO, "[200,*.1] HTTP GET /foo", true);
cl.log(lcw, req, res);
tc.check(INFO, "[200,*.2] HTTP GET /foo", false);
}
@Test
public void c02_stackTraceHashing_true() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(SHORT).res(SHORT).build()
)
.useStackTraceHashing(true)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
Exception e = new StringIndexOutOfBoundsException();
MockServletRequest req = req().uri("/foo").attribute("Exception", e);
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "[200,*.1] HTTP GET /foo", true);
cl.log(lc, req, res);
tc.check(INFO, "[200,*.2] HTTP GET /foo", false);
cl.resetStackTraces();
cl.log(lcw, req, res);
tc.check(INFO, "[200,*.1] HTTP GET /foo", true);
cl.log(lcw, req, res);
tc.check(INFO, "[200,*.2] HTTP GET /foo", false);
}
@Test
public void c03_stackTraceHashing_false() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(SHORT).res(SHORT).build()
)
.useStackTraceHashing(false)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
Exception e = new StringIndexOutOfBoundsException();
MockServletRequest req = req().uri("/foo").attribute("Exception", e);
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
cl.log(lc, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
cl.resetStackTraces();
cl.log(lcw, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
cl.log(lcw, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
}
@Test
public void c04_stackTraceHashing_default() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(SHORT).res(SHORT).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
Exception e = new StringIndexOutOfBoundsException();
MockServletRequest req = req().uri("/foo").attribute("Exception", e);
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
cl.log(lc, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
cl.resetStackTraces();
cl.log(lcw, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
cl.log(lcw, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
}
@Test
public void c05_stackTraceHashing_null() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(SHORT).res(SHORT).build()
)
.useStackTraceHashing(null)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
Exception e = new StringIndexOutOfBoundsException();
MockServletRequest req = req().uri("/foo").attribute("Exception", e);
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
cl.log(lc, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
cl.resetStackTraces();
cl.log(lcw, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
cl.log(lcw, req, res);
tc.check(INFO, "[200] HTTP GET /foo", true);
}
@Test
public void c06_stackTraceHashing_timeout_on() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(SHORT).res(SHORT).build()
)
.useStackTraceHashing()
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc, new StackTraceDatabase(100000, null)).resetStackTraces();
Exception e = new StringIndexOutOfBoundsException();
MockServletRequest req = req().uri("/foo").attribute("Exception", e);
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "[200,*.1] HTTP GET /foo", true);
cl.log(lc, req, res);
tc.check(INFO, "[200,*.2] HTTP GET /foo", false);
cl.resetStackTraces();
cl.log(lcw, req, res);
tc.check(INFO, "[200,*.1] HTTP GET /foo", true);
cl.log(lcw, req, res);
tc.check(INFO, "[200,*.2] HTTP GET /foo", false);
}
@Test
public void c07_stackTraceHashing_timeout_off() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(SHORT).res(SHORT).build()
)
.useStackTraceHashing()
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc, new StackTraceDatabase(-2, null)).resetStackTraces();
Exception e = new StringIndexOutOfBoundsException();
MockServletRequest req = req().uri("/foo").attribute("Exception", e);
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "[200,*.0] HTTP GET /foo", true);
cl.log(lc, req, res);
tc.check(INFO, "[200,*.0] HTTP GET /foo", true);
cl.resetStackTraces();
cl.log(lcw, req, res);
tc.check(INFO, "[200,*.0] HTTP GET /foo", true);
cl.log(lcw, req, res);
tc.check(INFO, "[200,*.0] HTTP GET /foo", true);
}
//------------------------------------------------------------------------------------------------------------------
// Various logging options.
//------------------------------------------------------------------------------------------------------------------
@Test
public void d01a_requestLength_on() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(MEDIUM).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().attribute("RequestBody", "foo".getBytes());
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "*\tRequest length: 3 bytes\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "*\tRequest length: 3 bytes\n*", false);
}
@Test
public void d01b_requestLength_off() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(SHORT).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().attribute("RequestBody", "foo".getBytes());
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*\tRequest length: 3 bytes\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*\tRequest length: 3 bytes\n*", false);
}
@Test
public void d01c_requestLength_none() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(LONG).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req();
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*\tRequest length: 3 bytes\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*\tRequest length: 3 bytes\n*", false);
}
@Test
public void d02a_responseCode_on() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(MEDIUM).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req();
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "*\tResponse code: 200\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "*\tResponse code: 200\n*", false);
}
@Test
public void d02b_responseCode_off() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(SHORT).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req();
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*\tResponse code: 200\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*\tResponse code: 200\n*", false);
}
@Test
public void d03a_responseLength_on() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(MEDIUM).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().attribute("ResponseBody", "foo".getBytes());
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "*\tResponse length: 3 bytes\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "*\tResponse length: 3 bytes\n*", false);
}
@Test
public void d03b_responseLength_off() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(SHORT).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().attribute("ResponseBody", "foo".getBytes());
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*\tResponse length: 3 bytes\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*\tResponse length: 3 bytes\n*", false);
}
@Test
public void d03c_responseLength_nonef() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(MEDIUM).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req();
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*\tResponse length: 3 bytes\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*\tResponse length: 3 bytes\n*", false);
}
@Test
public void d04a_execTime_on() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(MEDIUM).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().attribute("ExecTime", 123l);
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "*\tExec time: 123ms\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "*\tExec time: 123ms\n*", false);
}
@Test
public void d04b_execTime_off() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(SHORT).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().attribute("ExecTime", 123l);
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*\tExec time: 123ms\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*\tExec time: 123ms\n*", false);
}
@Test
public void d04c_execTime_none() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(MEDIUM).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req();
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*\tExec time: 123ms\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*\tExec time: 123ms\n*", false);
}
@Test
public void d05a_requestHeaders_on() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(MEDIUM).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().header("Foo", "bar");
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "*---Request Headers---\n\tFoo: bar\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "*---Request Headers---\n\tFoo: bar\n*", false);
}
@Test
public void d05b_requestHeaders_off() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(SHORT).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().header("Foo", "bar");
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*---Request Headers---*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*---Request Headers---*", false);
}
@Test
public void d06a_responseHeaders_on() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(MEDIUM).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req();
MockServletResponse res = res(200).header("Foo", "bar");;
cl.log(lc, req, res);
tc.check(INFO, "*---Response Headers---\n\tFoo: bar\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "*---Response Headers---\n\tFoo: bar\n*", false);
}
@Test
public void d06b_responseHeaders_off() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(SHORT).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req();
MockServletResponse res = res(200).header("Foo", "bar");;
cl.log(lc, req, res);
tc.check(INFO, "!*---Response Headers---*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*---Response Headers---*", false);
}
@Test
public void d07a_requestBody_on() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(LONG).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().attribute("RequestBody", "foo".getBytes());
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "*---Request Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "*---Request Body Hex---\n66 6F 6F\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "*---Request Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "*---Request Body Hex---\n66 6F 6F\n*", false);
}
@Test
public void d07b_requestBody_off() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(MEDIUM).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().attribute("RequestBody", "foo".getBytes());
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*---Request Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "!*---Request Body Hex---\n66 6F 6F\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*---Request Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "!*---Request Body Hex---\n66 6F 6F\n*", false);
}
@Test
public void d07c_requestBody_none() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").req(LONG).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req();
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*---Request Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "!*---Request Body Hex---\n66 6F 6F\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*---Request Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "!*---Request Body Hex---\n66 6F 6F\n*", false);
}
@Test
public void d08a_responseBody_on() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(LONG).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().attribute("ResponseBody", "foo".getBytes());
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "*---Response Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "*---Response Body Hex---\n66 6F 6F\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "*---Response Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "*---Response Body Hex---\n66 6F 6F\n*", false);
}
@Test
public void d08b_responseBody_off() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(MEDIUM).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req().attribute("ResponseBody", "foo".getBytes());
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*---Response Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "!*---Response Body Hex---\n66 6F 6F\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*---Response Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "!*---Response Body Hex---\n66 6F 6F\n*", false);
}
@Test
public void d08c_responseBody_none() {
RestCallLoggerConfig lc =
config()
.rules(
rule().codes("*").res(LONG).build()
)
.build();
RestCallLoggerConfig lcw = wrapped(lc);
TestLogger tc = new TestLogger();
BasicRestCallLogger cl = logger(tc).resetStackTraces();
MockServletRequest req = req();
MockServletResponse res = res(200);
cl.log(lc, req, res);
tc.check(INFO, "!*---Response Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "!*---Response Body Hex---\n66 6F 6F\n*", false);
cl.log(lcw, req, res);
tc.check(INFO, "!*---Response Body UTF-8---\nfoo\n*", false);
tc.check(INFO, "!*---Response Body Hex---\n66 6F 6F\n*", false);
}
//------------------------------------------------------------------------------------------------------------------
// Helper methods
//------------------------------------------------------------------------------------------------------------------
static class TestLogger extends Logger {
Level level;
String msg;
Throwable t;
protected TestLogger() {
super(null, null);
}
@Override
public void log(Level level, String msg, Throwable t) {
this.level = level;
this.msg = msg;
this.t = t;
}
public void check(Level level, String msg, boolean hasThrowable) {
boolean isNot = (msg != null && msg.length() > 0 && msg.charAt(0) == '!');
if (isNot)
msg = msg.substring(1);
if (msg != null && msg.indexOf('*') != -1) {
Pattern p = StringUtils.getMatchPattern(msg, Pattern.DOTALL);
boolean eq = p.matcher(this.msg).matches();
if (isNot ? eq : ! eq)
fail("Message text didn't match [2].\nExpected=["+msg+"]\nActual=["+this.msg+"]");
} else {
boolean eq = StringUtils.isEquals(this.msg, msg);
if (isNot ? eq : ! eq)
fail("Message text didn't match [1].\nExpected=["+msg+"]\nActual=["+this.msg+"]");
}
assertEquals("Message level didn't match.", level, this.level);
if (hasThrowable && t == null)
fail("Throwable not present");
if (t != null && ! hasThrowable)
fail("Throwable present.");
}
}
private RestCallLoggerConfig.Builder config() {
return RestCallLoggerConfig.create();
}
private RestCallLoggerConfig wrapped(RestCallLoggerConfig config) {
return RestCallLoggerConfig.create().parent(config).build();
}
private BasicRestCallLogger logger(Logger l, StackTraceDatabase std) {
return new BasicRestCallLogger(l, std);
}
private BasicRestCallLogger logger(Logger l) {
return new BasicRestCallLogger(l, new StackTraceDatabase());
}
private RestCallLoggerRule.Builder rule() {
return RestCallLoggerRule.create();
}
private MockServletRequest req() {
return MockServletRequest.create();
}
private MockServletResponse res() {
return MockServletResponse.create();
}
private MockServletResponse res(int status) {
return MockServletResponse.create().status(status);
}
}