blob: cc22cd24399b20ef261d4be0b89e9d8ab51aec57 [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.annotation;
import static org.junit.runners.MethodSorters.*;
import java.util.*;
import java.util.stream.*;
import org.apache.juneau.marshall.*;
import org.apache.juneau.rest.*;
import org.apache.juneau.rest.RestRequest;
import org.apache.juneau.rest.RestResponse;
import org.apache.juneau.rest.client2.*;
import org.apache.juneau.rest.mock2.*;
import org.junit.*;
@FixMethodOrder(NAME_ASCENDING)
public class Rest_Logging_Test {
private static String string(RestCallLoggerConfig config) {
return SimpleJson.DEFAULT.toString(config);
}
private static String string(Collection<RestCallLoggerRule> rules) {
return rules.stream().map(x -> x.toString()).collect(Collectors.joining(","));
}
//------------------------------------------------------------------------------------------------------------------
// Default logger config
//------------------------------------------------------------------------------------------------------------------
@Rest
public static class A {
@RestMethod
public String get(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
@Test
public void a01_default() throws Exception {
RestClient a = MockRestClient.build(A.class);
a.get("/").run().assertBody().is("{}");
}
//------------------------------------------------------------------------------------------------------------------
// Level
//------------------------------------------------------------------------------------------------------------------
@Rest(logging=@Logging(level="WARNING"))
public static class B1 {
@RestMethod
public String a(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(level="SEVERE"))
public String b(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(level="SEVERE"))
public String e(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
@Rest
public static class B2 {
@RestMethod
public String c(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(level="SEVERE"))
public String d(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
public static class B3 extends B1 {
@Override
public String a(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@Override
public String b(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@Override
@RestMethod(logging=@Logging(level="OFF"))
public String e(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod
public String f(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(level="SEVERE"))
public String g(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
@Test
public void b01_logging() throws Exception {
RestClient b1 = MockRestClient.build(B1.class);
b1.get("/a").run().assertBody().is("{level:'WARNING'}");
b1.get("/b").run().assertBody().is("{level:'SEVERE'}");
RestClient b2 = MockRestClient.build(B2.class);
b2.get("/c").run().assertBody().is("{}");
b2.get("/d").run().assertBody().is("{level:'SEVERE'}");
RestClient b3 = MockRestClient.build(B3.class);
b3.get("/a").run().assertBody().is("{level:'WARNING'}");
b3.get("/b").run().assertBody().is("{level:'SEVERE'}");
b3.get("/e").run().assertBody().is("{level:'OFF'}");
b3.get("/f").run().assertBody().is("{level:'WARNING'}");
b3.get("/g").run().assertBody().is("{level:'SEVERE'}");
}
//------------------------------------------------------------------------------------------------------------------
// useStackTraceHashing
//------------------------------------------------------------------------------------------------------------------
@Rest(logging=@Logging(useStackTraceHashing="true"))
public static class C1 {
@RestMethod
public String a(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(useStackTraceHashing="false"))
public String b(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(useStackTraceHashing="false"))
public String f(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
@Rest
public static class C2 {
@RestMethod
public String c(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(useStackTraceHashing="true"))
public String d(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(useStackTraceHashing="foo"))
public String e(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
public static class C3 extends C1 {
@Override
public String a(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@Override
public String b(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@Override
@RestMethod(logging=@Logging(useStackTraceHashing="TRUE"))
public String f(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod
public String g(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(useStackTraceHashing="FALSE"))
public String h(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
@Rest(logging=@Logging(useStackTraceHashing="foo"))
public static class C4 {
@RestMethod(path="i")
public String i(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
@Test
public void c01_useStackTraceHashing() throws Exception {
RestClient c1 = MockRestClient.build(C1.class);
c1.get("/a").run().assertBody().is("{useStackTraceHashing:true}");
c1.get("/b").run().assertBody().is("{}");
RestClient c2 = MockRestClient.build(C2.class);
c2.get("/c").run().assertBody().is("{}");
c2.get("/d").run().assertBody().is("{useStackTraceHashing:true}");
c2.get("/e").run().assertBody().is("{}");
RestClient c3 = MockRestClient.build(C3.class);
c3.get("/a").run().assertBody().is("{useStackTraceHashing:true}");
c3.get("/b").run().assertBody().is("{}");
c3.get("/f").run().assertBody().is("{useStackTraceHashing:true}");
c3.get("/g").run().assertBody().is("{useStackTraceHashing:true}");
c3.get("/h").run().assertBody().is("{}");
RestClient c4 = MockRestClient.build(C4.class);
c4.get("/i").run().assertBody().is("{}");
}
//------------------------------------------------------------------------------------------------------------------
// stackTraceHashingTimeout
//------------------------------------------------------------------------------------------------------------------
@Rest(logging=@Logging(stackTraceHashingTimeout="1"))
public static class D1 {
@RestMethod
public String a(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(stackTraceHashingTimeout="2"))
public String b(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(stackTraceHashingTimeout="3"))
public String e(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
@Rest
public static class D2 {
@RestMethod
public String c(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(stackTraceHashingTimeout="4"))
public String d(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
public static class D3 extends D1 {
@Override
public String a(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@Override
public String b(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@Override
@RestMethod(logging=@Logging(stackTraceHashingTimeout="5"))
public String e(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod
public String f(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(stackTraceHashingTimeout="6"))
public String g(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
@Test
public void d01_stackTraceHashingTimeout() throws Exception {
RestClient d1 = MockRestClient.build(D1.class);
d1.get("/a").run().assertBody().is("{stackTraceHashingTimeout:1}");
d1.get("/b").run().assertBody().is("{stackTraceHashingTimeout:2}");
RestClient d2 = MockRestClient.build(D2.class);
d2.get("/c").run().assertBody().is("{}");
d2.get("/d").run().assertBody().is("{stackTraceHashingTimeout:4}");
RestClient d3 = MockRestClient.build(D3.class);
d3.get("/a").run().assertBody().is("{stackTraceHashingTimeout:1}");
d3.get("/b").run().assertBody().is("{stackTraceHashingTimeout:2}");
d3.get("/e").run().assertBody().is("{stackTraceHashingTimeout:5}");
d3.get("/f").run().assertBody().is("{stackTraceHashingTimeout:1}");
d3.get("/g").run().assertBody().is("{stackTraceHashingTimeout:6}");
}
//------------------------------------------------------------------------------------------------------------------
// noTrace
//------------------------------------------------------------------------------------------------------------------
@Rest(logging=@Logging(disabled="true"))
public static class E1 {
@RestMethod
public String a(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(disabled="per-request"))
public String b(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(disabled="per-request"))
public String f(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
@Rest
public static class E2 {
@RestMethod
public String c(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(disabled="true"))
public String d(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(disabled="foo"))
public String e(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
public static class E3 extends E1 {
@Override
public String a(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@Override
public String b(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@Override
@RestMethod(logging=@Logging(disabled="false"))
public String f(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod
public String g(RestRequest req) {
return string(req.getCallLoggerConfig());
}
@RestMethod(logging=@Logging(disabled="per-request"))
public String h(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
@Rest(logging=@Logging(disabled="foo"))
public static class E4 {
@RestMethod
public String i(RestRequest req) {
return string(req.getCallLoggerConfig());
}
}
@Test
public void e01_noTrace() throws Exception {
RestClient e1 = MockRestClient.build(E1.class);
e1.get("/a").run().assertBody().is("{disabled:'TRUE'}");
e1.get("/b").run().assertBody().is("{disabled:'PER_REQUEST'}");
RestClient e2 = MockRestClient.build(E2.class);
e2.get("/c").run().assertBody().is("{}");
e2.get("/d").run().assertBody().is("{disabled:'TRUE'}");
e2.get("/e").run().assertBody().is("{}");
RestClient e3 = MockRestClient.build(E3.class);
e3.get("/a").run().assertBody().is("{disabled:'TRUE'}");
e3.get("/b").run().assertBody().is("{disabled:'PER_REQUEST'}");
e3.get("/f").run().assertBody().is("{}");
e3.get("/g").run().assertBody().is("{disabled:'TRUE'}");
e3.get("/h").run().assertBody().is("{disabled:'PER_REQUEST'}");
RestClient e4 = MockRestClient.build(E4.class);
e4.get("/i").run().assertBody().is("{}");
}
//------------------------------------------------------------------------------------------------------------------
// rules
//------------------------------------------------------------------------------------------------------------------
@Rest(logging=@Logging(rules=@LoggingRule(codes="1")))
public static class F1 {
@RestMethod
public String a(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
@RestMethod(logging=@Logging(rules=@LoggingRule(codes="2")))
public String b(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
@RestMethod(logging=@Logging(rules=@LoggingRule(codes="3")))
public String e(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
}
@Rest
public static class F2 {
@RestMethod
public String c(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
@RestMethod(logging=@Logging(rules=@LoggingRule(codes="4")))
public String d(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
}
public static class F3 extends F1 {
@Override
public String a(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
@Override
public String b(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
@Override
@RestMethod(logging=@Logging(rules=@LoggingRule(codes="5")))
public String e(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
@RestMethod
public String f(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
@RestMethod(logging=@Logging(rules=@LoggingRule(codes="6")))
public String g(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
}
@Test
public void f01_rules() throws Exception {
RestClient f1 = MockRestClient.build(F1.class);
f1.get("/a").run().assertBody().is("{codes:'1'}");
f1.get("/b").run().assertBody().is("{codes:'2'},{codes:'1'}");
RestClient f2 = MockRestClient.build(F2.class);
f2.get("/c").run().assertBody().is("");
f2.get("/d").run().assertBody().is("{codes:'4'}");
RestClient f3 = MockRestClient.build(F3.class);
f3.get("/a").run().assertBody().is("{codes:'1'}");
f3.get("/b").run().assertBody().is("{codes:'2'},{codes:'1'}");
f3.get("/e").run().assertBody().is("{codes:'5'},{codes:'3'},{codes:'1'}");
f3.get("/f").run().assertBody().is("{codes:'1'}");
f3.get("/g").run().assertBody().is("{codes:'6'},{codes:'1'}");
}
//------------------------------------------------------------------------------------------------------------------
// rules
//------------------------------------------------------------------------------------------------------------------
@Rest(
logging=@Logging(
rules=@LoggingRule(
exceptions="1",
debugOnly="true",
level="WARNING",
req="MEDIUM",
res="LARGE"
)
)
)
public static class G1 {
@RestMethod
public String a(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
@RestMethod(
logging=@Logging(
rules=@LoggingRule(
exceptions="2",
debugOnly="true",
level="WARNING",
req="MEDIUM",
res="LARGE"
)
)
)
public String b(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
}
@Rest
public static class G2 {
@RestMethod(
logging=@Logging(
rules=@LoggingRule(
exceptions="3",
debugOnly="true",
level="WARNING",
req="MEDIUM",
res="LARGE"
)
)
)
public String a(RestRequest req) {
return string(req.getCallLoggerConfig().getRules());
}
}
@Test
public void g01_rules() throws Exception {
RestClient g1 = MockRestClient.build(G1.class);
g1.get("/b").run().assertBody().is("{exceptions:'2',debugOnly:true,level:'WARNING',req:'MEDIUM'},{exceptions:'1',debugOnly:true,level:'WARNING',req:'MEDIUM'}");
RestClient g2 = MockRestClient.build(G2.class);
g2.get("/a").run().assertBody().is("{exceptions:'3',debugOnly:true,level:'WARNING',req:'MEDIUM'}");
}
//------------------------------------------------------------------------------------------------------------------
// Examples
//------------------------------------------------------------------------------------------------------------------
@Rest(
debug="always",
logging=@Logging(
useStackTraceHashing="true",
rules={
@LoggingRule(codes=">=500", level="off", req="short", res="short")
}
)
)
public static class H {
@RestMethod(method="POST", path="foo")
public String a(RestRequest req, RestResponse res) throws Exception {
res.setStatus(500);
res.setHeader("Foo", "bar");
res.setException(new StringIndexOutOfBoundsException());
return req.getBody().asString();
}
}
@Test
public void h01_examples() throws Exception {
RestClient MY_REST = MockRestClient.buildLax(H.class);
MY_REST.post("/foo?foo=bar", "Foo")
.header("Foo", "bar")
.run()
.assertCode().is(500);
MY_REST.post("/foo?foo=bar", "Foo")
.header("Foo", "bar")
.run()
.assertCode().is(500);
}
}