diff --git a/bom/application/pom.xml b/bom/application/pom.xml index a23b245708ee0..57504808a7327 100644 --- a/bom/application/pom.xml +++ b/bom/application/pom.xml @@ -17,7 +17,7 @@ 1.69 1.0.2.1 1.0.12.2 - 2.3.1.Final + 2.4.0.Final 4.7.0.Final 0.33.0 1.0.0 @@ -4365,6 +4365,11 @@ asm-analysis ${asm.version} + + org.ow2.asm + asm-commons + ${asm.version} + org.slf4j slf4j-api diff --git a/build-parent/pom.xml b/build-parent/pom.xml index e7c6e7f70fe40..605cba756dbd3 100644 --- a/build-parent/pom.xml +++ b/build-parent/pom.xml @@ -34,7 +34,7 @@ ${version.surefire.plugin} - 1.1.1 + 1.2.0 2.0.2 1.3.3 - 2.3.1.Final + 2.4.0.Final 5.7.2 3.8.1 3.20.2 diff --git a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanArchives.java b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanArchives.java index 3ea6daa02c1d2..6e7299cef1daa 100644 --- a/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanArchives.java +++ b/independent-projects/arc/processor/src/main/java/io/quarkus/arc/processor/BeanArchives.java @@ -32,6 +32,7 @@ import org.jboss.jandex.Index; import org.jboss.jandex.IndexView; import org.jboss.jandex.Indexer; +import org.jboss.jandex.ModuleInfo; import org.jboss.jandex.Type; import org.jboss.logging.Logger; @@ -177,6 +178,21 @@ public Collection getAnnotationsWithRepeatable(DotName annot return this.index.getAnnotationsWithRepeatable(annotationName, index); } + @Override + public Collection getKnownModules() { + return this.index.getKnownModules(); + } + + @Override + public ModuleInfo getModuleByName(DotName moduleName) { + return this.index.getModuleByName(moduleName); + } + + @Override + public Collection getKnownUsers(DotName className) { + return this.index.getKnownUsers(className); + } + private void getAllKnownSubClasses(DotName className, Set allKnown, Set processedClasses) { final Set subClassesToProcess = new HashSet(); subClassesToProcess.add(className); diff --git a/independent-projects/resteasy-reactive/pom.xml b/independent-projects/resteasy-reactive/pom.xml index f43d16df34780..97550a20502e9 100644 --- a/independent-projects/resteasy-reactive/pom.xml +++ b/independent-projects/resteasy-reactive/pom.xml @@ -37,7 +37,7 @@ 11 2.0.2 - 2.3.1.Final + 2.4.0.Final 5.7.2 3.8.1 3.20.2 diff --git a/independent-projects/tools/pom.xml b/independent-projects/tools/pom.xml index 5b5fc826e20ef..69b9bf3c9181f 100644 --- a/independent-projects/tools/pom.xml +++ b/independent-projects/tools/pom.xml @@ -54,7 +54,7 @@ 18 2.11.0 1.6.0 - 1.1.1 + 1.2.0 artifact-api diff --git a/integration-tests/logging-panache/pom.xml b/integration-tests/logging-panache/pom.xml new file mode 100644 index 0000000000000..e15484e26d3e5 --- /dev/null +++ b/integration-tests/logging-panache/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + + + quarkus-integration-tests-parent + io.quarkus + 999-SNAPSHOT + + + quarkus-integration-test-logging-panache + + Quarkus - Integration Tests - Logging with Panache + + + + io.quarkus + quarkus-arc-deployment + test + + + io.quarkus + quarkus-resteasy + test + + + + io.quarkus + quarkus-junit5-internal + test + + + io.rest-assured + rest-assured + test + + + org.assertj + assertj-core + test + + + + + io.quarkus + quarkus-resteasy-deployment + ${project.version} + pom + test + + + * + * + + + + + diff --git a/integration-tests/logging-panache/src/test/java/io/quarkus/logging/GenerateAllLogUsages.java b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/GenerateAllLogUsages.java new file mode 100644 index 0000000000000..4341ee3c653da --- /dev/null +++ b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/GenerateAllLogUsages.java @@ -0,0 +1,62 @@ +package io.quarkus.logging; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.Parameter; +import java.util.Arrays; +import java.util.Comparator; + +import org.jboss.logging.Logger; + +public class GenerateAllLogUsages { + public static void main(String[] args) { + println("package io.quarkus.logging;"); + println(""); + println("// generated by GenerateAllLogUsages, don't update manually"); + println("public class GeneratedBean {"); + println(" public void testLogging() {"); + Arrays.stream(Log.class.getDeclaredMethods()) + .filter(method -> Modifier.isPublic(method.getModifiers())) + .sorted(Comparator.comparing(Method::getName).thenComparingInt(Method::getParameterCount)) + .forEach(method -> { + Parameter[] parameters = method.getParameters(); + String[] arguments = new String[method.getParameterCount()]; + for (int i = 0; i < parameters.length; i++) { + Parameter parameter = parameters[i]; + String argument; + if (parameter.getType() == Object.class && "message".equals(parameter.getName())) { + argument = "\"foobar\""; + } else if (parameter.getType() == Object.class + && (parameter.getName().startsWith("param") || parameter.getName().startsWith("arg"))) { + argument = "new Object()"; + } else if (parameter.getType() == Object[].class && "params".equals(parameter.getName())) { + argument = "new Object[] {}"; + } else if (parameter.getType() == String.class && "loggerFqcn".equals(parameter.getName())) { + argument = "\"io.quarkus.logging.GeneratedBean\""; + } else if (parameter.getType() == String.class && "format".equals(parameter.getName())) { + argument = "\"foobar\""; + } else if (parameter.getType() == int.class) { + argument = "13"; + } else if (parameter.getType() == long.class) { + argument = "42L"; + } else if (parameter.getType() == Throwable.class) { + argument = "new NoStackTraceTestException()"; + } else if (parameter.getType() == Logger.Level.class) { + argument = "org.jboss.logging.Logger.Level.INFO"; + } else { + throw new RuntimeException("Couldn't generate argument value for parameter " + i + " of type " + + method.getParameterTypes()[i] + ": " + method); + } + arguments[i] = argument; + } + + println(" Log." + method.getName() + "(" + String.join(", ", arguments) + ");"); + }); + println(" }"); + println("}"); + } + + private static void println(String string) { + System.out.println(string); + } +} diff --git a/integration-tests/logging-panache/src/test/java/io/quarkus/logging/GeneratedBean.java b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/GeneratedBean.java new file mode 100644 index 0000000000000..7dea885e5c4c9 --- /dev/null +++ b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/GeneratedBean.java @@ -0,0 +1,219 @@ +package io.quarkus.logging; + +// generated by GenerateAllLogUsages, don't update manually +public class GeneratedBean { + public void testLogging() { + Log.debug("foobar"); + Log.debug("foobar", new NoStackTraceTestException()); + Log.debug("io.quarkus.logging.GeneratedBean", "foobar", new NoStackTraceTestException()); + Log.debug("io.quarkus.logging.GeneratedBean", "foobar", new Object[] {}, new NoStackTraceTestException()); + Log.debugf("foobar", new Object[] {}); + Log.debugf("foobar", new Object()); + Log.debugf("foobar", 13); + Log.debugf("foobar", 42L); + Log.debugf("foobar", 13, new Object()); + Log.debugf("foobar", 13, 13); + Log.debugf(new NoStackTraceTestException(), "foobar", 13); + Log.debugf(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.debugf("foobar", new Object(), new Object()); + Log.debugf(new NoStackTraceTestException(), "foobar", new Object()); + Log.debugf(new NoStackTraceTestException(), "foobar", 42L); + Log.debugf("foobar", 42L, new Object()); + Log.debugf("foobar", 42L, 42L); + Log.debugf(new NoStackTraceTestException(), "foobar", 42L, new Object()); + Log.debugf(new NoStackTraceTestException(), "foobar", 42L, 42L); + Log.debugf("foobar", 13, 13, new Object()); + Log.debugf("foobar", 13, 13, 13); + Log.debugf(new NoStackTraceTestException(), "foobar", 13, new Object()); + Log.debugf(new NoStackTraceTestException(), "foobar", 13, 13); + Log.debugf("foobar", 13, new Object(), new Object()); + Log.debugf("foobar", new Object(), new Object(), new Object()); + Log.debugf(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.debugf("foobar", 42L, 42L, 42L); + Log.debugf("foobar", 42L, 42L, new Object()); + Log.debugf("foobar", 42L, new Object(), new Object()); + Log.debugf(new NoStackTraceTestException(), "foobar", 42L, 42L, 42L); + Log.debugf(new NoStackTraceTestException(), "foobar", 42L, 42L, new Object()); + Log.debugf(new NoStackTraceTestException(), "foobar", 42L, new Object(), new Object()); + Log.debugf(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + Log.debugf(new NoStackTraceTestException(), "foobar", 13, new Object(), new Object()); + Log.debugf(new NoStackTraceTestException(), "foobar", 13, 13, new Object()); + Log.debugf(new NoStackTraceTestException(), "foobar", 13, 13, 13); + Log.debugv("foobar", new Object[] {}); + Log.debugv("foobar", new Object()); + Log.debugv(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.debugv("foobar", new Object(), new Object()); + Log.debugv(new NoStackTraceTestException(), "foobar", new Object()); + Log.debugv("foobar", new Object(), new Object(), new Object()); + Log.debugv(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.debugv(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + Log.error("foobar"); + Log.error("foobar", new NoStackTraceTestException()); + Log.error("io.quarkus.logging.GeneratedBean", "foobar", new NoStackTraceTestException()); + Log.error("io.quarkus.logging.GeneratedBean", "foobar", new Object[] {}, new NoStackTraceTestException()); + Log.errorf("foobar", new Object[] {}); + Log.errorf("foobar", new Object()); + Log.errorf("foobar", new Object(), new Object()); + Log.errorf(new NoStackTraceTestException(), "foobar", new Object()); + Log.errorf(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.errorf(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.errorf("foobar", new Object(), new Object(), new Object()); + Log.errorf(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + Log.errorv("foobar", new Object[] {}); + Log.errorv("foobar", new Object()); + Log.errorv(new NoStackTraceTestException(), "foobar", new Object()); + Log.errorv("foobar", new Object(), new Object()); + Log.errorv(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.errorv(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.errorv("foobar", new Object(), new Object(), new Object()); + Log.errorv(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + Log.fatal("foobar"); + Log.fatal("foobar", new NoStackTraceTestException()); + Log.fatal("io.quarkus.logging.GeneratedBean", "foobar", new NoStackTraceTestException()); + Log.fatal("io.quarkus.logging.GeneratedBean", "foobar", new Object[] {}, new NoStackTraceTestException()); + Log.fatalf("foobar", new Object()); + Log.fatalf("foobar", new Object[] {}); + Log.fatalf(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.fatalf(new NoStackTraceTestException(), "foobar", new Object()); + Log.fatalf("foobar", new Object(), new Object()); + Log.fatalf("foobar", new Object(), new Object(), new Object()); + Log.fatalf(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.fatalf(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + Log.fatalv("foobar", new Object[] {}); + Log.fatalv("foobar", new Object()); + Log.fatalv(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.fatalv(new NoStackTraceTestException(), "foobar", new Object()); + Log.fatalv("foobar", new Object(), new Object()); + Log.fatalv(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.fatalv("foobar", new Object(), new Object(), new Object()); + Log.fatalv(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + Log.info("foobar"); + Log.info("foobar", new NoStackTraceTestException()); + Log.info("io.quarkus.logging.GeneratedBean", "foobar", new NoStackTraceTestException()); + Log.info("io.quarkus.logging.GeneratedBean", "foobar", new Object[] {}, new NoStackTraceTestException()); + Log.infof("foobar", new Object[] {}); + Log.infof("foobar", new Object()); + Log.infof(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.infof(new NoStackTraceTestException(), "foobar", new Object()); + Log.infof("foobar", new Object(), new Object()); + Log.infof(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.infof("foobar", new Object(), new Object(), new Object()); + Log.infof(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + Log.infov("foobar", new Object[] {}); + Log.infov("foobar", new Object()); + Log.infov(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.infov(new NoStackTraceTestException(), "foobar", new Object()); + Log.infov("foobar", new Object(), new Object()); + Log.infov("foobar", new Object(), new Object(), new Object()); + Log.infov(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.infov(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + Log.isDebugEnabled(); + Log.isEnabled(org.jboss.logging.Logger.Level.INFO); + Log.isInfoEnabled(); + Log.isTraceEnabled(); + Log.log(org.jboss.logging.Logger.Level.INFO, "foobar"); + Log.log(org.jboss.logging.Logger.Level.INFO, "foobar", new NoStackTraceTestException()); + Log.log(org.jboss.logging.Logger.Level.INFO, "io.quarkus.logging.GeneratedBean", "foobar", + new NoStackTraceTestException()); + Log.log("io.quarkus.logging.GeneratedBean", org.jboss.logging.Logger.Level.INFO, "foobar", new Object[] {}, + new NoStackTraceTestException()); + Log.logf(org.jboss.logging.Logger.Level.INFO, "foobar", new Object()); + Log.logf(org.jboss.logging.Logger.Level.INFO, "foobar", new Object[] {}); + Log.logf(org.jboss.logging.Logger.Level.INFO, "foobar", new Object(), new Object()); + Log.logf(org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.logf(org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), "foobar", new Object()); + Log.logf(org.jboss.logging.Logger.Level.INFO, "foobar", new Object(), new Object(), new Object()); + Log.logf("io.quarkus.logging.GeneratedBean", org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), + "foobar", new Object()); + Log.logf("io.quarkus.logging.GeneratedBean", org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), + "foobar", new Object[] {}); + Log.logf(org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.logf("io.quarkus.logging.GeneratedBean", org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), + "foobar", new Object(), new Object()); + Log.logf(org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), "foobar", new Object(), new Object(), + new Object()); + Log.logf("io.quarkus.logging.GeneratedBean", org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), + "foobar", new Object(), new Object(), new Object()); + Log.logv(org.jboss.logging.Logger.Level.INFO, "foobar", new Object()); + Log.logv(org.jboss.logging.Logger.Level.INFO, "foobar", new Object[] {}); + Log.logv(org.jboss.logging.Logger.Level.INFO, "foobar", new Object(), new Object()); + Log.logv(org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), "foobar", new Object()); + Log.logv(org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.logv(org.jboss.logging.Logger.Level.INFO, "foobar", new Object(), new Object(), new Object()); + Log.logv("io.quarkus.logging.GeneratedBean", org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), + "foobar", new Object[] {}); + Log.logv("io.quarkus.logging.GeneratedBean", org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), + "foobar", new Object()); + Log.logv(org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.logv(org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), "foobar", new Object(), new Object(), + new Object()); + Log.logv("io.quarkus.logging.GeneratedBean", org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), + "foobar", new Object(), new Object()); + Log.logv("io.quarkus.logging.GeneratedBean", org.jboss.logging.Logger.Level.INFO, new NoStackTraceTestException(), + "foobar", new Object(), new Object(), new Object()); + Log.trace("foobar"); + Log.trace("foobar", new NoStackTraceTestException()); + Log.trace("io.quarkus.logging.GeneratedBean", "foobar", new NoStackTraceTestException()); + Log.trace("io.quarkus.logging.GeneratedBean", "foobar", new Object[] {}, new NoStackTraceTestException()); + Log.tracef("foobar", new Object[] {}); + Log.tracef("foobar", new Object()); + Log.tracef("foobar", 13); + Log.tracef("foobar", 42L); + Log.tracef(new NoStackTraceTestException(), "foobar", 42L); + Log.tracef("foobar", new Object(), new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.tracef(new NoStackTraceTestException(), "foobar", new Object()); + Log.tracef("foobar", 13, new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", 13); + Log.tracef("foobar", 13, 13); + Log.tracef("foobar", 42L, 42L); + Log.tracef("foobar", 42L, new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", 42L, new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", 42L, 42L); + Log.tracef("foobar", 42L, new Object(), new Object()); + Log.tracef("foobar", new Object(), new Object(), new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.tracef("foobar", 13, new Object(), new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", 13, 13); + Log.tracef("foobar", 13, 13, 13); + Log.tracef("foobar", 13, 13, new Object()); + Log.tracef("foobar", 42L, 42L, 42L); + Log.tracef("foobar", 42L, 42L, new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", 13, new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", 42L, 42L, 42L); + Log.tracef(new NoStackTraceTestException(), "foobar", 42L, 42L, new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", 42L, new Object(), new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", 13, new Object(), new Object()); + Log.tracef(new NoStackTraceTestException(), "foobar", 13, 13, 13); + Log.tracef(new NoStackTraceTestException(), "foobar", 13, 13, new Object()); + Log.tracev("foobar", new Object()); + Log.tracev("foobar", new Object[] {}); + Log.tracev("foobar", new Object(), new Object()); + Log.tracev(new NoStackTraceTestException(), "foobar", new Object()); + Log.tracev(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.tracev(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.tracev("foobar", new Object(), new Object(), new Object()); + Log.tracev(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + Log.warn("foobar"); + Log.warn("foobar", new NoStackTraceTestException()); + Log.warn("io.quarkus.logging.GeneratedBean", "foobar", new NoStackTraceTestException()); + Log.warn("io.quarkus.logging.GeneratedBean", "foobar", new Object[] {}, new NoStackTraceTestException()); + Log.warnf("foobar", new Object[] {}); + Log.warnf("foobar", new Object()); + Log.warnf(new NoStackTraceTestException(), "foobar", new Object()); + Log.warnf("foobar", new Object(), new Object()); + Log.warnf(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.warnf(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.warnf("foobar", new Object(), new Object(), new Object()); + Log.warnf(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + Log.warnv("foobar", new Object[] {}); + Log.warnv("foobar", new Object()); + Log.warnv("foobar", new Object(), new Object()); + Log.warnv(new NoStackTraceTestException(), "foobar", new Object[] {}); + Log.warnv(new NoStackTraceTestException(), "foobar", new Object()); + Log.warnv(new NoStackTraceTestException(), "foobar", new Object(), new Object()); + Log.warnv("foobar", new Object(), new Object(), new Object()); + Log.warnv(new NoStackTraceTestException(), "foobar", new Object(), new Object(), new Object()); + } +} diff --git a/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingBean.java b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingBean.java new file mode 100644 index 0000000000000..d137a47414e51 --- /dev/null +++ b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingBean.java @@ -0,0 +1,41 @@ +package io.quarkus.logging; + +import javax.annotation.PostConstruct; +import javax.inject.Singleton; + +@Singleton +public class LoggingBean { + // not final to prevent constant inlining + private static String msg = "Heya!"; + + static { + Log.info(msg); + } + + @PostConstruct + public void setup() { + Log.tracef("%s created", LoggingBean.class.getSimpleName()); + } + + public void doSomething() { + if (Log.isDebugEnabled()) { + Log.debug("starting massive computation"); + } + + Log.debugf("one: %d", 42); + Log.tracef("two: %d | %d", 42, 13); + Log.debugf("three: %d | %d | %d", 42, 13, 1); + + Log.debugv("one: {0}", "foo"); + Log.infov("two: {0} | {1}", "foo", "bar"); + Log.warnv("three: {0} | {1} | {2}", "foo", "bar", "baz"); + Log.errorv("four: {0} | {1} | {2} | {3}", "foo", "bar", "baz", "quux"); + + Exception error = new NoStackTraceTestException(); + + Log.warnv(error, "{0} | {1} | {2} | {3}", "foo", "bar", "baz", "quux"); + + Log.error("Hello Error", error); + } + +} diff --git a/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingEndpoint.java b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingEndpoint.java new file mode 100644 index 0000000000000..8fe56a9d405dc --- /dev/null +++ b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingEndpoint.java @@ -0,0 +1,13 @@ +package io.quarkus.logging; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; + +@Path("/logging") +public class LoggingEndpoint { + @GET + public String hello() { + Log.info("hello"); + return "hello"; + } +} diff --git a/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingWithPanacheDevModeTest.java b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingWithPanacheDevModeTest.java new file mode 100644 index 0000000000000..c382c1c259d28 --- /dev/null +++ b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingWithPanacheDevModeTest.java @@ -0,0 +1,47 @@ +package io.quarkus.logging; + +import static io.restassured.RestAssured.when; +import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.is; + +import java.util.List; +import java.util.logging.Formatter; +import java.util.stream.Collectors; + +import org.jboss.logmanager.formatters.PatternFormatter; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusDevModeTest; + +public class LoggingWithPanacheDevModeTest { + @RegisterExtension + static final QuarkusDevModeTest TEST = new QuarkusDevModeTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class).addClasses(LoggingEndpoint.class)) + .setLogRecordPredicate(record -> "io.quarkus.logging.LoggingEndpoint".equals(record.getLoggerName())); + + @Test + public void testRepositoryIsReloaded() { + Formatter formatter = new PatternFormatter("[%p] %m"); + + { + when().get("/logging").then().body(is("hello")); + + List lines = TEST.getLogRecords().stream().map(formatter::format).collect(Collectors.toList()); + assertThat(lines).containsExactly("[INFO] hello"); + TEST.clearLogRecords(); + } + + TEST.modifySourceFile("LoggingEndpoint.java", s -> s.replace("hello", "hi")); + + { + when().get("/logging").then().body(is("hi")); + + List lines = TEST.getLogRecords().stream().map(formatter::format).collect(Collectors.toList()); + assertThat(lines).containsExactly("[INFO] hi"); + TEST.clearLogRecords(); + } + } +} diff --git a/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingWithPanacheGeneratedTest.java b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingWithPanacheGeneratedTest.java new file mode 100644 index 0000000000000..044257cf5fabc --- /dev/null +++ b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingWithPanacheGeneratedTest.java @@ -0,0 +1,24 @@ +package io.quarkus.logging; + +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusUnitTest; + +public class LoggingWithPanacheGeneratedTest { + @RegisterExtension + static final QuarkusUnitTest test = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addClasses(GeneratedBean.class, NoStackTraceTestException.class)) + .overrideConfigKey("quarkus.log.category.\"io.quarkus.logging\".min-level", "TRACE") + .overrideConfigKey("quarkus.log.category.\"io.quarkus.logging\".level", "TRACE"); + + @Test + public void test() { + new GeneratedBean().testLogging(); + // no asserts, this test only verifies that all Log methods can be successfully invoked + // (in other words, that the bytecode transformation isn't horribly broken) + } +} diff --git a/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingWithPanacheTest.java b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingWithPanacheTest.java new file mode 100644 index 0000000000000..52b8d433aa00c --- /dev/null +++ b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/LoggingWithPanacheTest.java @@ -0,0 +1,53 @@ +package io.quarkus.logging; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.logging.Formatter; +import java.util.stream.Collectors; + +import javax.inject.Inject; + +import org.jboss.logmanager.formatters.PatternFormatter; +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusUnitTest; + +public class LoggingWithPanacheTest { + @RegisterExtension + static final QuarkusUnitTest test = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addClasses(LoggingBean.class, NoStackTraceTestException.class)) + .overrideConfigKey("quarkus.log.category.\"io.quarkus.logging\".min-level", "TRACE") + .overrideConfigKey("quarkus.log.category.\"io.quarkus.logging\".level", "TRACE") + .setLogRecordPredicate(record -> "io.quarkus.logging.LoggingBean".equals(record.getLoggerName())) + .assertLogRecords(records -> { + Formatter formatter = new PatternFormatter("[%p] %m"); + List lines = records.stream().map(formatter::format).map(String::trim).collect(Collectors.toList()); + + assertThat(lines).containsExactly( + "[INFO] Heya!", + "[TRACE] LoggingBean created", + "[DEBUG] starting massive computation", + "[DEBUG] one: 42", + "[TRACE] two: 42 | 13", + "[DEBUG] three: 42 | 13 | 1", + "[DEBUG] one: foo", + "[INFO] two: foo | bar", + "[WARN] three: foo | bar | baz", + "[ERROR] four: foo | bar | baz | quux", + "[WARN] foo | bar | baz | quux: io.quarkus.logging.NoStackTraceTestException", + "[ERROR] Hello Error: io.quarkus.logging.NoStackTraceTestException"); + }); + + @Inject + LoggingBean bean; + + @Test + public void test() { + bean.doSomething(); + } +} diff --git a/integration-tests/logging-panache/src/test/java/io/quarkus/logging/NoStackTraceTestException.java b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/NoStackTraceTestException.java new file mode 100644 index 0000000000000..9a3cf887ea1e9 --- /dev/null +++ b/integration-tests/logging-panache/src/test/java/io/quarkus/logging/NoStackTraceTestException.java @@ -0,0 +1,8 @@ +package io.quarkus.logging; + +public class NoStackTraceTestException extends RuntimeException { + @Override + public synchronized Throwable fillInStackTrace() { + return this; + } +} diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml index fb683ab4e1782..c7cadd1fe67ba 100644 --- a/integration-tests/pom.xml +++ b/integration-tests/pom.xml @@ -273,6 +273,7 @@ native-config-profile logging-min-level-unset logging-min-level-set + logging-panache redis-devservices diff --git a/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusDevModeTest.java b/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusDevModeTest.java index d7c8ddabf9f88..b038d6f9b9c1c 100644 --- a/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusDevModeTest.java +++ b/test-framework/junit5-internal/src/main/java/io/quarkus/test/QuarkusDevModeTest.java @@ -159,6 +159,10 @@ public List getLogRecords() { return inMemoryLogHandler.records; } + public void clearLogRecords() { + inMemoryLogHandler.clearRecords(); + } + public QuarkusDevModeTest setBuildSystemProperty(String name, String value) { buildSystemProperties.put(name, value); return this;