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

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 9250de96834f CAMEL-25720: camel-jbang - run the tests of 
camel-jbang-core in parallel forks (#28004)
9250de96834f is described below

commit 9250de96834f9e3b53db4ce32bd0d21f5efbdf13
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Oct 17 16:32:27 2026 +0200

    CAMEL-25720: camel-jbang - run the tests of camel-jbang-core in parallel 
forks (#28004)
    
    The tests ran one JVM per test class, one class at a time, as they shared 
the
    static home directory of the CLI and files in the working directory. They 
now
    run in 4 reused forks. Each fork has a user.home of its own under target, 
and a
    test gets a temporary home from useTestHomeDir() (or a given one from
    useHomeDir(Path)) instead of a fixed target/... directory. The tests that 
use
    the working directory (@UsesWorkingDirectory: run, export, dependency,
    transform, init, a local camel-cli.properties) or a fixed port 
(@UsesFixedPort)
    run after the others, one class at a time, in the serial-test execution.
    
    NoFixedHomeDirTest fails on a test that sets a fixed home, and AGENTS.md 
(and
    CLAUDE.md) of the module tell coding agents how the tests run.
    
    The surefire time of the module goes from 399 to 153 seconds locally, and 
to 96
    with #28005.
    
    Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 dsl/camel-jbang/camel-jbang-core/AGENTS.md         | 30 ++++++++++
 dsl/camel-jbang/camel-jbang-core/CLAUDE.md         |  1 +
 dsl/camel-jbang/camel-jbang-core/pom.xml           | 46 ++++++++++++++-
 .../core/commands/CamelCommandBaseTestSupport.java | 51 ++++++++++++++++
 .../jbang/core/commands/CamelJBangMainTest.java    |  3 +-
 .../jbang/core/commands/DependencyCopyTest.java    |  1 +
 .../jbang/core/commands/DependencyListTest.java    |  1 +
 .../jbang/core/commands/DependencyUpdateTest.java  |  1 +
 .../dsl/jbang/core/commands/EvalSimpleTest.java    | 15 +++++
 .../dsl/jbang/core/commands/ExportMainJibTest.java |  1 +
 .../jbang/core/commands/ExportMainJkubeTest.java   |  1 +
 .../camel/dsl/jbang/core/commands/ExportTest.java  |  1 +
 .../camel/dsl/jbang/core/commands/InitTest.java    |  1 +
 .../camel/dsl/jbang/core/commands/LoadTest.java    |  8 +++
 .../jbang/core/commands/NoFixedHomeDirTest.java    | 67 ++++++++++++++++++++++
 .../jbang/core/commands/TransformRouteTest.java    |  1 +
 .../dsl/jbang/core/commands/TransformTest.java     |  1 +
 .../dsl/jbang/core/commands/UserConfigHelper.java  | 10 ++--
 ...mandBaseTestSupport.java => UsesFixedPort.java} | 35 ++++++-----
 ...eTestSupport.java => UsesWorkingDirectory.java} | 36 ++++++------
 .../commands/action/ActionCommandTestSupport.java  |  2 +-
 .../action/CamelStartupRecorderActionTest.java     |  3 +-
 .../core/commands/action/LoggerActionTest.java     |  2 +-
 .../commands/action/RouteActionJavaSourceTest.java |  2 +
 .../commands/config/BaseConfigTestSupport.java     | 12 +++-
 .../commands/infra/InfraCommandTestSupport.java    |  2 +-
 .../core/commands/infra/InfraRestartTest.java      |  2 +
 .../dsl/jbang/core/commands/infra/InfraTest.java   |  2 +
 .../jbang/core/commands/plugin/PluginAddTest.java  |  3 +-
 .../core/commands/plugin/PluginDeleteTest.java     |  3 +-
 .../jbang/core/commands/plugin/PluginGetTest.java  |  3 +-
 .../jbang/core/commands/plugin/PluginListTest.java |  3 +-
 .../process/ProcessCommandTestSupport.java         |  2 +-
 .../core/commands/version/VersionGetTest.java      | 12 +++-
 .../dsl/jbang/core/common/PluginHelperTest.java    |  9 +++
 35 files changed, 311 insertions(+), 62 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/AGENTS.md 
