You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2026/06/23 13:13:01 UTC

(maven-integration-testing) branch maven-3.10.x updated: [#12288] Backport ITs for settings.xml profile -> LRM property propagation (#428)

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

gnodet pushed a commit to branch maven-3.10.x
in repository https://gitbox.apache.org/repos/asf/maven-integration-testing.git


The following commit(s) were added to refs/heads/maven-3.10.x by this push:
     new c6d6cca22 [#12288] Backport ITs for settings.xml profile -> LRM property propagation (#428)
c6d6cca22 is described below

commit c6d6cca229001f32d9e45f542b4ebeb20870fe94
Author: Gerd Aschemann <gi...@aschemann.net>
AuthorDate: Tue Jun 23 15:12:56 2026 +0200

    [#12288] Backport ITs for settings.xml profile -> LRM property propagation (#428)
    
    * [#12288] Backport ITs for settings.xml profile -> LRM property propagation
    
    Ports the integration tests added on apache/maven master via #12297 and
    #12298 to the apache/maven-integration-testing maven-3.10.x branch.
    Covers three settings.xml-only activation channels:
    
    * testActiveByDefaultProfile          -- guards <activation><activeByDefault>
    * testActiveProfilesList              -- guards <activeProfiles><activeProfile>
                                             (already worked on 3.x, regression guard)
    * testActiveByDefaultDeactivatedViaCli -- guards that -P !profileId still
                                              deactivates an activeByDefault profile
    
    Adaptations from master:
    
    * java.io.File API instead of java.nio.file.Path
    * Verifier from org.apache.maven.shared.verifier (3.x package)
    * ResourceExtractor.simpleExtractResources for fixture extraction
    * JUnit 4-style assertions inherited from AbstractMavenIntegrationTestCase
    * Resource directory uses 3.x gh-NNNN convention
    * Version constraint super("[3.10.0-SNAPSHOT,)") so the IT only runs once
      the backport (apache/maven PR #12333) lands.
    
    Master origin commits:
    * 7725eaf25ab2715b26848fa56d3f0416862e83cb (initial 2 ITs)
    * 578523519a33a78a651c472bb07d312e01b1e521 (rename + activeByDefault fix)
    * 22f9a0ee086a464f2bfa757ecd0a32053f3d1e8d (squashed merge of #12298,
      adds testActiveByDefaultDeactivatedViaCli)
    
    Co-Authored-By: Guillaume Nodet <gn...@gmail.com>
    
    * [#12288] Address review: fix spotless format + register IT in TestSuiteOrdering
    
    Two CI/review items flagged by gnodet on #428:
    
    * Spotless formatting violations in MavenITgh12288SettingsProfileAetherPropertiesTest
      (line wrapping) and the fixture pom.xml (description block).
    * Missing TestSuiteOrdering.addTestSuite(...) registration so the
      ordering enforcer recognizes the new IT.
    
    Co-Authored-By: Guillaume Nodet <gn...@gmail.com>
    
    ---------
    
    Co-authored-by: Gerd Aschemann <as...@apache.org>
    Co-authored-by: Guillaume Nodet <gn...@gmail.com>
---
 ...gh12288SettingsProfileAetherPropertiesTest.java | 168 +++++++++++++++++++++
 .../org/apache/maven/it/TestSuiteOrdering.java     |   1 +
 .../pom.xml                                        |  32 ++++
 .../settings-active-by-default.xml                 |  33 ++++
 .../settings-active-profiles-list.xml              |  33 ++++
 5 files changed, 267 insertions(+)

diff --git a/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh12288SettingsProfileAetherPropertiesTest.java b/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh12288SettingsProfileAetherPropertiesTest.java
new file mode 100644
index 000000000..50471617f
--- /dev/null
+++ b/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh12288SettingsProfileAetherPropertiesTest.java
@@ -0,0 +1,168 @@
+/*
+ * 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.maven.it;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Comparator;
+
+import org.apache.maven.shared.verifier.Verifier;
+import org.apache.maven.shared.verifier.util.ResourceExtractor;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Integration tests proving that {@code aether.*} properties declared in the
+ * {@code <properties>} block of a {@code settings.xml} profile are honored
+ * by the resolver at local repository manager initialization, regardless of
+ * which settings.xml-only activation channel was used.
+ *
+ * <p>Two activation channels are covered:
+ * <ul>
+ *   <li>{@code <activation><activeByDefault>true</activeByDefault></activation>}
+ *       on the profile itself;</li>
+ *   <li>{@code <activeProfiles><activeProfile>...</activeProfile></activeProfiles>}
+ *       at the top of {@code settings.xml}.</li>
+ * </ul>
+ *
+ * <p>In both cases the same profile sets:
+ * <pre>
+ *   aether.enhancedLocalRepository.split       = true
+ *   aether.enhancedLocalRepository.localPrefix = it-custom-prefix
+ * </pre>
+ * and the test asserts that {@code mvn install} writes the installed pom
+ * under {@code <localRepo>/it-custom-prefix/&lt;groupId-path&gt;/...} rather
+ * than the flat or default-split layout.
+ *
+ * <p>A third test ({@code testActiveByDefaultDeactivatedViaCli}) guards
+ * that {@code -P !profileId} still deactivates an {@code <activeByDefault>}
+ * profile, so its {@code <properties>} are NOT merged into the resolver
+ * session config.
+ *
+ * <p>Backport target: requires the fix from apache/maven PR #12333 to be
+ * present in the running Maven 3.10.x build.
+ */
+public class MavenITgh12288SettingsProfileAetherPropertiesTest extends AbstractMavenIntegrationTestCase {
+
+    public MavenITgh12288SettingsProfileAetherPropertiesTest() {
+        super("[3.10.0-SNAPSHOT,)");
+    }
+
+    @Test
+    public void testActiveByDefaultProfile() throws Exception {
+        runAndAssertCustomPrefix("settings-active-by-default.xml");
+    }
+
+    @Test
+    public void testActiveProfilesList() throws Exception {
+        runAndAssertCustomPrefix("settings-active-profiles-list.xml");
+    }
+
+    @Test
+    public void testActiveByDefaultDeactivatedViaCli() throws Exception {
+        File testDir =
+                ResourceExtractor.simpleExtractResources(getClass(), "/gh-12288-settings-profile-aether-properties");
+
+        Verifier verifier = newVerifier(testDir.getAbsolutePath());
+        verifier.setAutoclean(false);
+        verifier.setLogFileName("log-deactivation.txt");
+        verifier.deleteDirectory("target");
+        verifier.deleteArtifacts("org.apache.maven.its.settings.profile.aether");
+
+        File customPrefixSubtree = new File(verifier.getLocalRepository(), "it-custom-prefix");
+        deleteRecursivelyIfExists(customPrefixSubtree);
+
+        verifier.addCliArgument("--settings");
+        verifier.addCliArgument("settings-active-by-default.xml");
+        verifier.addCliArgument("-P!aether-split-via-settings");
+        verifier.addCliArgument("install");
+        verifier.execute();
+        verifier.verifyErrorFreeLog();
+
+        String localRepo = verifier.getLocalRepository();
+        String gavRelativePath = "org/apache/maven/its/settings/profile/aether/test-artifact/1.0/test-artifact-1.0.pom";
+        File flatLayout = new File(localRepo, gavRelativePath);
+        File customPrefix = new File(localRepo, "it-custom-prefix/" + gavRelativePath);
+
+        assertTrue(
+                "Expected artifact at flat layout (profile deactivated via -P !), but not found at " + flatLayout,
+                flatLayout.exists());
+
+        assertFalse(
+                "Found artifact at custom prefix " + customPrefix + " - deactivation via -P ! was ignored.",
+                customPrefix.exists());
+    }
+
+    private void runAndAssertCustomPrefix(String settingsFile) throws Exception {
+        File testDir =
+                ResourceExtractor.simpleExtractResources(getClass(), "/gh-12288-settings-profile-aether-properties");
+
+        Verifier verifier = newVerifier(testDir.getAbsolutePath());
+        verifier.setAutoclean(false);
+        verifier.deleteDirectory("target");
+        verifier.deleteArtifacts("org.apache.maven.its.settings.profile.aether");
+
+        File customPrefixSubtree = new File(verifier.getLocalRepository(), "it-custom-prefix");
+        deleteRecursivelyIfExists(customPrefixSubtree);
+
+        verifier.addCliArgument("--settings");
+        verifier.addCliArgument(settingsFile);
+        verifier.addCliArgument("install");
+        verifier.execute();
+        verifier.verifyErrorFreeLog();
+
+        String localRepo = verifier.getLocalRepository();
+        String gavRelativePath = "org/apache/maven/its/settings/profile/aether/test-artifact/1.0/test-artifact-1.0.pom";
+
+        File expectedAtCustomPrefix = new File(localRepo, "it-custom-prefix/" + gavRelativePath);
+        File flatLayout = new File(localRepo, gavRelativePath);
+        File defaultSplitPrefix = new File(localRepo, "installed/" + gavRelativePath);
+
+        assertTrue(
+                "Expected install to use custom localPrefix 'it-custom-prefix' from "
+                        + settingsFile
+                        + ", but artifact not found at "
+                        + expectedAtCustomPrefix,
+                expectedAtCustomPrefix.exists());
+
+        assertFalse(
+                "Found artifact at flat layout "
+                        + flatLayout
+                        + " - indicates the settings.xml profile properties did not reach the resolver"
+                        + " session config in time for LRM init.",
+                flatLayout.exists());
+
+        assertFalse(
+                "Found artifact at default split-LRM prefix "
+                        + defaultSplitPrefix
+                        + " - indicates split=true was honored but localPrefix was silently dropped.",
+                defaultSplitPrefix.exists());
+    }
+
+    private static void deleteRecursivelyIfExists(File dir) throws IOException {
+        if (!dir.exists()) {
+            return;
+        }
+        Path root = dir.toPath();
+        try (java.util.stream.Stream<Path> walk = Files.walk(root)) {
+            walk.sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
+        }
+    }
+}
diff --git a/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java b/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java
index c9bd8e395..8acd0b027 100644
--- a/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java
+++ b/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java
@@ -121,6 +121,7 @@ public class TestSuiteOrdering implements ClassOrderer {
          * a fail fast technique as well.
          */
 
+        suite.addTestSuite(MavenITgh12288SettingsProfileAetherPropertiesTest.class);
         suite.addTestSuite(MavenITgh10312TerminallyDeprecatedMethodInGuiceTest.class);
         suite.addTestSuite(MavenITgh10937QuotedPipesInMavenOptsTest.class);
         suite.addTestSuite(MavenITmng8106OverlappingDirectoryRolesTest.class);
diff --git a/core-it-suite/src/test/resources/gh-12288-settings-profile-aether-properties/pom.xml b/core-it-suite/src/test/resources/gh-12288-settings-profile-aether-properties/pom.xml
new file mode 100644
index 000000000..bba79e4cc
--- /dev/null
+++ b/core-it-suite/src/test/resources/gh-12288-settings-profile-aether-properties/pom.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.its.settings.profile.aether</groupId>
+  <artifactId>test-artifact</artifactId>
+  <version>1.0</version>
+  <packaging>pom</packaging>
+
+  <name>Maven Integration Test :: Settings Profile Aether Properties</name>
+  <description>Minimal project for proving that aether.enhancedLocalRepository.*
+    properties set in an active-by-default settings.xml profile are honored
+    by the resolver at local repository manager initialization.</description>
+</project>
diff --git a/core-it-suite/src/test/resources/gh-12288-settings-profile-aether-properties/settings-active-by-default.xml b/core-it-suite/src/test/resources/gh-12288-settings-profile-aether-properties/settings-active-by-default.xml
new file mode 100644
index 000000000..455bcccde
--- /dev/null
+++ b/core-it-suite/src/test/resources/gh-12288-settings-profile-aether-properties/settings-active-by-default.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0">
+  <profiles>
+    <profile>
+      <id>aether-split-via-settings</id>
+      <activation>
+        <activeByDefault>true</activeByDefault>
+      </activation>
+      <properties>
+        <aether.enhancedLocalRepository.split>true</aether.enhancedLocalRepository.split>
+        <aether.enhancedLocalRepository.localPrefix>it-custom-prefix</aether.enhancedLocalRepository.localPrefix>
+      </properties>
+    </profile>
+  </profiles>
+</settings>
diff --git a/core-it-suite/src/test/resources/gh-12288-settings-profile-aether-properties/settings-active-profiles-list.xml b/core-it-suite/src/test/resources/gh-12288-settings-profile-aether-properties/settings-active-profiles-list.xml
new file mode 100644
index 000000000..c40eccb58
--- /dev/null
+++ b/core-it-suite/src/test/resources/gh-12288-settings-profile-aether-properties/settings-active-profiles-list.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0">
+  <activeProfiles>
+    <activeProfile>aether-split-via-settings</activeProfile>
+  </activeProfiles>
+  <profiles>
+    <profile>
+      <id>aether-split-via-settings</id>
+      <properties>
+        <aether.enhancedLocalRepository.split>true</aether.enhancedLocalRepository.split>
+        <aether.enhancedLocalRepository.localPrefix>it-custom-prefix</aether.enhancedLocalRepository.localPrefix>
+      </properties>
+    </profile>
+  </profiles>
+</settings>