You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by nf...@apache.org on 2022/06/21 17:06:49 UTC

[camel] branch CAMEL-18214/debuggers-working-together created (now 7baa7b02275)

This is an automated email from the ASF dual-hosted git repository.

nfilotto pushed a change to branch CAMEL-18214/debuggers-working-together
in repository https://gitbox.apache.org/repos/asf/camel.git


      at 7baa7b02275 CAMEL-18214: Allow Backlog Debugger and test debugger to work at the same time

This branch includes the following new commits:

     new 7baa7b02275 CAMEL-18214: Allow Backlog Debugger and test debugger to work at the same time

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[camel] 01/01: CAMEL-18214: Allow Backlog Debugger and test debugger to work at the same time

Posted by nf...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

nfilotto pushed a commit to branch CAMEL-18214/debuggers-working-together
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 7baa7b022759b4a5214148b28807437094edf998
Author: Nicolas Filotto <nf...@talend.com>
AuthorDate: Tue Jun 21 19:05:08 2022 +0200

    CAMEL-18214: Allow Backlog Debugger and test debugger to work at the same time
---
 .../camel/test/main/junit5/CamelMainExtension.java | 16 ++++++-
 .../camel/test/main/junit5/CamelMainTest.java      |  7 +++
 .../main/junit5/annotation/WithUseJMXTest.java     | 46 ++++++++++++++++++++
 .../test/main/junit5/legacy/WithUseJMXTest.java    | 50 ++++++++++++++++++++++
 .../apache/camel/impl/engine/DefaultChannel.java   | 21 ++++++---
 5 files changed, 131 insertions(+), 9 deletions(-)

