blob: cd71428fdb6b5b69d68384e3db744137652da88e [file] [log] [blame]
/*
* 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.internal.impl;
import javax.inject.Inject;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import org.apache.maven.api.*;
import org.apache.maven.api.services.DependencyResolver;
import org.apache.maven.api.services.DependencyResolverResult;
import org.apache.maven.api.services.ProjectBuilder;
import org.apache.maven.api.services.ProjectBuilderRequest;
import org.apache.maven.api.services.SettingsBuilder;
import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
import org.apache.maven.bridge.MavenRepositorySystem;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.DefaultMavenExecutionResult;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.scope.internal.MojoExecutionScope;
import org.apache.maven.repository.internal.MavenSessionBuilderSupplier;
import org.apache.maven.rtinfo.RuntimeInformation;
import org.apache.maven.session.scope.internal.SessionScope;
import org.apache.maven.toolchain.DefaultToolchainManagerPrivate;
import org.apache.maven.toolchain.building.ToolchainsBuilder;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.testing.PlexusTest;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.impl.MetadataGeneratorFactory;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.RemoteRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@PlexusTest
class TestApi {
Session session;
@Inject
RepositorySystem repositorySystem;
@Inject
org.apache.maven.project.ProjectBuilder projectBuilder;
@Inject
MavenRepositorySystem mavenRepositorySystem;
@Inject
DefaultToolchainManagerPrivate toolchainManagerPrivate;
@Inject
PlexusContainer plexusContainer;
@Inject
MojoExecutionScope mojoExecutionScope;
@Inject
RuntimeInformation runtimeInformation;
@Inject
ArtifactHandlerManager artifactHandlerManager;
@Inject
SessionScope sessionScope;
@Inject
SettingsBuilder settingsBuilder;
@Inject
ToolchainsBuilder toolchainsBuilder;
@BeforeEach
void setup() {
// create session with any local repo, is redefined anyway below
RepositorySystemSession rss = new MavenSessionBuilderSupplier(repositorySystem)
.get()
.withLocalRepositoryBaseDirectories(new File("target").toPath())
.build();
DefaultMavenExecutionRequest mer = new DefaultMavenExecutionRequest();
DefaultMavenExecutionResult meres = new DefaultMavenExecutionResult();
MavenSession ms = new MavenSession(rss, mer, meres);
DefaultSession session = new DefaultSession(
ms,
repositorySystem,
Collections.emptyList(),
mavenRepositorySystem,
new DefaultLookup(plexusContainer),
runtimeInformation);
DefaultLocalRepository localRepository =
new DefaultLocalRepository(new LocalRepository("target/test-classes/apiv4-repo"));
org.apache.maven.api.RemoteRepository remoteRepository = session.getRemoteRepository(
new RemoteRepository.Builder("mirror", "default", "file:target/test-classes/repo").build());
this.session = session.withLocalRepository(localRepository)
.withRemoteRepositories(Collections.singletonList(remoteRepository));
InternalSession.associate(rss, this.session);
sessionScope.enter();
sessionScope.seed(InternalMavenSession.class, InternalMavenSession.from(this.session));
}
private Project project(Artifact artifact) {
return session.getService(ProjectBuilder.class)
.build(ProjectBuilderRequest.builder()
.session(session)
.path(session.getPathForLocalArtifact(artifact))
.processPlugins(false)
.build())
.getProject()
.get();
}
@Test
void testCreateAndResolveArtifact() {
ArtifactCoordinate coord =
session.createArtifactCoordinate("org.codehaus.plexus", "plexus-utils", "1.4.5", "pom");
Map.Entry<Artifact, Path> resolved = session.resolveArtifact(coord);
assertNotNull(resolved);
assertNotNull(resolved.getKey());
assertNotNull(resolved.getValue());
Optional<Path> op = session.getArtifactPath(resolved.getKey());
assertTrue(op.isPresent());
assertEquals(resolved.getValue(), op.get());
}
@Test
void testBuildProject() {
Artifact artifact = session.createArtifact("org.codehaus.plexus", "plexus-utils", "1.4.5", "pom");
Project project = project(artifact);
assertNotNull(project);
}
@Test
void testCollectArtifactDependencies() {
Artifact artifact =
session.createArtifact("org.codehaus.plexus", "plexus-container-default", "1.0-alpha-32", "jar");
Node root = session.collectDependencies(artifact);
assertNotNull(root);
}
@Test
void testResolveArtifactCoordinateDependencies() {
DependencyCoordinate coord = session.createDependencyCoordinate(
session.createArtifactCoordinate("org.apache.maven.core.test", "test-extension", "1", "jar"));
List<Path> paths = session.resolveDependencies(coord);
assertNotNull(paths);
assertEquals(10, paths.size());
assertEquals("test-extension-1.jar", paths.get(0).getFileName().toString());
// JUnit has an "Automatic-Module-Name", so it appears on the module path.
Map<PathType, List<Path>> dispatched = session.resolveDependencies(
coord, PathScope.TEST_COMPILE, Arrays.asList(JavaPathType.CLASSES, JavaPathType.MODULES));
List<Path> classes = dispatched.get(JavaPathType.CLASSES);
List<Path> modules = dispatched.get(JavaPathType.MODULES);
List<Path> unresolved = dispatched.get(PathType.UNRESOLVED);
assertEquals(3, dispatched.size());
assertEquals(1, unresolved.size());
assertEquals(8, classes.size()); // "plexus.pom" and "junit.jar" are excluded.
assertEquals(1, modules.size());
assertEquals("plexus-1.0.11.pom", unresolved.get(0).getFileName().toString());
assertEquals("test-extension-1.jar", classes.get(0).getFileName().toString());
assertEquals("junit-4.13.1.jar", modules.get(0).getFileName().toString());
assertTrue(paths.containsAll(classes));
assertTrue(paths.containsAll(modules));
// If caller wants only a classpath, JUnit shall move there.
dispatched = session.resolveDependencies(coord, PathScope.TEST_COMPILE, Arrays.asList(JavaPathType.CLASSES));
classes = dispatched.get(JavaPathType.CLASSES);
modules = dispatched.get(JavaPathType.MODULES);
unresolved = dispatched.get(PathType.UNRESOLVED);
assertEquals(2, dispatched.size());
assertEquals(1, unresolved.size());
assertEquals(9, classes.size());
assertNull(modules);
assertTrue(paths.containsAll(classes));
assertEquals("plexus-1.0.11.pom", unresolved.get(0).getFileName().toString());
}
@Test
void testMetadataGeneratorFactory() throws ComponentLookupException {
List<MetadataGeneratorFactory> factories = plexusContainer.lookupList(MetadataGeneratorFactory.class);
assertNotNull(factories);
factories.forEach(f -> System.out.println(f.getClass().getName()));
assertEquals(3, factories.size());
}
@Test
void testProjectDependencies() {
Artifact pom = session.createArtifact("org.codehaus.plexus", "plexus-container-default", "1.0-alpha-32", "pom");
Project project = project(pom);
assertNotNull(project);
Artifact artifact = session.createArtifact("org.apache.maven.core.test", "test-extension", "1", "jar");
Node root = session.collectDependencies(artifact);
assertNotNull(root);
DependencyResolverResult result =
session.getService(DependencyResolver.class).resolve(session, project, PathScope.MAIN_RUNTIME);
assertNotNull(result);
List<Dependency> deps = new ArrayList<>(result.getDependencies().keySet());
List<Dependency> deps2 = result.getNodes().stream()
.map(Node::getDependency)
.filter(Objects::nonNull)
.collect(Collectors.toList());
assertEquals(deps, deps2);
for (Dependency dep : deps2) {
dep.getVersion();
}
}
}