b/dsl/camel-jbang/camel-jbang-core/AGENTS.md
new file mode 100644
index 000000000000..9fc02a7f5f67
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-core/AGENTS.md
@@ -0,0 +1,30 @@
+# camel-jbang-core: notes for coding agents
+
+The commands of the Camel CLI (`camel run`, `export`, `get`, `cmd`, `catalog`, 
`ask`, ...). The rules of the whole
+repository are in the root `AGENTS.md`; this file adds what is particular to 
this module.
+
+## Tests
+
+The tests run in 4 forks at the same time, and each fork runs many test 
classes one after the other (the forks are
+reused). So a test must not depend on a fresh JVM, nor share anything with the 
tests of the other forks:
+
+- The home of the CLI (`CommandLineHelper.getHomeDir()`: the `.camel` 
directory, the user configuration and the
+  plugins) is a static field. A test that needs a home calls 
`useTestHomeDir()` of `CamelCommandBaseTestSupport`,
+  which gives it an empty temporary home and restores the previous one after 
the test. Never use a fixed directory
+  such as `target` or `target/test-xxx`, as the other forks use it at the same 
time. A test that needs another home,
+  such as the home of a Camel that runs outside this JVM, calls 
`useHomeDir(Path)`, which also restores the previous
+  home after the test.
+- Each fork has a `user.home` of its own under `target` (see `pom.xml`), so 
the tests do not see the `~/.camel` of
+  the developer. From an IDE, `user.home` is the real home: `UserConfigHelper` 
refuses to write the user
+  configuration there.
+- The forks share the working directory (the module directory). A test whose 
command uses it is annotated
+  `@UsesWorkingDirectory`: `camel run` deletes `.camel-jbang`, `export`, 
`dependency` and `transform` write in it,
+  `camel init` writes a file given without a directory there, and a local 
`camel-cli.properties` is read from it. A
+  test that listens on a fixed port, such as `camel infra run` with the 
default port of a service, is annotated
+  `@UsesFixedPort`. These tests run after the others, one class at a time, in 
a fork of their own (the `serial-test`
+  execution). Prefer a temporary directory (`--dir`) and port 0, so a test 
does not need them.
+- Restore what else a test changes in the JVM: system properties 
(`@SetSystemProperty` of junit-pioneer, or set and
+  clear them), static fields, and stop the servers, threads and CamelContexts 
that it starts.
+- A test that only fails now and then usually shares something with another 
test: run the module a few times with
+  `-Dcamel.surefire.forkCount=8` to find out. `-Dtest=SomeTest` runs one 
class, whichever execution it belongs to.
+- `NoFixedHomeDirTest` fails on a test that sets a fixed home; its message 
says what to do.
diff --git a/dsl/camel-jbang/camel-jbang-core/CLAUDE.md 
b/dsl/camel-jbang/camel-jbang-core/CLAUDE.md
new file mode 120000
index 000000000000..47dc3e3d863c
--- /dev/null
+++ b/dsl/camel-jbang/camel-jbang-core/CLAUDE.md
@@ -0,0 +1 @@
+AGENTS.md
\ No newline at end of file
diff --git a/dsl/camel-jbang/camel-jbang-core/pom.xml 
b/dsl/camel-jbang/camel-jbang-core/pom.xml
index 1ac50f7ee976..dc0753e88fa5 100644
--- a/dsl/camel-jbang/camel-jbang-core/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-core/pom.xml
@@ -40,7 +40,11 @@
         <label>jbang</label>
         <supportLevel>Stable</supportLevel>
         <camel-prepare-component>false</camel-prepare-component>
-        <camel.surefire.reuseForks>false</camel.surefire.reuseForks>
+        <!-- the tests run in parallel forks that are reused, each with a home 
of its own (see the surefire
+             configuration). No concurrency inside a fork: the CLI keeps the 
home directory in a static field -->
+        <camel.surefire.forkCount>4</camel.surefire.forkCount>
+        <camel.surefire.reuseForks>true</camel.surefire.reuseForks>
+        <camel.surefire.parallel>false</camel.surefire.parallel>
     </properties>
 
     <dependencies>
@@ -343,6 +347,46 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <systemPropertyVariables>
+                        <!-- a home of its own per fork (~/.camel, the user 
configuration and plugins), out of the
+                             developer's and away from the other forks. The 
local Maven repository stays the build's,
+                             so what the tests resolve is not downloaded again 
-->
+                        
<user.home>${project.build.directory}/test-home-${surefire.forkNumber}</user.home>
+                        
<maven.repo.local>${settings.localRepository}</maven.repo.local>
+                        <!-- the home of the developer, for a test that talks 
to a Camel launched through JBang -->
+                        
<camel.test.user.home>${user.home}</camel.test.user.home>
+                    </systemPropertyVariables>
+                </configuration>
+                <executions>
+                    <execution>
+                        <!-- the serial tests run after, one class at a time 
-->
+                        <id>default-test</id>
+                        <configuration>
+                            <excludedGroups>serial</excludedGroups>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <!-- the tests of what the forks share: the working 
directory (the .camel-jbang directory of
+                             camel run, export and others, a local 
camel-cli.properties) or a fixed port. These tests
+                             (@UsesWorkingDirectory, @UsesFixedPort) run in 
one fork -->
+                        <id>serial-test</id>
+                        <goals>
+                            <goal>test</goal>
+                        </goals>
+                        <configuration>
+                            <forkCount>1</forkCount>
+                            <groups>serial</groups>
+                            <systemPropertyVariables>
+                                
<user.home>${project.build.directory}/test-home-serial</user.home>
+                            </systemPropertyVariables>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
         </plugins>
     </build>
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelCommandBaseTestSupport.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelCommandBaseTestSupport.java
index abb5ba65b746..1bb03b9ab398 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelCommandBaseTestSupport.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelCommandBaseTestSupport.java
@@ -17,20 +17,71 @@
 
 package org.apache.camel.dsl.jbang.core.commands;
 