diff --git a/components/camel-test/camel-test-main-junit5/src/main/java/org/apache/camel/test/main/junit5/CamelMainExtension.java b/components/camel-test/camel-test-main-junit5/src/main/java/org/apache/camel/test/main/junit5/CamelMainExtension.java
index 524aa5354fd..d5838ee81d5 100644
--- a/components/camel-test/camel-test-main-junit5/src/main/java/org/apache/camel/test/main/junit5/CamelMainExtension.java
+++ b/components/camel-test/camel-test-main-junit5/src/main/java/org/apache/camel/test/main/junit5/CamelMainExtension.java
@@ -109,7 +109,7 @@ final class CamelMainExtension
     private CamelMainContext createCamelMainContextAndStart(ExtensionContext context) {
         try {
             final CamelMainContext camelMainContext = CamelMainContext.builder(context)
-                    .useJmx(isRouteCoverageEnabled(context))
+                    .useJmx(useJmx(context) || isRouteCoverageEnabled(context))
                     .build();
             camelMainContext.start();
             return camelMainContext;
@@ -148,7 +148,7 @@ final class CamelMainExtension
             ManagedCamelContextMBean managedCamelContext = mc == null ? null : mc.getManagedCamelContext();
             if (managedCamelContext == null) {
                 LOG.warn("Cannot dump route coverage to file as JMX is not enabled. "
-                         + "Add camel-management JAR as dependency and/or override useJmx() method to enable JMX in the unit test classes.");
+                         + "Add camel-management JAR as dependency to enable JMX in the unit test classes.");
             } else {
                 routeCoverageDumper.dump(managedCamelContext, camelContext, dir, name, requiredTestClass.getName(),
                         currentTestName,
@@ -170,4 +170,16 @@ final class CamelMainExtension
                 || context.getRequiredTestInstances().getAllInstances().get(0).getClass()
                         .getAnnotation(CamelMainTest.class).dumpRouteCoverage();
     }
+
+    /**
+     * Indicates whether JMX should be used during testing according to the given extension context.
+     * <p/>
+     * In case of {@code @Nested} test classes, the value is always extracted from the annotation of the outer class.
+     *
+     * @return {@code true} if JMX should be used, {@code false} otherwise.
+     */
+    private boolean useJmx(ExtensionContext context) {
+        return context.getRequiredTestInstances().getAllInstances().get(0).getClass()
+                .getAnnotation(CamelMainTest.class).useJmx();
+    }
 }
diff --git a/components/camel-test/camel-test-main-junit5/src/main/java/org/apache/camel/test/main/junit5/CamelMainTest.java b/components/camel-test/camel-test-main-junit5/src/main/java/org/apache/camel/test/main/junit5/CamelMainTest.java
index 59554c27b70..7ad2d24d7b0 100644
--- a/components/camel-test/camel-test-main-junit5/src/main/java/org/apache/camel/test/main/junit5/CamelMainTest.java
+++ b/components/camel-test/camel-test-main-junit5/src/main/java/org/apache/camel/test/main/junit5/CamelMainTest.java
@@ -218,6 +218,13 @@ public @interface CamelMainTest {
      */
     boolean dumpRouteCoverage() default false;
 
+    /**
+     * Whether JMX should be used during testing.
+     *
+     * @return <tt>false</tt> by default.
+     */
+    boolean useJmx() default false;
+
     /**
      * Returns the timeout to use when shutting down (unit in seconds).
      * <p/>
diff --git a/components/camel-test/camel-test-main-junit5/src/test/java/org/apache/camel/test/main/junit5/annotation/WithUseJMXTest.java b/components/camel-test/camel-test-main-junit5/src/test/java/org/apache/camel/test/main/junit5/annotation/WithUseJMXTest.java
new file mode 100644
index 00000000000..4b554ee1b52
--- /dev/null
+++ b/components/camel-test/camel-test-main-junit5/src/test/java/org/apache/camel/test/main/junit5/annotation/WithUseJMXTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.camel.test.main.junit5.annotation;
+
+import org.apache.camel.BeanInject;
+import org.apache.camel.CamelContext;
+import org.apache.camel.api.management.ManagedCamelContext;
+import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
+import org.apache.camel.test.main.junit5.CamelMainTest;
+import org.apache.camel.test.main.junit5.common.MyMainClass;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+/**
+ * A test class ensuring that the JMX can be enabled.
+ */
+@CamelMainTest(mainClass = MyMainClass.class, useJmx = true)
+class WithUseJMXTest {
+
+    @BeanInject
+    CamelContext context;
+
+    @Test
+    void shouldFindTheManagedCamelContext() {
+        assertNotNull(context);
+        ManagedCamelContext mc = context.getExtension(ManagedCamelContext.class);
+        assertNotNull(mc);
+        ManagedCamelContextMBean managedCamelContext = mc.getManagedCamelContext();
+        assertNotNull(managedCamelContext);
+    }
+}
diff --git a/components/camel-test/camel-test-main-junit5/src/test/java/org/apache/camel/test/main/junit5/legacy/WithUseJMXTest.java b/components/camel-test/camel-test-main-junit5/src/test/java/org/apache/camel/test/main/junit5/legacy/WithUseJMXTest.java
new file mode 100644
index 00000000000..dd56b930d40
--- /dev/null
+++ b/components/camel-test/camel-test-main-junit5/src/test/java/org/apache/camel/test/main/junit5/legacy/WithUseJMXTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.camel.test.main.junit5.legacy;
+
+import org.apache.camel.api.management.ManagedCamelContext;
+import org.apache.camel.api.management.mbean.ManagedCamelContextMBean;
+import org.apache.camel.test.main.junit5.CamelMainTestSupport;
+import org.apache.camel.test.main.junit5.common.MyMainClass;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+/**
+ * A test class ensuring that the JMX can be enabled.
+ */
+class WithUseJMXTest extends CamelMainTestSupport {
+
+    @Override
+    protected Class<?> getMainClass() {
+        return MyMainClass.class;
+    }
+
+    @Override
+    protected boolean useJmx() {
+        return true;
+    }
+
+    @Test
+    void shouldFindTheManagedCamelContext() {
+        assertNotNull(context);
+        ManagedCamelContext mc = context.getExtension(ManagedCamelContext.class);
+        assertNotNull(mc);
+        ManagedCamelContextMBean managedCamelContext = mc.getManagedCamelContext();
+        assertNotNull(managedCamelContext);
+    }
+}
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java
index 32382c824ea..6b5503177e7 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultChannel.java
@@ -180,13 +180,14 @@ public class DefaultChannel extends CamelInternalProcessor implements Channel {
         // then wrap the output with the tracer and debugger (debugger first,
         // as we do not want regular tracer to trace the debugger)
         if (route.isDebugging()) {
-            if (camelContext.getDebugger() != null) {
+            final Debugger customDebugger = camelContext.getDebugger();
+            if (customDebugger != null) {
                 // use custom debugger
-                Debugger debugger = camelContext.getDebugger();
-                addAdvice(new DebuggerAdvice(debugger, nextProcessor, targetOutputDef));
-            } else {
+                addAdvice(new DebuggerAdvice(customDebugger, nextProcessor, targetOutputDef));
+            }
+            BacklogDebugger debugger = getBacklogDebugger(camelContext, customDebugger == null);
+            if (debugger != null) {
                 // use backlog debugger
-                BacklogDebugger debugger = getOrCreateBacklogDebugger(camelContext);
                 camelContext.addService(debugger);
                 addAdvice(new BacklogDebuggerAdvice(debugger, nextProcessor, targetOutputDef));
             }
@@ -284,7 +285,13 @@ public class DefaultChannel extends CamelInternalProcessor implements Channel {
         return tracer;
     }
 
-    private static BacklogDebugger getOrCreateBacklogDebugger(CamelContext camelContext) {
+    /**
+     * @param  camelContext   the camel context from which the {@link BacklogDebugger} should be found.
+     * @param  createIfAbsent indicates whether a {@link BacklogDebugger} should be created if it cannot be found
+     * @return                the instance of {@link BacklogDebugger} that could be found in the context or that was
+     *                        created if {@code createIfAbsent} is set to {@code true}, {@code null} otherwise.
+     */
+    private static BacklogDebugger getBacklogDebugger(CamelContext camelContext, boolean createIfAbsent) {
         BacklogDebugger debugger = null;
         if (camelContext.getRegistry() != null) {
             // lookup in registry
@@ -296,7 +303,7 @@ public class DefaultChannel extends CamelInternalProcessor implements Channel {
         if (debugger == null) {
             debugger = camelContext.hasService(BacklogDebugger.class);
         }
-        if (debugger == null) {
+        if (debugger == null && createIfAbsent) {
             // fallback to use the default debugger
             debugger = BacklogDebugger.createDebugger(camelContext);
         }