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 } 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. + * + *

Two activation channels are covered: + *

+ * + *

In both cases the same profile sets: + *

+ *   aether.enhancedLocalRepository.split       = true
+ *   aether.enhancedLocalRepository.localPrefix = it-custom-prefix
+ * 
+ * and the test asserts that {@code mvn install} writes the installed pom + * under {@code /it-custom-prefix/<groupId-path>/...} rather + * than the flat or default-split layout. + * + *

A third test ({@code testActiveByDefaultDeactivatedViaCli}) guards + * that {@code -P !profileId} still deactivates an {@code } + * profile, so its {@code } are NOT merged into the resolver + * session config. + * + *

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 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 TestSuiteOrdering() { * 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 @@ + + + + 4.0.0 + + org.apache.maven.its.settings.profile.aether + test-artifact + 1.0 + pom + + Maven Integration Test :: Settings Profile Aether Properties + 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. + 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 @@ + + + + + + aether-split-via-settings + + true + + + true + it-custom-prefix + + + + 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 @@ + + + + + aether-split-via-settings + + + + aether-split-via-settings + + true + it-custom-prefix + + + +