+import java.io.IOException;
+import java.nio.file.Files;
 import java.nio.file.Path;
 
+import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.apache.camel.dsl.jbang.core.common.StringPrinter;
+import org.apache.camel.util.FileUtil;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 
 public class CamelCommandBaseTestSupport {
 
     protected StringPrinter printer;
 
+    private Path previousHome;
+    private Path testHome;
+
     @BeforeEach
     public void setup() throws Exception {
         printer = new StringPrinter();
     }
 
+    /**
+     * Gives the test a home directory of its own: an empty directory for the 
{@code .camel} directory, the user
+     * configuration and the plugins of the CLI. The tests run in parallel 
forks, so a fixed directory would be shared
+     * with the tests of the other forks. The previous home is used again 
after the test.
+     *
+     * @return the home directory
+     */
+    protected Path useTestHomeDir() throws IOException {
+        if (testHome != null) {
+            // called again: the home of the earlier call is not used anymore
+            FileUtil.removeDir(testHome.toFile());
+        }
+        testHome = Files.createTempDirectory("camel-cli-test-home");
+        useHomeDir(testHome);
+        return testHome;
+    }
+
+    /**
+     * Uses the given directory as the home of the CLI in the test, and the 
previous home again after the test. A test
+     * that talks to a Camel which runs outside this JVM uses the home of that 
Camel; any other test uses
+     * {@link #useTestHomeDir()}.
+     *
+     * @param home the home directory
+     */
+    protected void useHomeDir(Path home) {
+        if (previousHome == null) {
+            previousHome = CommandLineHelper.getHomeDir();
+        }
+        CommandLineHelper.useHomeDir(home.toString());
+    }
+
+    @AfterEach
+    public void restoreHomeDir() {
+        if (previousHome != null) {
+            CommandLineHelper.useHomeDir(previousHome.toString());
+            previousHome = null;
+        }
+        if (testHome != null) {
+            FileUtil.removeDir(testHome.toFile());
+            testHome = null;
+        }
+    }
+
     public static String quarkusExtRegistry() {
         return "--quarkus-ext-registry="
                + 
Path.of("target/test-classes/registry.quarkus.io").toAbsolutePath().normalize().toUri().toString();
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMainTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMainTest.java
index 23b9e6dca1df..f017fadbbd10 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMainTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelJBangMainTest.java
@@ -19,7 +19,6 @@ package org.apache.camel.dsl.jbang.core.commands;
 import java.lang.reflect.Field;
 import java.util.List;
 
-import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.apache.camel.dsl.jbang.core.common.PluginHelper;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -36,7 +35,7 @@ class CamelJBangMainTest extends CamelCommandBaseTestSupport {
     public void setup() throws Exception {
         super.setup();
 
-        CommandLineHelper.useHomeDir("target");
+        useTestHomeDir();
         PluginHelper.createPluginConfig();
 
         main = new CamelJBangMain().withPrinter(printer);
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyCopyTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyCopyTest.java
index d50387268eb9..34cbfa12a448 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyCopyTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyCopyTest.java
@@ -43,6 +43,7 @@ import static org.mockito.Mockito.spy;
  * camel dependency copy: the JARs of the dependencies of the integration, 
copied to a directory. The dependencies are
  * not downloaded: each resolves to a JAR of its own.
  */
+@UsesWorkingDirectory
 class DependencyCopyTest extends CamelCommandBaseTestSupport {
 
     @TempDir
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyListTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyListTest.java
index 3aa581256e6a..0b66e4f9b466 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyListTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyListTest.java
@@ -36,6 +36,7 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 import picocli.CommandLine;
 
+@UsesWorkingDirectory
 class DependencyListTest extends CamelCommandBaseTestSupport {
 
     private File workingDir;
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyUpdateTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyUpdateTest.java
index 9a0328045ffd..9fd159172a1c 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyUpdateTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DependencyUpdateTest.java
@@ -38,6 +38,7 @@ import picocli.CommandLine;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+@UsesWorkingDirectory
 class DependencyUpdateTest extends CamelCommandBaseTestSupport {
 
     private File workingDir;
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/EvalSimpleTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/EvalSimpleTest.java
index 415e261d8fb1..83388e420d19 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/EvalSimpleTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/EvalSimpleTest.java
@@ -16,15 +16,30 @@
  */
 package org.apache.camel.dsl.jbang.core.commands;
 
+import java.nio.file.Path;
+
 import org.apache.camel.dsl.jbang.core.commands.action.EvalExpressionCommand;
+import org.apache.camel.util.HomeHelper;
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.condition.DisabledIfSystemProperty;
 import picocli.CommandLine;
 
+@UsesWorkingDirectory
 @DisabledIfSystemProperty(named = "ci.env.name", matches = ".*", 
disabledReason = "Runs only local")
 class EvalSimpleTest extends CamelCommandBaseTestSupport {
 
+    @BeforeEach
+    @Override
+    public void setup() throws Exception {
+        super.setup();
+        // not a home of its own (useTestHomeDir): the Camel this test starts 
is the one installed with JBang, which
+        // uses the home of the user, so the test must look there too, or it 
waits for an answer and leaves that Camel
+        // running
+        useHomeDir(Path.of(System.getProperty("camel.test.user.home", 
HomeHelper.resolveHomeDir())));
+    }
+
     @Test
     public void shouldEvalSimple() throws Exception {
         String[] args = new String[] { "--isolated=true", 
"--template=${length()}", "--body=hello_world" };
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJibTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJibTest.java
index f930c6a6a91a..40a465c2e636 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJibTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJibTest.java
@@ -37,6 +37,7 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 import picocli.CommandLine;
 
+@UsesWorkingDirectory
 class ExportMainJibTest {
 
     private File workingDir;
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJkubeTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJkubeTest.java
index aaed6f734ae1..49f77ed3aaaa 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJkubeTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportMainJkubeTest.java
@@ -37,6 +37,7 @@ import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
 import picocli.CommandLine;
 
+@UsesWorkingDirectory
 class ExportMainJkubeTest {
 
     private File workingDir;
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
index 9e9eba93fea4..b956f3a79269 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/ExportTest.java
@@ -54,6 +54,7 @@ import picocli.CommandLine;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+@UsesWorkingDirectory
 class ExportTest {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(ExportTest.class);
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/InitTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/InitTest.java
index 606442bf933b..f812cf72a0b1 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/InitTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/InitTest.java
@@ -36,6 +36,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+@UsesWorkingDirectory
 class InitTest {
 
     private Path workingDir;
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/LoadTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/LoadTest.java
index fc55e8db0b80..0ef7e8ced20f 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/LoadTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/LoadTest.java
@@ -22,7 +22,9 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 
 import org.apache.camel.dsl.jbang.core.commands.action.CamelLoadAction;
+import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.apache.camel.dsl.jbang.core.common.PathUtils;
+import org.apache.camel.util.HomeHelper;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -33,18 +35,24 @@ import static 
org.apache.camel.dsl.jbang.core.common.RuntimeUtil.getPid;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.awaitility.Awaitility.await;
 
+@UsesWorkingDirectory
 class LoadTest {
 
     private Path workingDir;
+    private Path previousHome;
 
     @BeforeEach
     public void setup() throws IOException {
         Path base = Paths.get("target");
         workingDir = Files.createTempDirectory(base, "camel-load");
+        // the routes run in this JVM, and their CLI connector reads the 
actions in the user home
+        previousHome = CommandLineHelper.getHomeDir();
+        CommandLineHelper.useHomeDir(HomeHelper.resolveHomeDir());
     }
 
     @AfterEach
     public void end() throws IOException {
+        CommandLineHelper.useHomeDir(previousHome.toString());
         // force removing, since deleteOnExit is not removing.
         PathUtils.deleteDirectory(workingDir);
     }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/NoFixedHomeDirTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/NoFixedHomeDirTest.java
new file mode 100644
index 000000000000..bea0df6ad586
--- /dev/null
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/NoFixedHomeDirTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.dsl.jbang.core.commands;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * The tests run in parallel forks (AGENTS.md of this module), so a home of 
the CLI given as a fixed directory, such as
+ * one under target, is used by the tests of the other forks at the same time. 
A test that sets the home with a string
+ * or a path of literals fails here: it calls useTestHomeDir() of 
CamelCommandBaseTestSupport instead, or sets a
+ * temporary directory as the home and restores the previous home after the 
test.
+ */
+class NoFixedHomeDirTest {
+
+    private static final Path SOURCES = Path.of("src/test/java");
+    private static final Pattern FIXED_HOME = 
Pattern.compile("useHomeDir\\(\\s*(\"|(Paths\\.get|Path\\.of)\\(\\s*\")");
+
+    @Test
+    void noTestUsesAFixedHome() throws IOException {
+        List<String> problems = new ArrayList<>();
+        for (Path file : sources()) {
+            List<String> lines = Files.readAllLines(file);
+            for (int i = 0; i < lines.size(); i++) {
+                if (FIXED_HOME.matcher(lines.get(i)).find()) {
+                    problems.add(SOURCES.relativize(file) + ":" + (i + 1) + ": 
" + lines.get(i).strip());
+                }
+            }
+        }
+        assertThat(problems)
+                .as("A fixed home is shared with the tests of the other forks: 
call useTestHomeDir() of"
+                    + " CamelCommandBaseTestSupport, or set a @TempDir as the 
home and restore the previous home in"
+                    + " @AfterEach")
+                .isEmpty();
+    }
+
+    private static List<Path> sources() throws IOException {
+        try (Stream<Path> files = Files.walk(SOURCES)) {
+            return files.filter(p -> p.toString().endsWith(".java"))
+                    .filter(p -> 
!p.getFileName().toString().equals(NoFixedHomeDirTest.class.getSimpleName() + 
".java"))
+                    .sorted().toList();
+        }
+    }
+}
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformRouteTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformRouteTest.java
index e9023e187070..31f124758f43 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformRouteTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformRouteTest.java
@@ -36,6 +36,7 @@ import static org.assertj.core.api.Assertions.catchThrowable;
 /**
  * camel transform route: a route in another DSL, printed or written to a file 
or directory.
  */
+@UsesWorkingDirectory
 class TransformRouteTest extends CamelCommandBaseTestSupport {
 
     private static final String YAML = """
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformTest.java
index 58535bfc21d0..1ff6ad4d9a09 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/TransformTest.java
@@ -32,6 +32,7 @@ import picocli.CommandLine;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+@UsesWorkingDirectory
 class TransformTest {
 
     private Path workingDir;
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/UserConfigHelper.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/UserConfigHelper.java
index 56f0ee8971ae..925fb56e4258 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/UserConfigHelper.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/UserConfigHelper.java
@@ -24,6 +24,7 @@ import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
 
 import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
+import org.apache.camel.util.HomeHelper;
 
 public final class UserConfigHelper {
 
@@ -39,11 +40,12 @@ public final class UserConfigHelper {
         Path userConfigDir;
         String configFileName = CommandLineHelper.USER_CONFIG;
         if (!local) {
-            CommandLineHelper.useHomeDir("target");
-            userConfigDir = Paths.get("target");
-            if (!userConfigDir.toFile().exists()) {
-                userConfigDir.toFile().mkdirs();
+            // the home of the test 
(CamelCommandBaseTestSupport.useTestHomeDir), never the home of the user
+            userConfigDir = CommandLineHelper.getHomeDir();
+            if (userConfigDir.equals(Paths.get(HomeHelper.resolveHomeDir()))) {
+                throw new IllegalStateException("Use a test home directory 
before writing the user configuration");
             }
+            Files.createDirectories(userConfigDir);
         } else {
             userConfigDir = Paths.get(".");
             configFileName = CommandLineHelper.LOCAL_USER_CONFIG;
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelCommandBaseTestSupport.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/UsesFixedPort.java
similarity index 55%
copy from 
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelCommandBaseTestSupport.java
copy to 
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/UsesFixedPort.java
index abb5ba65b746..f312a176b172 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelCommandBaseTestSupport.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/UsesFixedPort.java
@@ -14,26 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.camel.dsl.jbang.core.commands;
 
-import java.nio.file.Path;
-
-import org.apache.camel.dsl.jbang.core.common.StringPrinter;
-import org.junit.jupiter.api.BeforeEach;
-
-public class CamelCommandBaseTestSupport {
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
-    protected StringPrinter printer;
-
-    @BeforeEach
-    public void setup() throws Exception {
-        printer = new StringPrinter();
-    }
-
-    public static String quarkusExtRegistry() {
-        return "--quarkus-ext-registry="
-               + 
Path.of("target/test-classes/registry.quarkus.io").toAbsolutePath().normalize().toUri().toString();
-    }
+import org.junit.jupiter.api.Tag;
 
+/**
+ * A test that listens on a fixed port, such as camel infra run with the 
default port of the service.
+ * <p/>
+ * The test forks run in parallel, and two tests on the same port fail to 
bind, so these tests run after them in a fork
+ * of their own, one class at a time (the {@code serial-test} execution in 
pom.xml).
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+@Tag("serial")
+public @interface UsesFixedPort {
 }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelCommandBaseTestSupport.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/UsesWorkingDirectory.java
similarity index 52%
copy from 
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelCommandBaseTestSupport.java
copy to 
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/UsesWorkingDirectory.java
index abb5ba65b746..474219263da0 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/CamelCommandBaseTestSupport.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/UsesWorkingDirectory.java
@@ -14,26 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.camel.dsl.jbang.core.commands;
 
-import java.nio.file.Path;
-
-import org.apache.camel.dsl.jbang.core.common.StringPrinter;
-import org.junit.jupiter.api.BeforeEach;
-
-public class CamelCommandBaseTestSupport {
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
-    protected StringPrinter printer;
-
-    @BeforeEach
-    public void setup() throws Exception {
-        printer = new StringPrinter();
-    }
-
-    public static String quarkusExtRegistry() {
-        return "--quarkus-ext-registry="
-               + 
Path.of("target/test-classes/registry.quarkus.io").toAbsolutePath().normalize().toUri().toString();
-    }
+import org.junit.jupiter.api.Tag;
 
+/**
+ * A test that uses the working directory of the build: the {@code 
.camel-jbang} directory that camel run, export,
+ * dependency, transform and others create and delete, or a local {@code 
camel-cli.properties}.
+ * <p/>
+ * The test forks run in parallel and share the working directory, so these 
tests run after them in a fork of their own,
+ * one class at a time (the {@code serial-test} execution in pom.xml).
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+@Tag("serial")
+public @interface UsesWorkingDirectory {
 }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/ActionCommandTestSupport.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/ActionCommandTestSupport.java
index 6a3540e83ca7..f679fe5d798f 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/ActionCommandTestSupport.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/ActionCommandTestSupport.java
@@ -64,7 +64,7 @@ abstract class ActionCommandTestSupport extends 
CamelCommandBaseTestSupport {
     @Override
     public void setup() throws Exception {
         super.setup();
-        CommandLineHelper.useHomeDir("target/test-action");
+        useTestHomeDir();
         Files.createDirectories(CommandLineHelper.getCamelDir());
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderActionTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderActionTest.java
index 64fbede3b3d8..75151e6e508a 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderActionTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStartupRecorderActionTest.java
@@ -23,7 +23,6 @@ import 
org.apache.camel.dsl.jbang.core.commands.CamelCommandBaseTestSupport;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
 import org.apache.camel.dsl.jbang.core.common.CliException;
 import org.apache.camel.dsl.jbang.core.common.CliExitCode;
-import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.apache.camel.dsl.jbang.core.common.ProcessFinder.CamelProcess;
 import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
@@ -41,7 +40,7 @@ class CamelStartupRecorderActionTest extends 
CamelCommandBaseTestSupport {
     @Override
     public void setup() throws Exception {
         super.setup();
-        CommandLineHelper.useHomeDir("target/startup-recorder-test");
+        useTestHomeDir();
     }
 
     @Test
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerActionTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerActionTest.java
index 8fedd383260c..56828e745327 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerActionTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/LoggerActionTest.java
@@ -51,7 +51,7 @@ class LoggerActionTest extends CamelCommandBaseTestSupport {
     @Override
     public void setup() throws Exception {
         super.setup();
-        CommandLineHelper.useHomeDir("target/test-logger");
+        useTestHomeDir();
         Files.createDirectories(CommandLineHelper.getCamelDir());
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/RouteActionJavaSourceTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/RouteActionJavaSourceTest.java
index fc7d6eb95deb..24de5f0b77b5 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/RouteActionJavaSourceTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/action/RouteActionJavaSourceTest.java
@@ -22,6 +22,7 @@ import java.util.List;
 
 import org.apache.camel.diagram.RouteDiagramLayoutEngine.RouteInfo;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.commands.UsesWorkingDirectory;
 import org.apache.camel.dsl.jbang.core.common.CliException;
 import org.apache.camel.dsl.jbang.core.common.CliExitCode;
 import org.apache.camel.dsl.jbang.core.common.StringPrinter;
@@ -39,6 +40,7 @@ import static 
org.assertj.core.api.Assertions.assertThatThrownBy;
  * routes are dumped from a CamelContext that is never started, so nothing is 
compiled and a source that does not
  * compile (here: a processor class that does not exist) still gets its 
diagram.
  */
+@UsesWorkingDirectory
 class RouteActionJavaSourceTest {
 
     private static final String ORDERS = """
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/config/BaseConfigTestSupport.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/config/BaseConfigTestSupport.java
index 384aa8e2211e..e546ada800d1 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/config/BaseConfigTestSupport.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/config/BaseConfigTestSupport.java
@@ -21,16 +21,22 @@ import java.nio.file.Files;
 import java.nio.file.Paths;
 
 import org.apache.camel.dsl.jbang.core.commands.CamelCommandBaseTestSupport;
+import org.apache.camel.dsl.jbang.core.commands.UsesWorkingDirectory;
 import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 
+@UsesWorkingDirectory
 public class BaseConfigTestSupport extends CamelCommandBaseTestSupport {
 
+    @BeforeEach
+    void useTestHome() throws IOException {
+        // the global config file of UserConfigHelper.createUserConfig goes in 
the home of the test, removed after it
+        useTestHomeDir();
+    }
+
     @AfterEach
     void removeConfigFiles() throws IOException {
         Files.deleteIfExists(Paths.get(CommandLineHelper.LOCAL_USER_CONFIG));
-        // remove the global config file written under target by 
UserConfigHelper.createUserConfig, so it does not
-        // leak into later tests in the same JVM. Target the build directory 
explicitly to never touch the real home.
-        Files.deleteIfExists(Paths.get("target", 
CommandLineHelper.USER_CONFIG));
     }
 }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraCommandTestSupport.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraCommandTestSupport.java
index 38e9ab36b995..34972e5583f6 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraCommandTestSupport.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraCommandTestSupport.java
@@ -38,7 +38,7 @@ abstract class InfraCommandTestSupport extends 
CamelCommandBaseTestSupport {
     @Override
     public void setup() throws Exception {
         super.setup();
-        CommandLineHelper.useHomeDir("target/test-infra-cmd");
+        useTestHomeDir();
         Files.createDirectories(CommandLineHelper.getCamelDir());
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraRestartTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraRestartTest.java
index fbd714cc2347..7af2c0d641f4 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraRestartTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraRestartTest.java
@@ -22,11 +22,13 @@ import java.util.List;
 
 import org.apache.camel.dsl.jbang.core.commands.CamelCommandBaseTestSupport;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.commands.UsesFixedPort;
 import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.assertj.core.api.Assertions;
 import org.awaitility.Awaitility;
 import org.junit.jupiter.api.Test;
 
+@UsesFixedPort
 public class InfraRestartTest extends CamelCommandBaseTestSupport {
 
     /**
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraTest.java
index 794fa260c8b4..20bd47bb7d14 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/infra/InfraTest.java
@@ -21,12 +21,14 @@ import java.util.stream.Collectors;
 
 import org.apache.camel.dsl.jbang.core.commands.CamelCommandBaseTestSupport;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
+import org.apache.camel.dsl.jbang.core.commands.UsesFixedPort;
 import org.apache.camel.dsl.jbang.core.model.InfraBaseDTO;
 import org.apache.camel.util.json.Jsoner;
 import org.assertj.core.api.Assertions;
 import org.awaitility.Awaitility;
 import org.junit.jupiter.api.Test;
 
+@UsesFixedPort
 public class InfraTest extends CamelCommandBaseTestSupport {
 
     /**
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginAddTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginAddTest.java
index a7c43a2d7c76..65a3d6a5dbc7 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginAddTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginAddTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.dsl.jbang.core.commands.plugin;
 
 import org.apache.camel.dsl.jbang.core.commands.CamelCommandBaseTestSupport;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
-import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.apache.camel.dsl.jbang.core.common.PluginHelper;
 import org.apache.camel.dsl.jbang.core.common.PluginType;
 import org.apache.camel.util.json.JsonObject;
@@ -32,7 +31,7 @@ class PluginAddTest extends CamelCommandBaseTestSupport {
     public void setup() throws Exception {
         super.setup();
 
-        CommandLineHelper.useHomeDir("target");
+        useTestHomeDir();
         PluginHelper.createPluginConfig();
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginDeleteTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginDeleteTest.java
index 9cdda931eb53..706e4c336cfa 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginDeleteTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginDeleteTest.java
@@ -18,7 +18,6 @@ package org.apache.camel.dsl.jbang.core.commands.plugin;
 
 import org.apache.camel.dsl.jbang.core.commands.CamelCommandBaseTestSupport;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
-import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.apache.camel.dsl.jbang.core.common.PluginHelper;
 import org.apache.camel.dsl.jbang.core.common.PluginType;
 import org.junit.jupiter.api.Assertions;
@@ -31,7 +30,7 @@ class PluginDeleteTest extends CamelCommandBaseTestSupport {
     public void setup() throws Exception {
         super.setup();
 
-        CommandLineHelper.useHomeDir("target");
+        useTestHomeDir();
         PluginHelper.createPluginConfig();
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginGetTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginGetTest.java
index d3e6f3a3de4d..39588257ab4d 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginGetTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginGetTest.java
@@ -20,7 +20,6 @@ import java.util.List;
 
 import org.apache.camel.dsl.jbang.core.commands.CamelCommandBaseTestSupport;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
-import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.apache.camel.dsl.jbang.core.common.PluginHelper;
 import org.apache.camel.dsl.jbang.core.common.PluginType;
 import org.apache.camel.util.json.JsonObject;
@@ -34,7 +33,7 @@ class PluginGetTest extends CamelCommandBaseTestSupport {
     public void setup() throws Exception {
         super.setup();
 
-        CommandLineHelper.useHomeDir("target");
+        useTestHomeDir();
         PluginHelper.createPluginConfig();
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginListTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginListTest.java
index 88c5d342a0cf..fe992f5c0471 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginListTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/plugin/PluginListTest.java
@@ -20,7 +20,6 @@ import java.util.List;
 
 import org.apache.camel.dsl.jbang.core.commands.CamelCommandBaseTestSupport;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
-import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.apache.camel.dsl.jbang.core.common.PluginHelper;
 import org.apache.camel.dsl.jbang.core.common.PluginType;
 import org.junit.jupiter.api.Assertions;
@@ -33,7 +32,7 @@ class PluginListTest extends CamelCommandBaseTestSupport {
     public void setup() throws Exception {
         super.setup();
 
-        CommandLineHelper.useHomeDir("target");
+        useTestHomeDir();
         PluginHelper.createPluginConfig();
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/process/ProcessCommandTestSupport.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/process/ProcessCommandTestSupport.java
index 0eca566564b3..21f7cb92988d 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/process/ProcessCommandTestSupport.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/process/ProcessCommandTestSupport.java
@@ -48,7 +48,7 @@ abstract class ProcessCommandTestSupport extends 
CamelCommandBaseTestSupport {
     @Override
     public void setup() throws Exception {
         super.setup();
-        CommandLineHelper.useHomeDir("target/test-process");
+        useTestHomeDir();
         Files.createDirectories(CommandLineHelper.getCamelDir());
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/version/VersionGetTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/version/VersionGetTest.java
index f916ede1081f..7e32eb22b145 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/version/VersionGetTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/version/VersionGetTest.java
@@ -19,18 +19,26 @@ package org.apache.camel.dsl.jbang.core.commands.version;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
 import java.util.List;
 
 import org.apache.camel.dsl.jbang.core.commands.CamelCommandBaseTestSupport;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
 import org.apache.camel.dsl.jbang.core.commands.UserConfigHelper;
+import org.apache.camel.dsl.jbang.core.common.CommandLineHelper;
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 class VersionGetTest extends CamelCommandBaseTestSupport {
 
+    @BeforeEach
+    @Override
+    public void setup() throws Exception {
+        super.setup();
+        useTestHomeDir();
+    }
+
     @Test
     public void shouldPrintVersions() throws Exception {
         UserConfigHelper.createUserConfig("");
@@ -81,7 +89,7 @@ class VersionGetTest extends CamelCommandBaseTestSupport {
     }
 
     private void createJBangVersionFile(String version) throws IOException {
-        Path jBangDir = Paths.get("target", ".jbang", "cache");
+        Path jBangDir = CommandLineHelper.getHomeDir().resolve(".jbang/cache");
         if (!jBangDir.toFile().exists()) {
             jBangDir.toFile().mkdirs();
         }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/common/PluginHelperTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/common/PluginHelperTest.java
index c1fe440e8b81..0f1128d59859 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/common/PluginHelperTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/common/PluginHelperTest.java
@@ -23,6 +23,7 @@ import java.util.Map;
 
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
 import org.apache.camel.util.json.JsonObject;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
@@ -41,11 +42,19 @@ public class PluginHelperTest {
     @TempDir
     Path tempDir;
 
+    private Path previousHome;
+
     @BeforeEach
     public void setup() {
+        previousHome = CommandLineHelper.getHomeDir();
         CommandLineHelper.useHomeDir(tempDir.toString());
     }
 
+    @AfterEach
+    public void restoreHome() {
+        CommandLineHelper.useHomeDir(previousHome.toString());
+    }
+
     @Test
     public void testEmbeddedPluginDetectionDoesNotThrowException() {
         assertDoesNotThrow(PluginHelper::hasEmbeddedPlugins);

Reply via email to