From fff8a50a120c4effa6b97f349f9c9fa0b3f7dce5 Mon Sep 17 00:00:00 2001 From: "hongbo.weihb" Date: Fri, 6 May 2022 19:55:55 +0800 Subject: [PATCH 1/2] Add Test cases for the repair of BF algorithm of dependent package when children are empty Signed-off-by: hongbo.weihb --- .../impl/collect/bf/BfDependencyCollectorTest.java | 14 ++++++++++---- .../dependencies-empty/gid_aa_ver.ini | 4 ++++ ...edSubtreeOnDescriptorDependenciesEmptyLeft.txt} | 0 ...edSubtreeOnDescriptorDependenciesEmptyRight.txt | 8 ++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 maven-resolver-impl/src/test/resources/artifact-descriptions/dependencies-empty/gid_aa_ver.ini rename maven-resolver-impl/src/test/resources/artifact-descriptions/{expectedSubtreeOnDescriptorDependenciesEmpty.txt => expectedSubtreeOnDescriptorDependenciesEmptyLeft.txt} (100%) create mode 100644 maven-resolver-impl/src/test/resources/artifact-descriptions/expectedSubtreeOnDescriptorDependenciesEmptyRight.txt diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java index 2a1dbea53..5a7487e8b 100644 --- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java +++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java @@ -586,10 +586,6 @@ public void testVersionFilter() public void testDescriptorDependenciesEmpty() throws Exception { - DependencyNode root = parser.parseResource("expectedSubtreeOnDescriptorDependenciesEmpty.txt"); - Dependency dependency = root.getDependency(); - CollectRequest request = new CollectRequest(dependency, Arrays.asList(repository)); - collector.setArtifactDescriptorReader(newReader("dependencies-empty/")); session.setDependencyGraphTransformer(new ConflictResolver( @@ -597,8 +593,18 @@ public void testDescriptorDependenciesEmpty() new JavaScopeDeriver() )); + + DependencyNode root = parser.parseResource("expectedSubtreeOnDescriptorDependenciesEmptyLeft.txt"); + Dependency dependency = root.getDependency(); + CollectRequest request = new CollectRequest(dependency, Arrays.asList(repository)); CollectResult result = collector.collectDependencies(session, request); assertEqualSubtree(root, result.getRoot()); + + root = parser.parseResource("expectedSubtreeOnDescriptorDependenciesEmptyRight.txt"); + dependency = root.getDependency(); + request = new CollectRequest(dependency, Arrays.asList(repository)); + result = collector.collectDependencies(session, request); + assertEqualSubtree(root, result.getRoot()); } static class TestDependencyManager diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/dependencies-empty/gid_aa_ver.ini b/maven-resolver-impl/src/test/resources/artifact-descriptions/dependencies-empty/gid_aa_ver.ini new file mode 100644 index 000000000..7b16df55b --- /dev/null +++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/dependencies-empty/gid_aa_ver.ini @@ -0,0 +1,4 @@ +[dependencies] +gid:c:jar:ver +gid:b:jar:ver +gid:e:jar:ver diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/expectedSubtreeOnDescriptorDependenciesEmpty.txt b/maven-resolver-impl/src/test/resources/artifact-descriptions/expectedSubtreeOnDescriptorDependenciesEmptyLeft.txt similarity index 100% rename from maven-resolver-impl/src/test/resources/artifact-descriptions/expectedSubtreeOnDescriptorDependenciesEmpty.txt rename to maven-resolver-impl/src/test/resources/artifact-descriptions/expectedSubtreeOnDescriptorDependenciesEmptyLeft.txt diff --git a/maven-resolver-impl/src/test/resources/artifact-descriptions/expectedSubtreeOnDescriptorDependenciesEmptyRight.txt b/maven-resolver-impl/src/test/resources/artifact-descriptions/expectedSubtreeOnDescriptorDependenciesEmptyRight.txt new file mode 100644 index 000000000..84f74df2d --- /dev/null +++ b/maven-resolver-impl/src/test/resources/artifact-descriptions/expectedSubtreeOnDescriptorDependenciesEmptyRight.txt @@ -0,0 +1,8 @@ +gid:aa:jar:ver ++- gid:c:jar:ver compile +| +- gid:d:jar:2 compile +| | +- gid:g:jar:1 compile +| | | \- gid:h:jar:1 compile ++- gid:b:jar:ver compile +\- gid:e:jar:ver compile +| \- gid:f:jar:ver compile \ No newline at end of file From 17f1add5ca481e2c1187ad10a3f127ade6c7fc50 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Tue, 10 May 2022 13:24:13 +0200 Subject: [PATCH 2/2] Add test cases for empty children, also collaps tests --- ...ependencyCollectorDelegateTestSupport.java | 680 ++++++++++++++++++ .../collect/bf/BfDependencyCollectorTest.java | 651 +---------------- .../bf/BfDependencyCollectorUseSkipTest.java | 86 --- .../collect/df/DfDependencyCollectorTest.java | 620 +--------------- 4 files changed, 723 insertions(+), 1314 deletions(-) create mode 100644 maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegateTestSupport.java delete mode 100644 maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorUseSkipTest.java diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegateTestSupport.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegateTestSupport.java new file mode 100644 index 000000000..c7759ced8 --- /dev/null +++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegateTestSupport.java @@ -0,0 +1,680 @@ +package org.eclipse.aether.internal.impl.collect; + +/* + * 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. + */ + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +import org.eclipse.aether.DefaultRepositorySystemSession; +import org.eclipse.aether.RepositorySystemSession; +import org.eclipse.aether.artifact.Artifact; +import org.eclipse.aether.artifact.ArtifactProperties; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.collection.CollectRequest; +import org.eclipse.aether.collection.CollectResult; +import org.eclipse.aether.collection.DependencyCollectionContext; +import org.eclipse.aether.collection.DependencyCollectionException; +import org.eclipse.aether.collection.DependencyManagement; +import org.eclipse.aether.collection.DependencyManager; +import org.eclipse.aether.graph.DefaultDependencyNode; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.graph.DependencyCycle; +import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.graph.Exclusion; +import org.eclipse.aether.impl.ArtifactDescriptorReader; +import org.eclipse.aether.internal.impl.IniArtifactDescriptorReader; +import org.eclipse.aether.internal.test.util.DependencyGraphParser; +import org.eclipse.aether.internal.test.util.TestUtils; +import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.ArtifactDescriptorException; +import org.eclipse.aether.resolution.ArtifactDescriptorRequest; +import org.eclipse.aether.resolution.ArtifactDescriptorResult; +import org.eclipse.aether.util.artifact.ArtifactIdUtils; +import org.eclipse.aether.util.graph.manager.ClassicDependencyManager; +import org.eclipse.aether.util.graph.manager.DefaultDependencyManager; +import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; +import org.eclipse.aether.util.graph.manager.TransitiveDependencyManager; +import org.eclipse.aether.util.graph.transformer.ConflictResolver; +import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver; +import org.eclipse.aether.util.graph.transformer.JavaScopeSelector; +import org.eclipse.aether.util.graph.transformer.NearestVersionSelector; +import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector; +import org.eclipse.aether.util.graph.version.HighestVersionFilter; +import org.junit.Before; +import org.junit.Test; + +import static java.util.Collections.singletonList; +import static java.util.Objects.requireNonNull; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +/** + * Common tests for various {@link DependencyCollectorDelegate} implementations. + */ +public abstract class DependencyCollectorDelegateTestSupport +{ + + protected DefaultRepositorySystemSession session; + + protected DependencyGraphParser parser; + + protected RemoteRepository repository; + + protected DependencyCollectorDelegate collector; + + protected IniArtifactDescriptorReader newReader( String prefix ) + { + return new IniArtifactDescriptorReader( "artifact-descriptions/" + prefix ); + } + + protected Dependency newDep( String coords ) + { + return newDep( coords, "" ); + } + + protected Dependency newDep( String coords, String scope ) + { + return new Dependency( new DefaultArtifact( coords ), scope ); + } + + @Before + public void setup() + { + session = TestUtils.newSession(); + parser = new DependencyGraphParser( "artifact-descriptions/" ); + repository = new RemoteRepository.Builder( "id", "default", "file:///" ).build(); + setupCollector(); + } + + protected abstract void setupCollector(); + + private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual ) + { + assertEqualSubtree( expected, actual, new LinkedList<>() ); + } + + private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual, + LinkedList parents ) + { + assertEquals( "path: " + parents, expected.getDependency(), actual.getDependency() ); + + if ( actual.getDependency() != null ) + { + Artifact artifact = actual.getDependency().getArtifact(); + for ( DependencyNode parent : parents ) + { + if ( parent.getDependency() != null && artifact.equals( parent.getDependency().getArtifact() ) ) + { + return; + } + } + } + + parents.addLast( expected ); + + assertEquals( "path: " + parents + ", expected: " + expected.getChildren() + ", actual: " + + actual.getChildren(), expected.getChildren().size(), actual.getChildren().size() ); + + Iterator iterator1 = expected.getChildren().iterator(); + Iterator iterator2 = actual.getChildren().iterator(); + + while ( iterator1.hasNext() ) + { + assertEqualSubtree( iterator1.next(), iterator2.next(), parents ); + } + + parents.removeLast(); + } + + protected Dependency dep( DependencyNode root, int... coords ) + { + return path( root, coords ).getDependency(); + } + + protected DependencyNode path( DependencyNode root, int... coords ) + { + try + { + DependencyNode node = root; + for ( int coord : coords ) + { + node = node.getChildren().get( coord ); + } + + return node; + } + catch ( IndexOutOfBoundsException | NullPointerException e ) + { + throw new IllegalArgumentException( "illegal coordinates for child", e ); + } + } + + @Test + public void testSimpleCollection() + throws DependencyCollectionException + { + Dependency dependency = newDep( "gid:aid:ext:ver", "compile" ); + CollectRequest request = new CollectRequest( dependency, singletonList( repository ) ); + CollectResult result = collector.collectDependencies( session, request ); + + assertEquals( 0, result.getExceptions().size() ); + + DependencyNode root = result.getRoot(); + Dependency newDependency = root.getDependency(); + + assertEquals( dependency, newDependency ); + assertEquals( dependency.getArtifact(), newDependency.getArtifact() ); + + assertEquals( 1, root.getChildren().size() ); + + Dependency expect = newDep( "gid:aid2:ext:ver", "compile" ); + assertEquals( expect, root.getChildren().get( 0 ).getDependency() ); + } + + @Test + public void testMissingDependencyDescription() + { + CollectRequest request = + new CollectRequest( newDep( "missing:description:ext:ver" ), singletonList( repository ) ); + try + { + collector.collectDependencies( session, request ); + fail( "expected exception" ); + } + catch ( DependencyCollectionException e ) + { + CollectResult result = e.getResult(); + assertSame( request, result.getRequest() ); + assertNotNull( result.getExceptions() ); + assertEquals( 1, result.getExceptions().size() ); + + assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactDescriptorException ); + + assertEquals( request.getRoot(), result.getRoot().getDependency() ); + } + } + + @Test + public void testDuplicates() + throws DependencyCollectionException + { + Dependency dependency = newDep( "duplicate:transitive:ext:dependency" ); + CollectRequest request = new CollectRequest( dependency, singletonList( repository ) ); + + CollectResult result = collector.collectDependencies( session, request ); + + assertEquals( 0, result.getExceptions().size() ); + + DependencyNode root = result.getRoot(); + Dependency newDependency = root.getDependency(); + + assertEquals( dependency, newDependency ); + assertEquals( dependency.getArtifact(), newDependency.getArtifact() ); + + assertEquals( 2, root.getChildren().size() ); + + Dependency dep = newDep( "gid:aid:ext:ver", "compile" ); + assertEquals( dep, dep( root, 0 ) ); + + dep = newDep( "gid:aid2:ext:ver", "compile" ); + assertEquals( dep, dep( root, 1 ) ); + assertEquals( dep, dep( root, 0, 0 ) ); + assertEquals( dep( root, 1 ), dep( root, 0, 0 ) ); + } + + @Test + public void testEqualSubtree() + throws IOException, DependencyCollectionException + { + DependencyNode root = parser.parseResource( "expectedSubtreeComparisonResult.txt" ); + Dependency dependency = root.getDependency(); + CollectRequest request = new CollectRequest( dependency, singletonList( repository ) ); + + CollectResult result = collector.collectDependencies( session, request ); + assertEqualSubtree( root, result.getRoot() ); + } + + @Test + public void testCyclicDependencies() + throws Exception + { + DependencyNode root = parser.parseResource( "cycle.txt" ); + CollectRequest request = new CollectRequest( root.getDependency(), singletonList( repository ) ); + CollectResult result = collector.collectDependencies( session, request ); + assertEqualSubtree( root, result.getRoot() ); + } + + @Test + public void testCyclicDependenciesBig() + throws Exception + { + CollectRequest request = new CollectRequest( newDep( "1:2:pom:5.50-SNAPSHOT" ), singletonList( repository ) ); + collector.setArtifactDescriptorReader( newReader( "cycle-big/" ) ); + CollectResult result = collector.collectDependencies( session, request ); + assertNotNull( result.getRoot() ); + // we only care about the performance here, this test must not hang or run out of mem + } + + @Test + public void testCyclicProjects() + throws Exception + { + CollectRequest request = new CollectRequest( newDep( "test:a:2" ), singletonList( repository ) ); + collector.setArtifactDescriptorReader( newReader( "versionless-cycle/" ) ); + CollectResult result = collector.collectDependencies( session, request ); + DependencyNode root = result.getRoot(); + DependencyNode a1 = path( root, 0, 0 ); + assertEquals( "a", a1.getArtifact().getArtifactId() ); + assertEquals( "1", a1.getArtifact().getVersion() ); + for ( DependencyNode child : a1.getChildren() ) + { + assertNotEquals( "1", child.getArtifact().getVersion() ); + } + + assertEquals( 1, result.getCycles().size() ); + DependencyCycle cycle = result.getCycles().get( 0 ); + assertEquals( Collections.emptyList(), cycle.getPrecedingDependencies() ); + assertEquals( Arrays.asList( root.getDependency(), path( root, 0 ).getDependency(), a1.getDependency() ), + cycle.getCyclicDependencies() ); + } + + @Test + public void testCyclicProjects_ConsiderLabelOfRootlessGraph() + throws Exception + { + Dependency dep = newDep( "gid:aid:ver", "compile" ); + CollectRequest request = + new CollectRequest().addDependency( dep ).addRepository( repository ) + .setRootArtifact( dep.getArtifact() ); + CollectResult result = collector.collectDependencies( session, request ); + DependencyNode root = result.getRoot(); + DependencyNode a1 = root.getChildren().get( 0 ); + assertEquals( "aid", a1.getArtifact().getArtifactId() ); + assertEquals( "ver", a1.getArtifact().getVersion() ); + DependencyNode a2 = a1.getChildren().get( 0 ); + assertEquals( "aid2", a2.getArtifact().getArtifactId() ); + assertEquals( "ver", a2.getArtifact().getVersion() ); + + assertEquals( 1, result.getCycles().size() ); + DependencyCycle cycle = result.getCycles().get( 0 ); + assertEquals( Collections.emptyList(), cycle.getPrecedingDependencies() ); + assertEquals( Arrays.asList( new Dependency( dep.getArtifact(), null ), a1.getDependency() ), + cycle.getCyclicDependencies() ); + } + + @Test + public void testPartialResultOnError() + throws IOException + { + DependencyNode root = parser.parseResource( "expectedPartialSubtreeOnError.txt" ); + + Dependency dependency = root.getDependency(); + CollectRequest request = new CollectRequest( dependency, singletonList( repository ) ); + + CollectResult result; + try + { + result = collector.collectDependencies( session, request ); + fail( "expected exception " ); + } + catch ( DependencyCollectionException e ) + { + result = e.getResult(); + + assertSame( request, result.getRequest() ); + assertNotNull( result.getExceptions() ); + assertEquals( 1, result.getExceptions().size() ); + + assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactDescriptorException ); + + assertEqualSubtree( root, result.getRoot() ); + } + } + + @Test + public void testCollectMultipleDependencies() + throws DependencyCollectionException + { + Dependency root1 = newDep( "gid:aid:ext:ver", "compile" ); + Dependency root2 = newDep( "gid:aid2:ext:ver", "compile" ); + List dependencies = Arrays.asList( root1, root2 ); + CollectRequest request = new CollectRequest( dependencies, null, singletonList( repository ) ); + CollectResult result = collector.collectDependencies( session, request ); + + assertEquals( 0, result.getExceptions().size() ); + assertEquals( 2, result.getRoot().getChildren().size() ); + assertEquals( root1, dep( result.getRoot(), 0 ) ); + + assertEquals( 1, path( result.getRoot(), 0 ).getChildren().size() ); + assertEquals( root2, dep( result.getRoot(), 0, 0 ) ); + + assertEquals( 0, path( result.getRoot(), 1 ).getChildren().size() ); + assertEquals( root2, dep( result.getRoot(), 1 ) ); + } + + @Test + public void testArtifactDescriptorResolutionNotRestrictedToRepoHostingSelectedVersion() + throws Exception + { + RemoteRepository repo2 = new RemoteRepository.Builder( "test", "default", "file:///" ).build(); + + final List repos = new ArrayList<>(); + + collector.setArtifactDescriptorReader( new ArtifactDescriptorReader() + { + public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session, + ArtifactDescriptorRequest request ) + { + repos.addAll( request.getRepositories() ); + return new ArtifactDescriptorResult( request ); + } + } ); + + List dependencies = singletonList( newDep( "verrange:parent:jar:1[1,)", "compile" ) ); + CollectRequest request = new CollectRequest( dependencies, null, Arrays.asList( repository, repo2 ) ); + CollectResult result = collector.collectDependencies( session, request ); + + assertEquals( 0, result.getExceptions().size() ); + assertEquals( 2, repos.size() ); + assertEquals( "id", repos.get( 0 ).getId() ); + assertEquals( "test", repos.get( 1 ).getId() ); + } + + @Test + public void testManagedVersionScope() + throws DependencyCollectionException + { + Dependency dependency = newDep( "managed:aid:ext:ver" ); + CollectRequest request = new CollectRequest( dependency, singletonList( repository ) ); + + session.setDependencyManager( new ClassicDependencyManager() ); + + CollectResult result = collector.collectDependencies( session, request ); + + assertEquals( 0, result.getExceptions().size() ); + + DependencyNode root = result.getRoot(); + + assertEquals( dependency, dep( root ) ); + assertEquals( dependency.getArtifact(), dep( root ).getArtifact() ); + + assertEquals( 1, root.getChildren().size() ); + Dependency expect = newDep( "gid:aid:ext:ver", "compile" ); + assertEquals( expect, dep( root, 0 ) ); + + assertEquals( 1, path( root, 0 ).getChildren().size() ); + expect = newDep( "gid:aid2:ext:managedVersion", "managedScope" ); + assertEquals( expect, dep( root, 0, 0 ) ); + } + + @Test + public void testDependencyManagement() + throws IOException, DependencyCollectionException + { + collector.setArtifactDescriptorReader( newReader( "managed/" ) ); + + DependencyNode root = parser.parseResource( "expectedSubtreeComparisonResult.txt" ); + TestDependencyManager depMgmt = new TestDependencyManager(); + depMgmt.add( dep( root, 0 ), "managed", null, null ); + depMgmt.add( dep( root, 0, 1 ), "managed", "managed", null ); + depMgmt.add( dep( root, 1 ), null, null, "managed" ); + session.setDependencyManager( depMgmt ); + + // collect result will differ from expectedSubtreeComparisonResult.txt + // set localPath -> no dependency traversal + CollectRequest request = new CollectRequest( dep( root ), singletonList( repository ) ); + CollectResult result = collector.collectDependencies( session, request ); + + DependencyNode node = result.getRoot(); + assertEquals( "managed", dep( node, 0, 1 ).getArtifact().getVersion() ); + assertEquals( "managed", dep( node, 0, 1 ).getScope() ); + + assertEquals( "managed", dep( node, 1 ).getArtifact().getProperty( ArtifactProperties.LOCAL_PATH, null ) ); + assertEquals( "managed", dep( node, 0, 0 ).getArtifact().getProperty( ArtifactProperties.LOCAL_PATH, null ) ); + } + + @Test + public void testDependencyManagement_VerboseMode() + throws Exception + { + String depId = "gid:aid2:ext"; + TestDependencyManager depMgmt = new TestDependencyManager(); + depMgmt.version( depId, "managedVersion" ); + depMgmt.scope( depId, "managedScope" ); + depMgmt.optional( depId, Boolean.TRUE ); + depMgmt.path( depId, "managedPath" ); + depMgmt.exclusions( depId, new Exclusion( "gid", "aid", "*", "*" ) ); + session.setDependencyManager( depMgmt ); + session.setConfigProperty( DependencyManagerUtils.CONFIG_PROP_VERBOSE, Boolean.TRUE ); + + CollectRequest request = new CollectRequest().setRoot( newDep( "gid:aid:ver" ) ); + CollectResult result = collector.collectDependencies( session, request ); + DependencyNode node = result.getRoot().getChildren().get( 0 ); + assertEquals( DependencyNode.MANAGED_VERSION | DependencyNode.MANAGED_SCOPE | DependencyNode.MANAGED_OPTIONAL + | DependencyNode.MANAGED_PROPERTIES | DependencyNode.MANAGED_EXCLUSIONS, node.getManagedBits() ); + assertEquals( "ver", DependencyManagerUtils.getPremanagedVersion( node ) ); + assertEquals( "compile", DependencyManagerUtils.getPremanagedScope( node ) ); + assertEquals( Boolean.FALSE, DependencyManagerUtils.getPremanagedOptional( node ) ); + } + + @Test + public void testDependencyManagement_TransitiveDependencyManager() + throws DependencyCollectionException, IOException + { + collector.setArtifactDescriptorReader( newReader( "managed/" ) ); + parser = new DependencyGraphParser( "artifact-descriptions/managed/" ); + session.setDependencyManager( new TransitiveDependencyManager() ); + final Dependency root = newDep( "gid:root:ext:ver", "compile" ); + CollectRequest request = new CollectRequest( root, singletonList( repository ) ); + request.addManagedDependency( newDep( "gid:root:ext:must-retain-core-management" ) ); + CollectResult result = collector.collectDependencies( session, request ); + + final DependencyNode expectedTree = parser.parseResource( "management-tree.txt" ); + assertEqualSubtree( expectedTree, result.getRoot() ); + + // Same test for root artifact (POM) request. + final CollectRequest rootArtifactRequest = new CollectRequest(); + rootArtifactRequest.setRepositories( singletonList( repository ) ); + rootArtifactRequest.setRootArtifact( new DefaultArtifact( "gid:root:ext:ver" ) ); + rootArtifactRequest.addDependency( newDep( "gid:direct:ext:ver", "compile" ) ); + rootArtifactRequest.addManagedDependency( newDep( "gid:root:ext:must-retain-core-management" ) ); + rootArtifactRequest.addManagedDependency( newDep( "gid:direct:ext:must-retain-core-management" ) ); + rootArtifactRequest.addManagedDependency( newDep( "gid:transitive-1:ext:managed-by-root" ) ); + session.setDependencyManager( new TransitiveDependencyManager() ); + result = collector.collectDependencies( session, rootArtifactRequest ); + assertEqualSubtree( expectedTree, toDependencyResult( result.getRoot(), "compile", null ) ); + } + + @Test + public void testDependencyManagement_DefaultDependencyManager() + throws DependencyCollectionException, IOException + { + collector.setArtifactDescriptorReader( newReader( "managed/" ) ); + parser = new DependencyGraphParser( "artifact-descriptions/managed/" ); + session.setDependencyManager( new DefaultDependencyManager() ); + final Dependency root = newDep( "gid:root:ext:ver", "compile" ); + CollectRequest request = new CollectRequest( root, singletonList( repository ) ); + request.addManagedDependency( newDep( "gid:root:ext:must-not-manage-root" ) ); + request.addManagedDependency( newDep( "gid:direct:ext:managed-by-dominant-request" ) ); + CollectResult result = collector.collectDependencies( session, request ); + + final DependencyNode expectedTree = parser.parseResource( "default-management-tree.txt" ); + assertEqualSubtree( expectedTree, result.getRoot() ); + + // Same test for root artifact (POM) request. + final CollectRequest rootArtifactRequest = new CollectRequest(); + rootArtifactRequest.setRepositories( singletonList( repository ) ); + rootArtifactRequest.setRootArtifact( new DefaultArtifact( "gid:root:ext:ver" ) ); + rootArtifactRequest.addDependency( newDep( "gid:direct:ext:ver", "compile" ) ); + rootArtifactRequest.addManagedDependency( newDep( "gid:root:ext:must-not-manage-root" ) ); + rootArtifactRequest.addManagedDependency( newDep( "gid:direct:ext:managed-by-dominant-request" ) ); + rootArtifactRequest.addManagedDependency( newDep( "gid:transitive-1:ext:managed-by-root" ) ); + session.setDependencyManager( new DefaultDependencyManager() ); + result = collector.collectDependencies( session, rootArtifactRequest ); + assertEqualSubtree( expectedTree, toDependencyResult( result.getRoot(), "compile", null ) ); + } + + private DependencyNode toDependencyResult( final DependencyNode root, final String rootScope, + final Boolean optional ) + { + // Make the root artifact resultion result a dependency resolution result for the subtree check. + assertNull( "Expected root artifact resolution result.", root.getDependency() ); + final DefaultDependencyNode defaultNode = + new DefaultDependencyNode( new Dependency( root.getArtifact(), rootScope ) ); + + defaultNode.setChildren( root.getChildren() ); + + if ( optional != null ) + { + defaultNode.setOptional( optional ); + } + + return defaultNode; + } + + @Test + public void testVersionFilter() + throws Exception + { + session.setVersionFilter( new HighestVersionFilter() ); + CollectRequest request = new CollectRequest().setRoot( newDep( "gid:aid:1" ) ); + CollectResult result = collector.collectDependencies( session, request ); + assertEquals( 1, result.getRoot().getChildren().size() ); + } + + + @Test + public void testDescriptorDependenciesEmpty() + throws Exception + { + collector.setArtifactDescriptorReader( newReader( "dependencies-empty/" ) ); + + session.setDependencyGraphTransformer( new ConflictResolver( + new NearestVersionSelector(), new JavaScopeSelector(), new SimpleOptionalitySelector(), + new JavaScopeDeriver() + ) ); + + + DependencyNode root = parser.parseResource( "expectedSubtreeOnDescriptorDependenciesEmptyLeft.txt" ); + Dependency dependency = root.getDependency(); + CollectRequest request = new CollectRequest( dependency, singletonList( repository ) ); + CollectResult result = collector.collectDependencies( session, request ); + assertEqualSubtree( root, result.getRoot() ); + + root = parser.parseResource( "expectedSubtreeOnDescriptorDependenciesEmptyRight.txt" ); + dependency = root.getDependency(); + request = new CollectRequest( dependency, singletonList( repository ) ); + result = collector.collectDependencies( session, request ); + assertEqualSubtree( root, result.getRoot() ); + } + + static class TestDependencyManager + implements DependencyManager + { + + private final Map versions = new HashMap<>(); + + private final Map scopes = new HashMap<>(); + + private final Map optionals = new HashMap<>(); + + private final Map paths = new HashMap<>(); + + private final Map> exclusions = new HashMap<>(); + + public void add( Dependency d, String version, String scope, String localPath ) + { + String id = toKey( d ); + version( id, version ); + scope( id, scope ); + path( id, localPath ); + } + + public void version( String id, String version ) + { + versions.put( id, version ); + } + + public void scope( String id, String scope ) + { + scopes.put( id, scope ); + } + + public void optional( String id, Boolean optional ) + { + optionals.put( id, optional ); + } + + public void path( String id, String path ) + { + paths.put( id, path ); + } + + public void exclusions( String id, Exclusion... exclusions ) + { + this.exclusions.put( id, exclusions != null ? Arrays.asList( exclusions ) : null ); + } + + @Override + public DependencyManagement manageDependency( Dependency dependency ) + { + requireNonNull( dependency, "dependency cannot be null" ); + String id = toKey( dependency ); + DependencyManagement mgmt = new DependencyManagement(); + mgmt.setVersion( versions.get( id ) ); + mgmt.setScope( scopes.get( id ) ); + mgmt.setOptional( optionals.get( id ) ); + String path = paths.get( id ); + if ( path != null ) + { + mgmt.setProperties( Collections.singletonMap( ArtifactProperties.LOCAL_PATH, path ) ); + } + mgmt.setExclusions( exclusions.get( id ) ); + return mgmt; + } + + private String toKey( Dependency dependency ) + { + return ArtifactIdUtils.toVersionlessId( dependency.getArtifact() ); + } + + @Override + public DependencyManager deriveChildManager( DependencyCollectionContext context ) + { + requireNonNull( context, "context cannot be null" ); + return this; + } + + } + +} diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java index 5a7487e8b..6f3ea1dcc 100644 --- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java +++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java @@ -19,669 +19,94 @@ * under the License. */ -import java.io.IOException; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; import java.util.List; -import java.util.Map; +import java.util.concurrent.ArrayBlockingQueue; -import org.eclipse.aether.DefaultRepositorySystemSession; -import org.eclipse.aether.RepositorySystemSession; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.ArtifactProperties; import org.eclipse.aether.artifact.DefaultArtifact; import org.eclipse.aether.collection.CollectRequest; import org.eclipse.aether.collection.CollectResult; -import org.eclipse.aether.collection.DependencyCollectionContext; import org.eclipse.aether.collection.DependencyCollectionException; -import org.eclipse.aether.collection.DependencyManagement; -import org.eclipse.aether.collection.DependencyManager; -import org.eclipse.aether.graph.DefaultDependencyNode; import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.graph.DependencyCycle; -import org.eclipse.aether.graph.DependencyNode; import org.eclipse.aether.graph.Exclusion; -import org.eclipse.aether.impl.ArtifactDescriptorReader; -import org.eclipse.aether.internal.impl.IniArtifactDescriptorReader; import org.eclipse.aether.internal.impl.StubRemoteRepositoryManager; import org.eclipse.aether.internal.impl.StubVersionRangeResolver; +import org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegateTestSupport; import org.eclipse.aether.internal.test.util.DependencyGraphParser; -import org.eclipse.aether.internal.test.util.TestUtils; -import org.eclipse.aether.repository.RemoteRepository; -import org.eclipse.aether.resolution.ArtifactDescriptorException; -import org.eclipse.aether.resolution.ArtifactDescriptorRequest; -import org.eclipse.aether.resolution.ArtifactDescriptorResult; -import org.eclipse.aether.util.artifact.ArtifactIdUtils; -import org.eclipse.aether.util.graph.manager.ClassicDependencyManager; -import org.eclipse.aether.util.graph.manager.DefaultDependencyManager; -import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; import org.eclipse.aether.util.graph.manager.TransitiveDependencyManager; -import org.eclipse.aether.util.graph.transformer.ConflictResolver; -import org.eclipse.aether.util.graph.transformer.JavaScopeDeriver; -import org.eclipse.aether.util.graph.transformer.JavaScopeSelector; -import org.eclipse.aether.util.graph.transformer.NearestVersionSelector; -import org.eclipse.aether.util.graph.transformer.SimpleOptionalitySelector; -import org.eclipse.aether.util.graph.version.HighestVersionFilter; -import org.junit.Before; +import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector; +import org.junit.Assume; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; -import static java.util.Objects.requireNonNull; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; /** + * UT for {@link BfDependencyCollector}. */ -public class BfDependencyCollectorTest +@RunWith( Parameterized.class ) +public class BfDependencyCollectorTest extends DependencyCollectorDelegateTestSupport { - - protected BfDependencyCollector collector; - - protected DefaultRepositorySystemSession session; - - protected DependencyGraphParser parser; - - protected RemoteRepository repository; - - protected IniArtifactDescriptorReader newReader( String prefix ) + @Parameterized.Parameters + public static List parameters() { - return new IniArtifactDescriptorReader( "artifact-descriptions/" + prefix ); + return Arrays.asList( Boolean.TRUE, Boolean.FALSE ); } - protected Dependency newDep( String coords ) - { - return newDep( coords, "" ); - } - - protected Dependency newDep( String coords, String scope ) - { - return new Dependency( new DefaultArtifact( coords ), scope ); - } - - @Before - public void setup() - { - setupCollector( false ); - } + @Parameterized.Parameter + public boolean useSkipper; - public void setupCollector( boolean useSkipper ) + @Override + protected void setupCollector() { - session = TestUtils.newSession(); session.setConfigProperty( BfDependencyCollector.CONFIG_PROP_SKIPPER, useSkipper ); collector = new BfDependencyCollector(); collector.setArtifactDescriptorReader( newReader( "" ) ); collector.setVersionRangeResolver( new StubVersionRangeResolver() ); collector.setRemoteRepositoryManager( new StubRemoteRepositoryManager() ); - - parser = new DependencyGraphParser( "artifact-descriptions/" ); - - repository = new RemoteRepository.Builder( "id", "default", "file:///" ).build(); - } - - private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual ) - { - assertEqualSubtree( expected, actual, new LinkedList() ); - } - - private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual, - LinkedList parents ) - { - assertEquals( "path: " + parents, expected.getDependency(), actual.getDependency() ); - - if ( actual.getDependency() != null ) - { - Artifact artifact = actual.getDependency().getArtifact(); - for ( DependencyNode parent : parents ) - { - if ( parent.getDependency() != null && artifact.equals( parent.getDependency().getArtifact() ) ) - { - return; - } - } - } - - parents.addLast( expected ); - - assertEquals( "path: " + parents + ", expected: " + expected.getChildren() + ", actual: " - + actual.getChildren(), expected.getChildren().size(), actual.getChildren().size() ); - - Iterator iterator1 = expected.getChildren().iterator(); - Iterator iterator2 = actual.getChildren().iterator(); - - while ( iterator1.hasNext() ) - { - assertEqualSubtree( iterator1.next(), iterator2.next(), parents ); - } - - parents.removeLast(); - } - - protected Dependency dep( DependencyNode root, int... coords ) - { - return path( root, coords ).getDependency(); - } - - protected DependencyNode path( DependencyNode root, int... coords ) - { - try - { - DependencyNode node = root; - for ( int coord : coords ) - { - node = node.getChildren().get( coord ); - } - - return node; - } - catch ( IndexOutOfBoundsException | NullPointerException e ) - { - throw new IllegalArgumentException( "illegal coordinates for child", e ); - } - } - - @Test - public void testSimpleCollection() - throws DependencyCollectionException - { - Dependency dependency = newDep( "gid:aid:ext:ver", "compile" ); - CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) ); - CollectResult result = collector.collectDependencies( session, request ); - - assertEquals( 0, result.getExceptions().size() ); - - DependencyNode root = result.getRoot(); - Dependency newDependency = root.getDependency(); - - assertEquals( dependency, newDependency ); - assertEquals( dependency.getArtifact(), newDependency.getArtifact() ); - - assertEquals( 1, root.getChildren().size() ); - - Dependency expect = newDep( "gid:aid2:ext:ver", "compile" ); - assertEquals( expect, root.getChildren().get( 0 ).getDependency() ); } - @Test - public void testMissingDependencyDescription() + private Dependency newDep( String coords, String scope, Collection exclusions ) { - CollectRequest request = - new CollectRequest( newDep( "missing:description:ext:ver" ), Arrays.asList( repository ) ); - try - { - collector.collectDependencies( session, request ); - fail( "expected exception" ); - } - catch ( DependencyCollectionException e ) - { - CollectResult result = e.getResult(); - assertSame( request, result.getRequest() ); - assertNotNull( result.getExceptions() ); - assertEquals( 1, result.getExceptions().size() ); - - assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactDescriptorException ); - - assertEquals( request.getRoot(), result.getRoot().getDependency() ); - } + Dependency d = new Dependency( new DefaultArtifact( coords ), scope ); + return d.setExclusions( exclusions ); } @Test - public void testDuplicates() - throws DependencyCollectionException + public void testSkipperWithDifferentExclusion() throws DependencyCollectionException { - Dependency dependency = newDep( "duplicate:transitive:ext:dependency" ); - CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) ); - - CollectResult result = collector.collectDependencies( session, request ); - - assertEquals( 0, result.getExceptions().size() ); - - DependencyNode root = result.getRoot(); - Dependency newDependency = root.getDependency(); - - assertEquals( dependency, newDependency ); - assertEquals( dependency.getArtifact(), newDependency.getArtifact() ); - - assertEquals( 2, root.getChildren().size() ); - - Dependency dep = newDep( "gid:aid:ext:ver", "compile" ); - assertEquals( dep, dep( root, 0 ) ); - - dep = newDep( "gid:aid2:ext:ver", "compile" ); - assertEquals( dep, dep( root, 1 ) ); - assertEquals( dep, dep( root, 0, 0 ) ); - assertEquals( dep( root, 1 ), dep( root, 0, 0 ) ); - } - - @Test - public void testEqualSubtree() - throws IOException, DependencyCollectionException - { - DependencyNode root = parser.parseResource( "expectedSubtreeComparisonResult.txt" ); - Dependency dependency = root.getDependency(); - CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) ); - - CollectResult result = collector.collectDependencies( session, request ); - assertEqualSubtree( root, result.getRoot() ); - } - - @Test - public void testCyclicDependencies() - throws Exception - { - DependencyNode root = parser.parseResource( "cycle.txt" ); - CollectRequest request = new CollectRequest( root.getDependency(), Arrays.asList( repository ) ); - CollectResult result = collector.collectDependencies( session, request ); - assertEqualSubtree( root, result.getRoot() ); - } - - @Test - public void testCyclicDependenciesBig() - throws Exception - { - CollectRequest request = new CollectRequest( newDep( "1:2:pom:5.50-SNAPSHOT" ), Arrays.asList( repository ) ); - collector.setArtifactDescriptorReader( newReader( "cycle-big/" ) ); - CollectResult result = collector.collectDependencies( session, request ); - assertNotNull( result.getRoot() ); - // we only care about the performance here, this test must not hang or run out of mem - } - - @Test - public void testCyclicProjects() - throws Exception - { - CollectRequest request = new CollectRequest( newDep( "test:a:2" ), Arrays.asList( repository ) ); - collector.setArtifactDescriptorReader( newReader( "versionless-cycle/" ) ); - CollectResult result = collector.collectDependencies( session, request ); - DependencyNode root = result.getRoot(); - DependencyNode a1 = path( root, 0, 0 ); - assertEquals( "a", a1.getArtifact().getArtifactId() ); - assertEquals( "1", a1.getArtifact().getVersion() ); - for ( DependencyNode child : a1.getChildren() ) - { - assertNotEquals( "1", child.getArtifact().getVersion() ); - } - - assertEquals( 1, result.getCycles().size() ); - DependencyCycle cycle = result.getCycles().get( 0 ); - assertEquals( Arrays.asList(), cycle.getPrecedingDependencies() ); - assertEquals( Arrays.asList( root.getDependency(), path( root, 0 ).getDependency(), a1.getDependency() ), - cycle.getCyclicDependencies() ); - } - - @Test - public void testCyclicProjects_ConsiderLabelOfRootlessGraph() - throws Exception - { - Dependency dep = newDep( "gid:aid:ver", "compile" ); - CollectRequest request = - new CollectRequest().addDependency( dep ).addRepository( repository ).setRootArtifact( dep.getArtifact() ); - CollectResult result = collector.collectDependencies( session, request ); - DependencyNode root = result.getRoot(); - DependencyNode a1 = root.getChildren().get( 0 ); - assertEquals( "aid", a1.getArtifact().getArtifactId() ); - assertEquals( "ver", a1.getArtifact().getVersion() ); - DependencyNode a2 = a1.getChildren().get( 0 ); - assertEquals( "aid2", a2.getArtifact().getArtifactId() ); - assertEquals( "ver", a2.getArtifact().getVersion() ); - - assertEquals( 1, result.getCycles().size() ); - DependencyCycle cycle = result.getCycles().get( 0 ); - assertEquals( Arrays.asList(), cycle.getPrecedingDependencies() ); - assertEquals( Arrays.asList( new Dependency( dep.getArtifact(), null ), a1.getDependency() ), - cycle.getCyclicDependencies() ); - } - - @Test - public void testPartialResultOnError() - throws IOException - { - DependencyNode root = parser.parseResource( "expectedPartialSubtreeOnError.txt" ); - - Dependency dependency = root.getDependency(); - CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) ); - - CollectResult result; - try - { - result = collector.collectDependencies( session, request ); - fail( "expected exception " ); - } - catch ( DependencyCollectionException e ) - { - result = e.getResult(); - - assertSame( request, result.getRequest() ); - assertNotNull( result.getExceptions() ); - assertEquals( 1, result.getExceptions().size() ); - - assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactDescriptorException ); + Assume.assumeTrue( useSkipper ); + collector.setArtifactDescriptorReader( newReader( "managed/" ) ); + parser = new DependencyGraphParser( "artifact-descriptions/managed/" ); + session.setDependencyManager( new TransitiveDependencyManager() ); - assertEqualSubtree( root, result.getRoot() ); - } - } + ExclusionDependencySelector exclSel1 = new ExclusionDependencySelector(); + session.setDependencySelector( exclSel1 ); - @Test - public void testCollectMultipleDependencies() - throws DependencyCollectionException - { - Dependency root1 = newDep( "gid:aid:ext:ver", "compile" ); - Dependency root2 = newDep( "gid:aid2:ext:ver", "compile" ); + Dependency root1 = newDep( "gid:root:ext:ver", "compile", + Collections.singleton( new Exclusion( "gid", "transitive-1", "", "ext" ) ) ); + Dependency root2 = newDep( "gid:root:ext:ver", "compile", + Collections.singleton( new Exclusion( "gid", "transitive-2", "", "ext" ) ) ); List dependencies = Arrays.asList( root1, root2 ); + CollectRequest request = new CollectRequest( dependencies, null, Arrays.asList( repository ) ); - CollectResult result = collector.collectDependencies( session, request ); + request.addManagedDependency( newDep( "gid:direct:ext:managed-by-dominant-request" ) ); + request.addManagedDependency( newDep( "gid:transitive-1:ext:managed-by-root" ) ); + CollectResult result = collector.collectDependencies( session, request ); assertEquals( 0, result.getExceptions().size() ); assertEquals( 2, result.getRoot().getChildren().size() ); assertEquals( root1, dep( result.getRoot(), 0 ) ); - + assertEquals( root2, dep( result.getRoot(), 1 ) ); + //the winner has transitive-1 excluded assertEquals( 1, path( result.getRoot(), 0 ).getChildren().size() ); - assertEquals( root2, dep( result.getRoot(), 0, 0 ) ); - + assertEquals( 0, path( result.getRoot(), 0, 0 ).getChildren().size() ); + //skipped assertEquals( 0, path( result.getRoot(), 1 ).getChildren().size() ); - assertEquals( root2, dep( result.getRoot(), 1 ) ); - } - - @Test - public void testArtifactDescriptorResolutionNotRestrictedToRepoHostingSelectedVersion() - throws Exception - { - RemoteRepository repo2 = new RemoteRepository.Builder( "test", "default", "file:///" ).build(); - - final List repos = new ArrayList<>(); - - collector.setArtifactDescriptorReader( new ArtifactDescriptorReader() - { - public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session, - ArtifactDescriptorRequest request ) - { - repos.addAll( request.getRepositories() ); - return new ArtifactDescriptorResult( request ); - } - } ); - - List dependencies = Arrays.asList( newDep( "verrange:parent:jar:1[1,)", "compile" ) ); - CollectRequest request = new CollectRequest( dependencies, null, Arrays.asList( repository, repo2 ) ); - CollectResult result = collector.collectDependencies( session, request ); - - assertEquals( 0, result.getExceptions().size() ); - assertEquals( 2, repos.size() ); - assertEquals( "id", repos.get( 0 ).getId() ); - assertEquals( "test", repos.get( 1 ).getId() ); - } - - @Test - public void testManagedVersionScope() - throws DependencyCollectionException - { - Dependency dependency = newDep( "managed:aid:ext:ver" ); - CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) ); - - session.setDependencyManager( new ClassicDependencyManager() ); - - CollectResult result = collector.collectDependencies( session, request ); - - assertEquals( 0, result.getExceptions().size() ); - - DependencyNode root = result.getRoot(); - - assertEquals( dependency, dep( root ) ); - assertEquals( dependency.getArtifact(), dep( root ).getArtifact() ); - - assertEquals( 1, root.getChildren().size() ); - Dependency expect = newDep( "gid:aid:ext:ver", "compile" ); - assertEquals( expect, dep( root, 0 ) ); - - assertEquals( 1, path( root, 0 ).getChildren().size() ); - expect = newDep( "gid:aid2:ext:managedVersion", "managedScope" ); - assertEquals( expect, dep( root, 0, 0 ) ); - } - - @Test - public void testDependencyManagement() - throws IOException, DependencyCollectionException - { - collector.setArtifactDescriptorReader( newReader( "managed/" ) ); - - DependencyNode root = parser.parseResource( "expectedSubtreeComparisonResult.txt" ); - TestDependencyManager depMgmt = new TestDependencyManager(); - depMgmt.add( dep( root, 0 ), "managed", null, null ); - depMgmt.add( dep( root, 0, 1 ), "managed", "managed", null ); - depMgmt.add( dep( root, 1 ), null, null, "managed" ); - session.setDependencyManager( depMgmt ); - - // collect result will differ from expectedSubtreeComparisonResult.txt - // set localPath -> no dependency traversal - CollectRequest request = new CollectRequest( dep( root ), Arrays.asList( repository ) ); - CollectResult result = collector.collectDependencies( session, request ); - - DependencyNode node = result.getRoot(); - assertEquals( "managed", dep( node, 0, 1 ).getArtifact().getVersion() ); - assertEquals( "managed", dep( node, 0, 1 ).getScope() ); - - assertEquals( "managed", dep( node, 1 ).getArtifact().getProperty( ArtifactProperties.LOCAL_PATH, null ) ); - assertEquals( "managed", dep( node, 0, 0 ).getArtifact().getProperty( ArtifactProperties.LOCAL_PATH, null ) ); - } - - @Test - public void testDependencyManagement_VerboseMode() - throws Exception - { - String depId = "gid:aid2:ext"; - TestDependencyManager depMgmt = new TestDependencyManager(); - depMgmt.version( depId, "managedVersion" ); - depMgmt.scope( depId, "managedScope" ); - depMgmt.optional( depId, Boolean.TRUE ); - depMgmt.path( depId, "managedPath" ); - depMgmt.exclusions( depId, new Exclusion( "gid", "aid", "*", "*" ) ); - session.setDependencyManager( depMgmt ); - session.setConfigProperty( DependencyManagerUtils.CONFIG_PROP_VERBOSE, Boolean.TRUE ); - - CollectRequest request = new CollectRequest().setRoot( newDep( "gid:aid:ver" ) ); - CollectResult result = collector.collectDependencies( session, request ); - DependencyNode node = result.getRoot().getChildren().get( 0 ); - assertEquals( DependencyNode.MANAGED_VERSION | DependencyNode.MANAGED_SCOPE | DependencyNode.MANAGED_OPTIONAL - | DependencyNode.MANAGED_PROPERTIES | DependencyNode.MANAGED_EXCLUSIONS, node.getManagedBits() ); - assertEquals( "ver", DependencyManagerUtils.getPremanagedVersion( node ) ); - assertEquals( "compile", DependencyManagerUtils.getPremanagedScope( node ) ); - assertEquals( Boolean.FALSE, DependencyManagerUtils.getPremanagedOptional( node ) ); - } - - @Test - public void testDependencyManagement_TransitiveDependencyManager() - throws DependencyCollectionException, IOException - { - collector.setArtifactDescriptorReader( newReader( "managed/" ) ); - parser = new DependencyGraphParser( "artifact-descriptions/managed/" ); - session.setDependencyManager( new TransitiveDependencyManager() ); - final Dependency root = newDep( "gid:root:ext:ver", "compile" ); - CollectRequest request = new CollectRequest( root, Collections.singletonList( repository ) ); - request.addManagedDependency( newDep( "gid:root:ext:must-retain-core-management" ) ); - CollectResult result = collector.collectDependencies( session, request ); - - final DependencyNode expectedTree = parser.parseResource( "management-tree.txt" ); - assertEqualSubtree( expectedTree, result.getRoot() ); - - // Same test for root artifact (POM) request. - final CollectRequest rootArtifactRequest = new CollectRequest(); - rootArtifactRequest.setRepositories( Collections.singletonList( repository ) ); - rootArtifactRequest.setRootArtifact( new DefaultArtifact( "gid:root:ext:ver" ) ); - rootArtifactRequest.addDependency( newDep( "gid:direct:ext:ver", "compile" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:root:ext:must-retain-core-management" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:direct:ext:must-retain-core-management" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:transitive-1:ext:managed-by-root" ) ); - session.setDependencyManager( new TransitiveDependencyManager() ); - result = collector.collectDependencies( session, rootArtifactRequest ); - assertEqualSubtree( expectedTree, toDependencyResult( result.getRoot(), "compile", null ) ); - } - - @Test - public void testDependencyManagement_DefaultDependencyManager() - throws DependencyCollectionException, IOException - { - collector.setArtifactDescriptorReader( newReader( "managed/" ) ); - parser = new DependencyGraphParser( "artifact-descriptions/managed/" ); - session.setDependencyManager( new DefaultDependencyManager() ); - final Dependency root = newDep( "gid:root:ext:ver", "compile" ); - CollectRequest request = new CollectRequest( root, Arrays.asList( repository ) ); - request.addManagedDependency( newDep( "gid:root:ext:must-not-manage-root" ) ); - request.addManagedDependency( newDep( "gid:direct:ext:managed-by-dominant-request" ) ); - CollectResult result = collector.collectDependencies( session, request ); - - final DependencyNode expectedTree = parser.parseResource( "default-management-tree.txt" ); - assertEqualSubtree( expectedTree, result.getRoot() ); - - // Same test for root artifact (POM) request. - final CollectRequest rootArtifactRequest = new CollectRequest(); - rootArtifactRequest.setRepositories( Arrays.asList( repository ) ); - rootArtifactRequest.setRootArtifact( new DefaultArtifact( "gid:root:ext:ver" ) ); - rootArtifactRequest.addDependency( newDep( "gid:direct:ext:ver", "compile" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:root:ext:must-not-manage-root" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:direct:ext:managed-by-dominant-request" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:transitive-1:ext:managed-by-root" ) ); - session.setDependencyManager( new DefaultDependencyManager() ); - result = collector.collectDependencies( session, rootArtifactRequest ); - assertEqualSubtree( expectedTree, toDependencyResult( result.getRoot(), "compile", null ) ); - } - - private DependencyNode toDependencyResult( final DependencyNode root, final String rootScope, - final Boolean optional ) - { - // Make the root artifact resultion result a dependency resolution result for the subtree check. - assertNull( "Expected root artifact resolution result.", root.getDependency() ); - final DefaultDependencyNode defaultNode = - new DefaultDependencyNode( new Dependency( root.getArtifact(), rootScope ) ); - - defaultNode.setChildren( root.getChildren() ); - - if ( optional != null ) - { - defaultNode.setOptional( optional ); - } - - return defaultNode; - } - - @Test - public void testVersionFilter() - throws Exception - { - session.setVersionFilter( new HighestVersionFilter() ); - CollectRequest request = new CollectRequest().setRoot( newDep( "gid:aid:1" ) ); - CollectResult result = collector.collectDependencies( session, request ); - assertEquals( 1, result.getRoot().getChildren().size() ); - } - - - @Test - public void testDescriptorDependenciesEmpty() - throws Exception - { - collector.setArtifactDescriptorReader(newReader("dependencies-empty/")); - - session.setDependencyGraphTransformer(new ConflictResolver( - new NearestVersionSelector(), new JavaScopeSelector(), new SimpleOptionalitySelector(), - new JavaScopeDeriver() - )); - - - DependencyNode root = parser.parseResource("expectedSubtreeOnDescriptorDependenciesEmptyLeft.txt"); - Dependency dependency = root.getDependency(); - CollectRequest request = new CollectRequest(dependency, Arrays.asList(repository)); - CollectResult result = collector.collectDependencies(session, request); - assertEqualSubtree(root, result.getRoot()); - - root = parser.parseResource("expectedSubtreeOnDescriptorDependenciesEmptyRight.txt"); - dependency = root.getDependency(); - request = new CollectRequest(dependency, Arrays.asList(repository)); - result = collector.collectDependencies(session, request); - assertEqualSubtree(root, result.getRoot()); - } - - static class TestDependencyManager - implements DependencyManager - { - - private Map versions = new HashMap<>(); - - private Map scopes = new HashMap<>(); - - private Map optionals = new HashMap<>(); - - private Map paths = new HashMap<>(); - - private Map> exclusions = new HashMap<>(); - - public void add( Dependency d, String version, String scope, String localPath ) - { - String id = toKey( d ); - version( id, version ); - scope( id, scope ); - path( id, localPath ); - } - - public void version( String id, String version ) - { - versions.put( id, version ); - } - - public void scope( String id, String scope ) - { - scopes.put( id, scope ); - } - - public void optional( String id, Boolean optional ) - { - optionals.put( id, optional ); - } - - public void path( String id, String path ) - { - paths.put( id, path ); - } - - public void exclusions( String id, Exclusion... exclusions ) - { - this.exclusions.put( id, exclusions != null ? Arrays.asList( exclusions ) : null ); - } - - public DependencyManagement manageDependency( Dependency dependency ) - { - requireNonNull( dependency, "dependency cannot be null" ); - String id = toKey( dependency ); - DependencyManagement mgmt = new DependencyManagement(); - mgmt.setVersion( versions.get( id ) ); - mgmt.setScope( scopes.get( id ) ); - mgmt.setOptional( optionals.get( id ) ); - String path = paths.get( id ); - if ( path != null ) - { - mgmt.setProperties( Collections.singletonMap( ArtifactProperties.LOCAL_PATH, path ) ); - } - mgmt.setExclusions( exclusions.get( id ) ); - return mgmt; - } - - private String toKey( Dependency dependency ) - { - return ArtifactIdUtils.toVersionlessId( dependency.getArtifact() ); - } - - public DependencyManager deriveChildManager( DependencyCollectionContext context ) - { - requireNonNull( context, "context cannot be null" ); - return this; - } - } } diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorUseSkipTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorUseSkipTest.java deleted file mode 100644 index 5daa678b5..000000000 --- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorUseSkipTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.eclipse.aether.internal.impl.collect.bf; -/* - * 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. - */ - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.collection.CollectRequest; -import org.eclipse.aether.collection.CollectResult; -import org.eclipse.aether.collection.DependencyCollectionException; -import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.graph.Exclusion; -import org.eclipse.aether.internal.test.util.DependencyGraphParser; -import org.eclipse.aether.util.graph.manager.TransitiveDependencyManager; -import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class BfDependencyCollectorUseSkipTest extends BfDependencyCollectorTest -{ - - private Dependency newDep( String coords, String scope, Collection exclusions ) - { - Dependency d = new Dependency( new DefaultArtifact( coords ), scope ); - return d.setExclusions( exclusions ); - } - - @Override - public void setup() - { - super.setupCollector( true ); - } - - @Test - public void testSkipperWithDifferentExclusion() throws DependencyCollectionException - { - collector.setArtifactDescriptorReader( newReader( "managed/" ) ); - parser = new DependencyGraphParser( "artifact-descriptions/managed/" ); - session.setDependencyManager( new TransitiveDependencyManager() ); - - ExclusionDependencySelector exclSel1 = new ExclusionDependencySelector(); - session.setDependencySelector( exclSel1 ); - - Dependency root1 = newDep( "gid:root:ext:ver", "compile", - Collections.singleton( new Exclusion( "gid", "transitive-1", "", "ext" ) ) ); - Dependency root2 = newDep( "gid:root:ext:ver", "compile", - Collections.singleton( new Exclusion( "gid", "transitive-2", "", "ext" ) ) ); - List dependencies = Arrays.asList( root1, root2 ); - - CollectRequest request = new CollectRequest( dependencies, null, Arrays.asList( repository ) ); - request.addManagedDependency( newDep( "gid:direct:ext:managed-by-dominant-request" ) ); - request.addManagedDependency( newDep( "gid:transitive-1:ext:managed-by-root" ) ); - - CollectResult result = collector.collectDependencies( session, request ); - assertEquals( 0, result.getExceptions().size() ); - assertEquals( 2, result.getRoot().getChildren().size() ); - assertEquals( root1, dep( result.getRoot(), 0 ) ); - assertEquals( root2, dep( result.getRoot(), 1 ) ); - //the winner has transitive-1 excluded - assertEquals( 1, path( result.getRoot(), 0 ).getChildren().size() ); - assertEquals( 0, path( result.getRoot(), 0, 0 ).getChildren().size() ); - //skipped - assertEquals( 0, path( result.getRoot(), 1 ).getChildren().size() ); - } - -} diff --git a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollectorTest.java b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollectorTest.java index b641bbd64..131e24c41 100644 --- a/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollectorTest.java +++ b/maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollectorTest.java @@ -18,632 +18,22 @@ * specific language governing permissions and limitations * under the License. */ -import static java.util.Objects.requireNonNull; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import org.eclipse.aether.DefaultRepositorySystemSession; -import org.eclipse.aether.RepositorySystemSession; -import org.eclipse.aether.artifact.Artifact; -import org.eclipse.aether.artifact.ArtifactProperties; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.collection.CollectRequest; -import org.eclipse.aether.collection.CollectResult; -import org.eclipse.aether.collection.DependencyCollectionContext; -import org.eclipse.aether.collection.DependencyCollectionException; -import org.eclipse.aether.collection.DependencyManagement; -import org.eclipse.aether.collection.DependencyManager; -import org.eclipse.aether.graph.DefaultDependencyNode; -import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.graph.DependencyCycle; -import org.eclipse.aether.graph.DependencyNode; -import org.eclipse.aether.graph.Exclusion; -import org.eclipse.aether.impl.ArtifactDescriptorReader; -import org.eclipse.aether.internal.impl.IniArtifactDescriptorReader; import org.eclipse.aether.internal.impl.StubRemoteRepositoryManager; import org.eclipse.aether.internal.impl.StubVersionRangeResolver; -import org.eclipse.aether.internal.test.util.DependencyGraphParser; -import org.eclipse.aether.internal.test.util.TestUtils; -import org.eclipse.aether.repository.RemoteRepository; -import org.eclipse.aether.resolution.ArtifactDescriptorException; -import org.eclipse.aether.resolution.ArtifactDescriptorRequest; -import org.eclipse.aether.resolution.ArtifactDescriptorResult; -import org.eclipse.aether.util.artifact.ArtifactIdUtils; -import org.eclipse.aether.util.graph.manager.ClassicDependencyManager; -import org.eclipse.aether.util.graph.manager.DefaultDependencyManager; -import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; -import org.eclipse.aether.util.graph.manager.TransitiveDependencyManager; -import org.eclipse.aether.util.graph.version.HighestVersionFilter; -import org.junit.Before; -import org.junit.Test; +import org.eclipse.aether.internal.impl.collect.DependencyCollectorDelegateTestSupport; /** + * UT for {@link DfDependencyCollector}. */ -public class DfDependencyCollectorTest +public class DfDependencyCollectorTest extends DependencyCollectorDelegateTestSupport { - - private DfDependencyCollector collector; - - private DefaultRepositorySystemSession session; - - private DependencyGraphParser parser; - - private RemoteRepository repository; - - private IniArtifactDescriptorReader newReader( String prefix ) - { - return new IniArtifactDescriptorReader( "artifact-descriptions/" + prefix ); - } - - private Dependency newDep( String coords ) - { - return newDep( coords, "" ); - } - - private Dependency newDep( String coords, String scope ) - { - return new Dependency( new DefaultArtifact( coords ), scope ); - } - - @Before - public void setup() + @Override + protected void setupCollector() { - session = TestUtils.newSession(); - collector = new DfDependencyCollector(); collector.setArtifactDescriptorReader( newReader( "" ) ); collector.setVersionRangeResolver( new StubVersionRangeResolver() ); collector.setRemoteRepositoryManager( new StubRemoteRepositoryManager() ); - - parser = new DependencyGraphParser( "artifact-descriptions/" ); - - repository = new RemoteRepository.Builder( "id", "default", "file:///" ).build(); - } - - private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual ) - { - assertEqualSubtree( expected, actual, new LinkedList() ); - } - - private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual, - LinkedList parents ) - { - assertEquals( "path: " + parents, expected.getDependency(), actual.getDependency() ); - - if ( actual.getDependency() != null ) - { - Artifact artifact = actual.getDependency().getArtifact(); - for ( DependencyNode parent : parents ) - { - if ( parent.getDependency() != null && artifact.equals( parent.getDependency().getArtifact() ) ) - { - return; - } - } - } - - parents.addLast( expected ); - - assertEquals( "path: " + parents + ", expected: " + expected.getChildren() + ", actual: " - + actual.getChildren(), expected.getChildren().size(), actual.getChildren().size() ); - - Iterator iterator1 = expected.getChildren().iterator(); - Iterator iterator2 = actual.getChildren().iterator(); - - while ( iterator1.hasNext() ) - { - assertEqualSubtree( iterator1.next(), iterator2.next(), parents ); - } - - parents.removeLast(); - } - - private Dependency dep( DependencyNode root, int... coords ) - { - return path( root, coords ).getDependency(); - } - - private DependencyNode path( DependencyNode root, int... coords ) - { - try - { - DependencyNode node = root; - for ( int coord : coords ) - { - node = node.getChildren().get( coord ); - } - - return node; - } - catch ( IndexOutOfBoundsException | NullPointerException e ) - { - throw new IllegalArgumentException( "illegal coordinates for child", e ); - } - } - - @Test - public void testSimpleCollection() - throws DependencyCollectionException - { - Dependency dependency = newDep( "gid:aid:ext:ver", "compile" ); - CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) ); - CollectResult result = collector.collectDependencies( session, request ); - - assertEquals( 0, result.getExceptions().size() ); - - DependencyNode root = result.getRoot(); - Dependency newDependency = root.getDependency(); - - assertEquals( dependency, newDependency ); - assertEquals( dependency.getArtifact(), newDependency.getArtifact() ); - - assertEquals( 1, root.getChildren().size() ); - - Dependency expect = newDep( "gid:aid2:ext:ver", "compile" ); - assertEquals( expect, root.getChildren().get( 0 ).getDependency() ); - } - - @Test - public void testMissingDependencyDescription() - { - CollectRequest request = - new CollectRequest( newDep( "missing:description:ext:ver" ), Arrays.asList( repository ) ); - try - { - collector.collectDependencies( session, request ); - fail( "expected exception" ); - } - catch ( DependencyCollectionException e ) - { - CollectResult result = e.getResult(); - assertSame( request, result.getRequest() ); - assertNotNull( result.getExceptions() ); - assertEquals( 1, result.getExceptions().size() ); - - assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactDescriptorException ); - - assertEquals( request.getRoot(), result.getRoot().getDependency() ); - } - } - - @Test - public void testDuplicates() - throws DependencyCollectionException - { - Dependency dependency = newDep( "duplicate:transitive:ext:dependency" ); - CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) ); - - CollectResult result = collector.collectDependencies( session, request ); - - assertEquals( 0, result.getExceptions().size() ); - - DependencyNode root = result.getRoot(); - Dependency newDependency = root.getDependency(); - - assertEquals( dependency, newDependency ); - assertEquals( dependency.getArtifact(), newDependency.getArtifact() ); - - assertEquals( 2, root.getChildren().size() ); - - Dependency dep = newDep( "gid:aid:ext:ver", "compile" ); - assertEquals( dep, dep( root, 0 ) ); - - dep = newDep( "gid:aid2:ext:ver", "compile" ); - assertEquals( dep, dep( root, 1 ) ); - assertEquals( dep, dep( root, 0, 0 ) ); - assertEquals( dep( root, 1 ), dep( root, 0, 0 ) ); - } - - @Test - public void testEqualSubtree() - throws IOException, DependencyCollectionException - { - DependencyNode root = parser.parseResource( "expectedSubtreeComparisonResult.txt" ); - Dependency dependency = root.getDependency(); - CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) ); - - CollectResult result = collector.collectDependencies( session, request ); - assertEqualSubtree( root, result.getRoot() ); - } - - @Test - public void testCyclicDependencies() - throws Exception - { - DependencyNode root = parser.parseResource( "cycle.txt" ); - CollectRequest request = new CollectRequest( root.getDependency(), Arrays.asList( repository ) ); - CollectResult result = collector.collectDependencies( session, request ); - assertEqualSubtree( root, result.getRoot() ); - } - - @Test - public void testCyclicDependenciesBig() - throws Exception - { - CollectRequest request = new CollectRequest( newDep( "1:2:pom:5.50-SNAPSHOT" ), Arrays.asList( repository ) ); - collector.setArtifactDescriptorReader( newReader( "cycle-big/" ) ); - CollectResult result = collector.collectDependencies( session, request ); - assertNotNull( result.getRoot() ); - // we only care about the performance here, this test must not hang or run out of mem - } - - @Test - public void testCyclicProjects() - throws Exception - { - CollectRequest request = new CollectRequest( newDep( "test:a:2" ), Arrays.asList( repository ) ); - collector.setArtifactDescriptorReader( newReader( "versionless-cycle/" ) ); - CollectResult result = collector.collectDependencies( session, request ); - DependencyNode root = result.getRoot(); - DependencyNode a1 = path( root, 0, 0 ); - assertEquals( "a", a1.getArtifact().getArtifactId() ); - assertEquals( "1", a1.getArtifact().getVersion() ); - for ( DependencyNode child : a1.getChildren() ) - { - assertNotEquals( "1", child.getArtifact().getVersion() ); - } - - assertEquals( 1, result.getCycles().size() ); - DependencyCycle cycle = result.getCycles().get( 0 ); - assertEquals( Arrays.asList(), cycle.getPrecedingDependencies() ); - assertEquals( Arrays.asList( root.getDependency(), path( root, 0 ).getDependency(), a1.getDependency() ), - cycle.getCyclicDependencies() ); - } - - @Test - public void testCyclicProjects_ConsiderLabelOfRootlessGraph() - throws Exception - { - Dependency dep = newDep( "gid:aid:ver", "compile" ); - CollectRequest request = - new CollectRequest().addDependency( dep ).addRepository( repository ).setRootArtifact( dep.getArtifact() ); - CollectResult result = collector.collectDependencies( session, request ); - DependencyNode root = result.getRoot(); - DependencyNode a1 = root.getChildren().get( 0 ); - assertEquals( "aid", a1.getArtifact().getArtifactId() ); - assertEquals( "ver", a1.getArtifact().getVersion() ); - DependencyNode a2 = a1.getChildren().get( 0 ); - assertEquals( "aid2", a2.getArtifact().getArtifactId() ); - assertEquals( "ver", a2.getArtifact().getVersion() ); - - assertEquals( 1, result.getCycles().size() ); - DependencyCycle cycle = result.getCycles().get( 0 ); - assertEquals( Arrays.asList(), cycle.getPrecedingDependencies() ); - assertEquals( Arrays.asList( new Dependency( dep.getArtifact(), null ), a1.getDependency() ), - cycle.getCyclicDependencies() ); - } - - @Test - public void testPartialResultOnError() - throws IOException - { - DependencyNode root = parser.parseResource( "expectedPartialSubtreeOnError.txt" ); - - Dependency dependency = root.getDependency(); - CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) ); - - CollectResult result; - try - { - result = collector.collectDependencies( session, request ); - fail( "expected exception " ); - } - catch ( DependencyCollectionException e ) - { - result = e.getResult(); - - assertSame( request, result.getRequest() ); - assertNotNull( result.getExceptions() ); - assertEquals( 1, result.getExceptions().size() ); - - assertTrue( result.getExceptions().get( 0 ) instanceof ArtifactDescriptorException ); - - assertEqualSubtree( root, result.getRoot() ); - } - } - - @Test - public void testCollectMultipleDependencies() - throws DependencyCollectionException - { - Dependency root1 = newDep( "gid:aid:ext:ver", "compile" ); - Dependency root2 = newDep( "gid:aid2:ext:ver", "compile" ); - List dependencies = Arrays.asList( root1, root2 ); - CollectRequest request = new CollectRequest( dependencies, null, Arrays.asList( repository ) ); - CollectResult result = collector.collectDependencies( session, request ); - - assertEquals( 0, result.getExceptions().size() ); - assertEquals( 2, result.getRoot().getChildren().size() ); - assertEquals( root1, dep( result.getRoot(), 0 ) ); - - assertEquals( 1, path( result.getRoot(), 0 ).getChildren().size() ); - assertEquals( root2, dep( result.getRoot(), 0, 0 ) ); - - assertEquals( 0, path( result.getRoot(), 1 ).getChildren().size() ); - assertEquals( root2, dep( result.getRoot(), 1 ) ); - } - - @Test - public void testArtifactDescriptorResolutionNotRestrictedToRepoHostingSelectedVersion() - throws Exception - { - RemoteRepository repo2 = new RemoteRepository.Builder( "test", "default", "file:///" ).build(); - - final List repos = new ArrayList<>(); - - collector.setArtifactDescriptorReader( new ArtifactDescriptorReader() - { - public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session, - ArtifactDescriptorRequest request ) - { - repos.addAll( request.getRepositories() ); - return new ArtifactDescriptorResult( request ); - } - } ); - - List dependencies = Arrays.asList( newDep( "verrange:parent:jar:1[1,)", "compile" ) ); - CollectRequest request = new CollectRequest( dependencies, null, Arrays.asList( repository, repo2 ) ); - CollectResult result = collector.collectDependencies( session, request ); - - assertEquals( 0, result.getExceptions().size() ); - assertEquals( 2, repos.size() ); - assertEquals( "id", repos.get( 0 ).getId() ); - assertEquals( "test", repos.get( 1 ).getId() ); } - - @Test - public void testManagedVersionScope() - throws DependencyCollectionException - { - Dependency dependency = newDep( "managed:aid:ext:ver" ); - CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) ); - - session.setDependencyManager( new ClassicDependencyManager() ); - - CollectResult result = collector.collectDependencies( session, request ); - - assertEquals( 0, result.getExceptions().size() ); - - DependencyNode root = result.getRoot(); - - assertEquals( dependency, dep( root ) ); - assertEquals( dependency.getArtifact(), dep( root ).getArtifact() ); - - assertEquals( 1, root.getChildren().size() ); - Dependency expect = newDep( "gid:aid:ext:ver", "compile" ); - assertEquals( expect, dep( root, 0 ) ); - - assertEquals( 1, path( root, 0 ).getChildren().size() ); - expect = newDep( "gid:aid2:ext:managedVersion", "managedScope" ); - assertEquals( expect, dep( root, 0, 0 ) ); - } - - @Test - public void testDependencyManagement() - throws IOException, DependencyCollectionException - { - collector.setArtifactDescriptorReader( newReader( "managed/" ) ); - - DependencyNode root = parser.parseResource( "expectedSubtreeComparisonResult.txt" ); - TestDependencyManager depMgmt = new TestDependencyManager(); - depMgmt.add( dep( root, 0 ), "managed", null, null ); - depMgmt.add( dep( root, 0, 1 ), "managed", "managed", null ); - depMgmt.add( dep( root, 1 ), null, null, "managed" ); - session.setDependencyManager( depMgmt ); - - // collect result will differ from expectedSubtreeComparisonResult.txt - // set localPath -> no dependency traversal - CollectRequest request = new CollectRequest( dep( root ), Arrays.asList( repository ) ); - CollectResult result = collector.collectDependencies( session, request ); - - DependencyNode node = result.getRoot(); - assertEquals( "managed", dep( node, 0, 1 ).getArtifact().getVersion() ); - assertEquals( "managed", dep( node, 0, 1 ).getScope() ); - - assertEquals( "managed", dep( node, 1 ).getArtifact().getProperty( ArtifactProperties.LOCAL_PATH, null ) ); - assertEquals( "managed", dep( node, 0, 0 ).getArtifact().getProperty( ArtifactProperties.LOCAL_PATH, null ) ); - } - - @Test - public void testDependencyManagement_VerboseMode() - throws Exception - { - String depId = "gid:aid2:ext"; - TestDependencyManager depMgmt = new TestDependencyManager(); - depMgmt.version( depId, "managedVersion" ); - depMgmt.scope( depId, "managedScope" ); - depMgmt.optional( depId, Boolean.TRUE ); - depMgmt.path( depId, "managedPath" ); - depMgmt.exclusions( depId, new Exclusion( "gid", "aid", "*", "*" ) ); - session.setDependencyManager( depMgmt ); - session.setConfigProperty( DependencyManagerUtils.CONFIG_PROP_VERBOSE, Boolean.TRUE ); - - CollectRequest request = new CollectRequest().setRoot( newDep( "gid:aid:ver" ) ); - CollectResult result = collector.collectDependencies( session, request ); - DependencyNode node = result.getRoot().getChildren().get( 0 ); - assertEquals( DependencyNode.MANAGED_VERSION | DependencyNode.MANAGED_SCOPE | DependencyNode.MANAGED_OPTIONAL - | DependencyNode.MANAGED_PROPERTIES | DependencyNode.MANAGED_EXCLUSIONS, node.getManagedBits() ); - assertEquals( "ver", DependencyManagerUtils.getPremanagedVersion( node ) ); - assertEquals( "compile", DependencyManagerUtils.getPremanagedScope( node ) ); - assertEquals( Boolean.FALSE, DependencyManagerUtils.getPremanagedOptional( node ) ); - } - - @Test - public void testDependencyManagement_TransitiveDependencyManager() - throws DependencyCollectionException, IOException - { - collector.setArtifactDescriptorReader( newReader( "managed/" ) ); - parser = new DependencyGraphParser( "artifact-descriptions/managed/" ); - session.setDependencyManager( new TransitiveDependencyManager() ); - final Dependency root = newDep( "gid:root:ext:ver", "compile" ); - CollectRequest request = new CollectRequest( root, Collections.singletonList( repository ) ); - request.addManagedDependency( newDep( "gid:root:ext:must-retain-core-management" ) ); - CollectResult result = collector.collectDependencies( session, request ); - - final DependencyNode expectedTree = parser.parseResource( "management-tree.txt" ); - assertEqualSubtree( expectedTree, result.getRoot() ); - - // Same test for root artifact (POM) request. - final CollectRequest rootArtifactRequest = new CollectRequest(); - rootArtifactRequest.setRepositories( Collections.singletonList( repository ) ); - rootArtifactRequest.setRootArtifact( new DefaultArtifact( "gid:root:ext:ver" ) ); - rootArtifactRequest.addDependency( newDep( "gid:direct:ext:ver", "compile" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:root:ext:must-retain-core-management" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:direct:ext:must-retain-core-management" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:transitive-1:ext:managed-by-root" ) ); - session.setDependencyManager( new TransitiveDependencyManager() ); - result = collector.collectDependencies( session, rootArtifactRequest ); - assertEqualSubtree( expectedTree, toDependencyResult( result.getRoot(), "compile", null ) ); - } - - @Test - public void testDependencyManagement_DefaultDependencyManager() - throws DependencyCollectionException, IOException - { - collector.setArtifactDescriptorReader( newReader( "managed/" ) ); - parser = new DependencyGraphParser( "artifact-descriptions/managed/" ); - session.setDependencyManager( new DefaultDependencyManager() ); - final Dependency root = newDep( "gid:root:ext:ver", "compile" ); - CollectRequest request = new CollectRequest( root, Arrays.asList( repository ) ); - request.addManagedDependency( newDep( "gid:root:ext:must-not-manage-root" ) ); - request.addManagedDependency( newDep( "gid:direct:ext:managed-by-dominant-request" ) ); - CollectResult result = collector.collectDependencies( session, request ); - - final DependencyNode expectedTree = parser.parseResource( "default-management-tree.txt" ); - assertEqualSubtree( expectedTree, result.getRoot() ); - - // Same test for root artifact (POM) request. - final CollectRequest rootArtifactRequest = new CollectRequest(); - rootArtifactRequest.setRepositories( Arrays.asList( repository ) ); - rootArtifactRequest.setRootArtifact( new DefaultArtifact( "gid:root:ext:ver" ) ); - rootArtifactRequest.addDependency( newDep( "gid:direct:ext:ver", "compile" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:root:ext:must-not-manage-root" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:direct:ext:managed-by-dominant-request" ) ); - rootArtifactRequest.addManagedDependency( newDep( "gid:transitive-1:ext:managed-by-root" ) ); - session.setDependencyManager( new DefaultDependencyManager() ); - result = collector.collectDependencies( session, rootArtifactRequest ); - assertEqualSubtree( expectedTree, toDependencyResult( result.getRoot(), "compile", null ) ); - } - - private DependencyNode toDependencyResult( final DependencyNode root, final String rootScope, - final Boolean optional ) - { - // Make the root artifact resultion result a dependency resolution result for the subtree check. - assertNull( "Expected root artifact resolution result.", root.getDependency() ); - final DefaultDependencyNode defaultNode = - new DefaultDependencyNode( new Dependency( root.getArtifact(), rootScope ) ); - - defaultNode.setChildren( root.getChildren() ); - - if ( optional != null ) - { - defaultNode.setOptional( optional ); - } - - return defaultNode; - } - - @Test - public void testVersionFilter() - throws Exception - { - session.setVersionFilter( new HighestVersionFilter() ); - CollectRequest request = new CollectRequest().setRoot( newDep( "gid:aid:1" ) ); - CollectResult result = collector.collectDependencies( session, request ); - assertEquals( 1, result.getRoot().getChildren().size() ); - } - - static class TestDependencyManager - implements DependencyManager - { - - private Map versions = new HashMap<>(); - - private Map scopes = new HashMap<>(); - - private Map optionals = new HashMap<>(); - - private Map paths = new HashMap<>(); - - private Map> exclusions = new HashMap<>(); - - public void add( Dependency d, String version, String scope, String localPath ) - { - String id = toKey( d ); - version( id, version ); - scope( id, scope ); - path( id, localPath ); - } - - public void version( String id, String version ) - { - versions.put( id, version ); - } - - public void scope( String id, String scope ) - { - scopes.put( id, scope ); - } - - public void optional( String id, Boolean optional ) - { - optionals.put( id, optional ); - } - - public void path( String id, String path ) - { - paths.put( id, path ); - } - - public void exclusions( String id, Exclusion... exclusions ) - { - this.exclusions.put( id, exclusions != null ? Arrays.asList( exclusions ) : null ); - } - - public DependencyManagement manageDependency( Dependency dependency ) - { - requireNonNull( dependency, "dependency cannot be null" ); - String id = toKey( dependency ); - DependencyManagement mgmt = new DependencyManagement(); - mgmt.setVersion( versions.get( id ) ); - mgmt.setScope( scopes.get( id ) ); - mgmt.setOptional( optionals.get( id ) ); - String path = paths.get( id ); - if ( path != null ) - { - mgmt.setProperties( Collections.singletonMap( ArtifactProperties.LOCAL_PATH, path ) ); - } - mgmt.setExclusions( exclusions.get( id ) ); - return mgmt; - } - - private String toKey( Dependency dependency ) - { - return ArtifactIdUtils.toVersionlessId( dependency.getArtifact() ); - } - - public DependencyManager deriveChildManager( DependencyCollectionContext context ) - { - requireNonNull( context, "context cannot be null" ); - return this; - } - - } - } \ No newline at end of file