From e6222638ab83e94f94c1cef857813d4c706e6f22 Mon Sep 17 00:00:00 2001 From: Martin Desruisseaux Date: Mon, 2 Sep 2024 12:14:42 +0200 Subject: [PATCH 1/4] Add missing `@Override` annotations. --- .../org/apache/maven/api/plugin/testing/stubs/ArtifactStub.java | 1 + .../org/apache/maven/api/plugin/testing/stubs/SessionStub.java | 1 + 2 files changed, 2 insertions(+) diff --git a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ArtifactStub.java b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ArtifactStub.java index df9e5c2b..c9ceeaf1 100644 --- a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ArtifactStub.java +++ b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ArtifactStub.java @@ -96,6 +96,7 @@ public void setVersion(String version) { this.version = version; } + @Override public Version getBaseVersion() { return getParser().parseVersion(baseVersion != null ? baseVersion : version); } diff --git a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionStub.java b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionStub.java index 3190b0e0..76f1092d 100644 --- a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionStub.java +++ b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionStub.java @@ -109,6 +109,7 @@ public Map getUserProperties() { } @Nonnull + @Override public Map getEffectiveProperties(@Nullable Project project) { HashMap result = new HashMap<>(getSystemProperties()); if (project != null) { From 38469baa6fea27bdc7f05e1b2018060e267f1650 Mon Sep 17 00:00:00 2001 From: Martin Desruisseaux Date: Tue, 28 Jan 2025 12:52:08 +0100 Subject: [PATCH 2/4] Upgrade to Maven 4.0.0-rc-3. --- .github/release-drafter.yml | 4 +- .../api/plugin/testing/MojoExtension.java | 6 +- .../plugin/testing/stubs/ArtifactStub.java | 4 +- .../api/plugin/testing/stubs/ProjectStub.java | 21 ++++++ .../stubs/RepositorySystemSupplier.java | 64 +++++++++---------- .../api/plugin/testing/stubs/SessionMock.java | 8 +-- .../api/plugin/testing/stubs/SessionStub.java | 11 ++++ pom.xml | 2 +- 8 files changed, 75 insertions(+), 45 deletions(-) diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 245ddc29..f829205b 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -23,6 +23,6 @@ tag-template: maven-plugin-testing-$RESOLVED_VERSION include-pre-releases: true prerelease: true -header: | +header: | > [!WARNING] - > This plugin is a Maven 4 plugin and requires Maven 4.0.0-rc-2 to run. + > This plugin is a Maven 4 plugin and requires Maven 4.0.0-rc-3 to run. diff --git a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/MojoExtension.java b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/MojoExtension.java index 1c813a38..e3006723 100644 --- a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/MojoExtension.java +++ b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/MojoExtension.java @@ -80,10 +80,10 @@ import org.apache.maven.di.Injector; import org.apache.maven.di.Key; import org.apache.maven.di.impl.DIException; +import org.apache.maven.impl.InternalSession; +import org.apache.maven.impl.model.DefaultModelPathTranslator; +import org.apache.maven.impl.model.DefaultPathTranslator; import org.apache.maven.internal.impl.DefaultLog; -import org.apache.maven.internal.impl.InternalSession; -import org.apache.maven.internal.impl.model.DefaultModelPathTranslator; -import org.apache.maven.internal.impl.model.DefaultPathTranslator; import org.apache.maven.internal.xml.XmlNodeImpl; import org.apache.maven.internal.xml.XmlPlexusConfiguration; import org.apache.maven.lifecycle.internal.MojoDescriptorCreator; diff --git a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ArtifactStub.java b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ArtifactStub.java index c9ceeaf1..b1689d44 100644 --- a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ArtifactStub.java +++ b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ArtifactStub.java @@ -25,8 +25,8 @@ import org.apache.maven.api.Version; import org.apache.maven.api.VersionConstraint; import org.apache.maven.api.annotations.Nonnull; -import org.apache.maven.internal.impl.DefaultModelVersionParser; -import org.apache.maven.internal.impl.DefaultVersionParser; +import org.apache.maven.impl.DefaultModelVersionParser; +import org.apache.maven.impl.DefaultVersionParser; import org.eclipse.aether.util.version.GenericVersionScheme; /** diff --git a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ProjectStub.java b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ProjectStub.java index 81b90218..e754f72c 100644 --- a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ProjectStub.java +++ b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ProjectStub.java @@ -36,6 +36,7 @@ import org.apache.maven.api.annotations.Nonnull; import org.apache.maven.api.model.Model; import org.apache.maven.api.model.PluginContainer; +import org.apache.maven.api.model.Profile; /** * @author Olivier Lamy @@ -254,4 +255,24 @@ public ProjectStub addProperty(String key, String value) { model = model.withProperties(props); return this; } + + @Override + public List getDeclaredProfiles() { + return List.of(); + } + + @Override + public List getEffectiveProfiles() { + return List.of(); + } + + @Override + public List getDeclaredActiveProfiles() { + return List.of(); + } + + @Override + public List getEffectiveActiveProfiles() { + return List.of(); + } } diff --git a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java index 7f8244b7..5f7246db 100644 --- a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java +++ b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/RepositorySystemSupplier.java @@ -26,38 +26,37 @@ import java.util.function.Supplier; import org.apache.maven.api.services.ModelBuilder; -import org.apache.maven.internal.impl.DefaultModelUrlNormalizer; -import org.apache.maven.internal.impl.DefaultModelVersionParser; -import org.apache.maven.internal.impl.DefaultModelXmlFactory; -import org.apache.maven.internal.impl.DefaultPluginConfigurationExpander; -import org.apache.maven.internal.impl.DefaultSuperPomProvider; -import org.apache.maven.internal.impl.DefaultUrlNormalizer; -import org.apache.maven.internal.impl.model.DefaultDependencyManagementImporter; -import org.apache.maven.internal.impl.model.DefaultDependencyManagementInjector; -import org.apache.maven.internal.impl.model.DefaultInheritanceAssembler; -import org.apache.maven.internal.impl.model.DefaultInterpolator; -import org.apache.maven.internal.impl.model.DefaultModelBuilder; -import org.apache.maven.internal.impl.model.DefaultModelCacheFactory; -import org.apache.maven.internal.impl.model.DefaultModelInterpolator; -import org.apache.maven.internal.impl.model.DefaultModelNormalizer; -import org.apache.maven.internal.impl.model.DefaultModelPathTranslator; -import org.apache.maven.internal.impl.model.DefaultModelProcessor; -import org.apache.maven.internal.impl.model.DefaultModelValidator; -import org.apache.maven.internal.impl.model.DefaultPathTranslator; -import org.apache.maven.internal.impl.model.DefaultPluginManagementInjector; -import org.apache.maven.internal.impl.model.DefaultProfileInjector; -import org.apache.maven.internal.impl.model.DefaultProfileSelector; -import org.apache.maven.internal.impl.model.rootlocator.DefaultRootLocator; -import org.apache.maven.internal.impl.resolver.DefaultArtifactDescriptorReader; -import org.apache.maven.internal.impl.resolver.DefaultModelResolver; -import org.apache.maven.internal.impl.resolver.DefaultVersionRangeResolver; -import org.apache.maven.internal.impl.resolver.DefaultVersionResolver; -import org.apache.maven.internal.impl.resolver.MavenArtifactRelocationSource; -import org.apache.maven.internal.impl.resolver.PluginsMetadataGeneratorFactory; -import org.apache.maven.internal.impl.resolver.SnapshotMetadataGeneratorFactory; -import org.apache.maven.internal.impl.resolver.VersionsMetadataGeneratorFactory; -import org.apache.maven.internal.impl.resolver.relocation.DistributionManagementArtifactRelocationSource; -import org.apache.maven.internal.impl.resolver.relocation.UserPropertiesArtifactRelocationSource; +import org.apache.maven.impl.DefaultModelUrlNormalizer; +import org.apache.maven.impl.DefaultModelVersionParser; +import org.apache.maven.impl.DefaultModelXmlFactory; +import org.apache.maven.impl.DefaultPluginConfigurationExpander; +import org.apache.maven.impl.DefaultSuperPomProvider; +import org.apache.maven.impl.DefaultUrlNormalizer; +import org.apache.maven.impl.model.DefaultDependencyManagementImporter; +import org.apache.maven.impl.model.DefaultDependencyManagementInjector; +import org.apache.maven.impl.model.DefaultInheritanceAssembler; +import org.apache.maven.impl.model.DefaultInterpolator; +import org.apache.maven.impl.model.DefaultModelBuilder; +import org.apache.maven.impl.model.DefaultModelInterpolator; +import org.apache.maven.impl.model.DefaultModelNormalizer; +import org.apache.maven.impl.model.DefaultModelPathTranslator; +import org.apache.maven.impl.model.DefaultModelProcessor; +import org.apache.maven.impl.model.DefaultModelValidator; +import org.apache.maven.impl.model.DefaultPathTranslator; +import org.apache.maven.impl.model.DefaultPluginManagementInjector; +import org.apache.maven.impl.model.DefaultProfileInjector; +import org.apache.maven.impl.model.DefaultProfileSelector; +import org.apache.maven.impl.model.rootlocator.DefaultRootLocator; +import org.apache.maven.impl.resolver.DefaultArtifactDescriptorReader; +import org.apache.maven.impl.resolver.DefaultModelResolver; +import org.apache.maven.impl.resolver.DefaultVersionRangeResolver; +import org.apache.maven.impl.resolver.DefaultVersionResolver; +import org.apache.maven.impl.resolver.MavenArtifactRelocationSource; +import org.apache.maven.impl.resolver.PluginsMetadataGeneratorFactory; +import org.apache.maven.impl.resolver.SnapshotMetadataGeneratorFactory; +import org.apache.maven.impl.resolver.VersionsMetadataGeneratorFactory; +import org.apache.maven.impl.resolver.relocation.DistributionManagementArtifactRelocationSource; +import org.apache.maven.impl.resolver.relocation.UserPropertiesArtifactRelocationSource; import org.eclipse.aether.RepositoryListener; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; @@ -1076,7 +1075,6 @@ protected ModelBuilder createModelBuilder() { new DefaultPluginConfigurationExpander(), new DefaultModelVersionParser(getVersionScheme()), List.of(), - new DefaultModelCacheFactory(), new DefaultModelResolver(), new DefaultInterpolator(), new DefaultPathTranslator(), diff --git a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionMock.java b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionMock.java index 9b991614..43620819 100644 --- a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionMock.java +++ b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionMock.java @@ -56,10 +56,10 @@ import org.apache.maven.api.services.RepositoryFactory; import org.apache.maven.api.services.VersionParser; import org.apache.maven.api.services.xml.ModelXmlFactory; -import org.apache.maven.internal.impl.DefaultModelVersionParser; -import org.apache.maven.internal.impl.DefaultModelXmlFactory; -import org.apache.maven.internal.impl.DefaultVersionParser; -import org.apache.maven.internal.impl.InternalSession; +import org.apache.maven.impl.DefaultModelVersionParser; +import org.apache.maven.impl.DefaultModelXmlFactory; +import org.apache.maven.impl.DefaultVersionParser; +import org.apache.maven.impl.InternalSession; import org.apache.maven.model.v4.MavenStaxReader; import org.eclipse.aether.util.version.GenericVersionScheme; import org.mockito.ArgumentMatchers; diff --git a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionStub.java b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionStub.java index 76f1092d..050fcd96 100644 --- a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionStub.java +++ b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionStub.java @@ -54,6 +54,7 @@ import org.apache.maven.api.annotations.Nullable; import org.apache.maven.api.model.Repository; import org.apache.maven.api.settings.Settings; +import org.apache.maven.api.toolchain.ToolchainModel; /** */ @@ -444,4 +445,14 @@ public DependencyScope requireDependencyScope(String id) { public PathScope requirePathScope(String id) { return null; } + + @Override + public Optional resolveHighestVersion(ArtifactCoordinates artifact, List repositories) { + return Optional.empty(); + } + + @Override + public Collection getToolchains() { + return List.of(); + } } diff --git a/pom.xml b/pom.xml index b7c6479e..a88f5c4f 100644 --- a/pom.xml +++ b/pom.xml @@ -65,7 +65,7 @@ under the License. 3.5.1 - 4.0.0-rc-2 + 4.0.0-rc-3 plugin-testing-archives/LATEST 17 2025-01-27T19:27:57Z From c7b7f1c1e15654faa1d803cc4e19fac76223713b Mon Sep 17 00:00:00 2001 From: Martin Desruisseaux Date: Sun, 16 Mar 2025 12:29:00 +0100 Subject: [PATCH 3/4] Added private fields and public setter methods for the new methods added in `ProjectStub`. No setter added for `SessionStub` because the previously existing methods were already returning null or empty collections. --- .../api/plugin/testing/stubs/ProjectStub.java | 33 ++++++++++++++++--- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ProjectStub.java b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ProjectStub.java index e754f72c..e08d32cc 100644 --- a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ProjectStub.java +++ b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/ProjectStub.java @@ -50,8 +50,11 @@ public class ProjectStub implements Project { private Path pomPath; private boolean topProject; private Path rootDirectory; - private Map properties = new HashMap<>(); private ProducedArtifact mainArtifact; + private List declaredProfiles = List.of(); + private List effectiveProfiles = List.of(); + private List declaredActiveProfiles = List.of(); + private List effectiveActiveProfiles = List.of(); public void setModel(Model model) { this.model = model; @@ -257,22 +260,42 @@ public ProjectStub addProperty(String key, String value) { } @Override + @SuppressWarnings("ReturnOfCollectionOrArrayField") // Safe because list is unmodifiable. public List getDeclaredProfiles() { - return List.of(); + return declaredProfiles; + } + + public void setDeclaredProfiles(List values) { + declaredProfiles = List.copyOf(values); } @Override + @SuppressWarnings("ReturnOfCollectionOrArrayField") // Safe because list is unmodifiable. public List getEffectiveProfiles() { - return List.of(); + return effectiveProfiles; + } + + public void setEffectiveProfiles(List values) { + effectiveProfiles = List.copyOf(values); } @Override + @SuppressWarnings("ReturnOfCollectionOrArrayField") // Safe because list is unmodifiable. public List getDeclaredActiveProfiles() { - return List.of(); + return declaredActiveProfiles; + } + + public void setDeclaredActiveProfiles(List values) { + declaredActiveProfiles = List.copyOf(values); } @Override + @SuppressWarnings("ReturnOfCollectionOrArrayField") // Safe because list is unmodifiable. public List getEffectiveActiveProfiles() { - return List.of(); + return effectiveActiveProfiles; + } + + public void setEffectiveActiveProfiles(List values) { + effectiveActiveProfiles = List.copyOf(values); } } From ff46dc6f78a5d53ee28c52909890a0a00dc18448 Mon Sep 17 00:00:00 2001 From: Martin Desruisseaux Date: Sun, 16 Mar 2025 13:53:42 +0100 Subject: [PATCH 4/4] Add an empty `LookupStub` returned by `Session.getService(Lookup.class)` mock. It resolves the `NullPointerException` observed during compiler plugin tests. --- .../api/plugin/testing/stubs/LookupStub.java | 68 +++++++++++++++++++ .../api/plugin/testing/stubs/SessionMock.java | 6 ++ 2 files changed, 74 insertions(+) create mode 100644 maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/LookupStub.java diff --git a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/LookupStub.java b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/LookupStub.java new file mode 100644 index 00000000..15f4e91b --- /dev/null +++ b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/LookupStub.java @@ -0,0 +1,68 @@ +/* + * 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.api.plugin.testing.stubs; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import org.apache.maven.api.services.Lookup; +import org.apache.maven.api.services.LookupException; + +public class LookupStub implements Lookup { + /** + * A stub where all methods return an empty value when possible, or throw an exception otherwise. + */ + public static final Lookup EMPTY = new LookupStub(); + + /** + * For sub-class constructors. + */ + protected LookupStub() {} + + @Override + public T lookup(Class type) { + throw new LookupException("This is only a stub."); + } + + @Override + public T lookup(Class type, String string) { + throw new LookupException("This is only a stub."); + } + + @Override + public Optional lookupOptional(Class type) { + return Optional.empty(); + } + + @Override + public Optional lookupOptional(Class type, String string) { + return Optional.empty(); + } + + @Override + public List lookupList(Class type) { + return List.of(); + } + + @Override + public Map lookupMap(Class type) { + return Map.of(); + } +} diff --git a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionMock.java b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionMock.java index 43620819..77d66d5a 100644 --- a/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionMock.java +++ b/maven-plugin-testing-harness/src/main/java/org/apache/maven/api/plugin/testing/stubs/SessionMock.java @@ -49,6 +49,7 @@ import org.apache.maven.api.services.ArtifactInstallerRequest; import org.apache.maven.api.services.ArtifactManager; import org.apache.maven.api.services.LocalRepositoryManager; +import org.apache.maven.api.services.Lookup; import org.apache.maven.api.services.ProjectBuilder; import org.apache.maven.api.services.ProjectBuilderRequest; import org.apache.maven.api.services.ProjectBuilderResult; @@ -383,6 +384,11 @@ public static InternalSession getMockSession(LocalRepository localRepository) { // when(session.getService(ModelXmlFactory.class)).thenReturn(new DefaultModelXmlFactory()); + // + // Lookup + // + when(session.getService(Lookup.class)).thenReturn(LookupStub.EMPTY); + // // Other //