You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by cs...@apache.org on 2022/05/10 11:24:50 UTC

[maven-resolver] branch weibo1995-bf-bugfix-ut created (now 17f1add5)

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

cstamas pushed a change to branch weibo1995-bf-bugfix-ut
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git


      at 17f1add5 Add test cases for empty children, also collaps tests

This branch includes the following new commits:

     new 17f1add5 Add test cases for empty children, also collaps tests

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[maven-resolver] 01/01: Add test cases for empty children, also collaps tests

Posted by cs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cstamas pushed a commit to branch weibo1995-bf-bugfix-ut
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git

commit 17f1add5ca481e2c1187ad10a3f127ade6c7fc50
Author: Tamas Cservenak <ta...@cservenak.net>
AuthorDate: Tue May 10 13:24:13 2022 +0200

    Add test cases for empty children, also collaps tests
---
 ...=> DependencyCollectorDelegateTestSupport.java} | 143 +++--
 .../impl/collect/bf/BfDependencyCollectorTest.java | 651 ++-------------------
 .../bf/BfDependencyCollectorUseSkipTest.java       |  86 ---
 .../impl/collect/df/DfDependencyCollectorTest.java | 620 +-------------------
 4 files changed, 111 insertions(+), 1389 deletions(-)

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/DependencyCollectorDelegateTestSupport.java
similarity index 86%
copy from maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollectorTest.java
copy to maven-resolver-impl/src/test/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegateTestSupport.java
index 5a7487e8..c7759ced 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/DependencyCollectorDelegateTestSupport.java
@@ -1,4 +1,4 @@
-package org.eclipse.aether.internal.impl.collect.bf;
+package org.eclipse.aether.internal.impl.collect;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -48,8 +48,6 @@ 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;
@@ -70,6 +68,7 @@ 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;
@@ -80,18 +79,19 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 /**
+ * Common tests for various {@link DependencyCollectorDelegate} implementations.
  */
-public class BfDependencyCollectorTest
+public abstract class DependencyCollectorDelegateTestSupport
 {
 
-    protected BfDependencyCollector collector;
-
     protected DefaultRepositorySystemSession session;
 
     protected DependencyGraphParser parser;
 
     protected RemoteRepository repository;
 
+    protected DependencyCollectorDelegate collector;
+
     protected IniArtifactDescriptorReader newReader( String prefix )
     {
         return new IniArtifactDescriptorReader( "artifact-descriptions/" + prefix );
@@ -109,28 +109,18 @@ public class BfDependencyCollectorTest
 
     @Before
     public void setup()
-    {
-        setupCollector( false );
-    }
-
-    public void setupCollector( boolean useSkipper )
     {
         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();
+        setupCollector();
     }
 
+    protected abstract void setupCollector();
+
     private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual )
     {
-        assertEqualSubtree( expected, actual, new LinkedList<DependencyNode>() );
+        assertEqualSubtree( expected, actual, new LinkedList<>() );
     }
 
     private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual,
@@ -153,7 +143,7 @@ public class BfDependencyCollectorTest
         parents.addLast( expected );
 
         assertEquals( "path: " + parents + ", expected: " + expected.getChildren() + ", actual: "
-                          + actual.getChildren(), expected.getChildren().size(), actual.getChildren().size() );
+                + actual.getChildren(), expected.getChildren().size(), actual.getChildren().size() );
 
         Iterator<DependencyNode> iterator1 = expected.getChildren().iterator();
         Iterator<DependencyNode> iterator2 = actual.getChildren().iterator();
@@ -191,10 +181,10 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testSimpleCollection()
-        throws DependencyCollectionException
+            throws DependencyCollectionException
     {
         Dependency dependency = newDep( "gid:aid:ext:ver", "compile" );
-        CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
+        CollectRequest request = new CollectRequest( dependency, singletonList( repository ) );
         CollectResult result = collector.collectDependencies( session, request );
 
         assertEquals( 0, result.getExceptions().size() );
@@ -215,7 +205,7 @@ public class BfDependencyCollectorTest
     public void testMissingDependencyDescription()
     {
         CollectRequest request =
-            new CollectRequest( newDep( "missing:description:ext:ver" ), Arrays.asList( repository ) );
+                new CollectRequest( newDep( "missing:description:ext:ver" ), singletonList( repository ) );
         try
         {
             collector.collectDependencies( session, request );
@@ -236,10 +226,10 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testDuplicates()
-        throws DependencyCollectionException
+            throws DependencyCollectionException
     {
         Dependency dependency = newDep( "duplicate:transitive:ext:dependency" );
-        CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
+        CollectRequest request = new CollectRequest( dependency, singletonList( repository ) );
 
         CollectResult result = collector.collectDependencies( session, request );
 
@@ -264,11 +254,11 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testEqualSubtree()
-        throws IOException, DependencyCollectionException
+            throws IOException, DependencyCollectionException
     {
         DependencyNode root = parser.parseResource( "expectedSubtreeComparisonResult.txt" );
         Dependency dependency = root.getDependency();
-        CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
+        CollectRequest request = new CollectRequest( dependency, singletonList( repository ) );
 
         CollectResult result = collector.collectDependencies( session, request );
         assertEqualSubtree( root, result.getRoot() );
@@ -276,19 +266,19 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testCyclicDependencies()
-        throws Exception
+            throws Exception
     {
         DependencyNode root = parser.parseResource( "cycle.txt" );
-        CollectRequest request = new CollectRequest( root.getDependency(), Arrays.asList( repository ) );
+        CollectRequest request = new CollectRequest( root.getDependency(), singletonList( repository ) );
         CollectResult result = collector.collectDependencies( session, request );
         assertEqualSubtree( root, result.getRoot() );
     }
 
     @Test
     public void testCyclicDependenciesBig()
-        throws Exception
+            throws Exception
     {
-        CollectRequest request = new CollectRequest( newDep( "1:2:pom:5.50-SNAPSHOT" ), Arrays.asList( repository ) );
+        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() );
@@ -297,9 +287,9 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testCyclicProjects()
-        throws Exception
+            throws Exception
     {
-        CollectRequest request = new CollectRequest( newDep( "test:a:2" ), Arrays.asList( repository ) );
+        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();
@@ -313,18 +303,19 @@ public class BfDependencyCollectorTest
 
         assertEquals( 1, result.getCycles().size() );
         DependencyCycle cycle = result.getCycles().get( 0 );
-        assertEquals( Arrays.asList(), cycle.getPrecedingDependencies() );
+        assertEquals( Collections.emptyList(), cycle.getPrecedingDependencies() );
         assertEquals( Arrays.asList( root.getDependency(), path( root, 0 ).getDependency(), a1.getDependency() ),
-                      cycle.getCyclicDependencies() );
+                cycle.getCyclicDependencies() );
     }
 
     @Test
     public void testCyclicProjects_ConsiderLabelOfRootlessGraph()
-        throws Exception
+            throws Exception
     {
         Dependency dep = newDep( "gid:aid:ver", "compile" );
         CollectRequest request =
-            new CollectRequest().addDependency( dep ).addRepository( repository ).setRootArtifact( dep.getArtifact() );
+                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 );
@@ -336,19 +327,19 @@ public class BfDependencyCollectorTest
 
         assertEquals( 1, result.getCycles().size() );
         DependencyCycle cycle = result.getCycles().get( 0 );
-        assertEquals( Arrays.asList(), cycle.getPrecedingDependencies() );
+        assertEquals( Collections.emptyList(), cycle.getPrecedingDependencies() );
         assertEquals( Arrays.asList( new Dependency( dep.getArtifact(), null ), a1.getDependency() ),
-                      cycle.getCyclicDependencies() );
+                cycle.getCyclicDependencies() );
     }
 
     @Test
     public void testPartialResultOnError()
-        throws IOException
+            throws IOException
     {
         DependencyNode root = parser.parseResource( "expectedPartialSubtreeOnError.txt" );
 
         Dependency dependency = root.getDependency();
-        CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
+        CollectRequest request = new CollectRequest( dependency, singletonList( repository ) );
 
         CollectResult result;
         try
@@ -372,12 +363,12 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testCollectMultipleDependencies()
-        throws DependencyCollectionException
+            throws DependencyCollectionException
     {
         Dependency root1 = newDep( "gid:aid:ext:ver", "compile" );
         Dependency root2 = newDep( "gid:aid2:ext:ver", "compile" );
         List<Dependency> dependencies = Arrays.asList( root1, root2 );
-        CollectRequest request = new CollectRequest( dependencies, null, Arrays.asList( repository ) );
+        CollectRequest request = new CollectRequest( dependencies, null, singletonList( repository ) );
         CollectResult result = collector.collectDependencies( session, request );
 
         assertEquals( 0, result.getExceptions().size() );
@@ -393,7 +384,7 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testArtifactDescriptorResolutionNotRestrictedToRepoHostingSelectedVersion()
-        throws Exception
+            throws Exception
     {
         RemoteRepository repo2 = new RemoteRepository.Builder( "test", "default", "file:///" ).build();
 
@@ -409,7 +400,7 @@ public class BfDependencyCollectorTest
             }
         } );
 
-        List<Dependency> dependencies = Arrays.asList( newDep( "verrange:parent:jar:1[1,)", "compile" ) );
+        List<Dependency> 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 );
 
@@ -421,10 +412,10 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testManagedVersionScope()
-        throws DependencyCollectionException
+            throws DependencyCollectionException
     {
         Dependency dependency = newDep( "managed:aid:ext:ver" );
-        CollectRequest request = new CollectRequest( dependency, Arrays.asList( repository ) );
+        CollectRequest request = new CollectRequest( dependency, singletonList( repository ) );
 
         session.setDependencyManager( new ClassicDependencyManager() );
 
@@ -448,7 +439,7 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testDependencyManagement()
-        throws IOException, DependencyCollectionException
+            throws IOException, DependencyCollectionException
     {
         collector.setArtifactDescriptorReader( newReader( "managed/" ) );
 
@@ -461,7 +452,7 @@ public class BfDependencyCollectorTest
 
         // collect result will differ from expectedSubtreeComparisonResult.txt
         // set localPath -> no dependency traversal
-        CollectRequest request = new CollectRequest( dep( root ), Arrays.asList( repository ) );
+        CollectRequest request = new CollectRequest( dep( root ), singletonList( repository ) );
         CollectResult result = collector.collectDependencies( session, request );
 
         DependencyNode node = result.getRoot();
@@ -474,7 +465,7 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testDependencyManagement_VerboseMode()
-        throws Exception
+            throws Exception
     {
         String depId = "gid:aid2:ext";
         TestDependencyManager depMgmt = new TestDependencyManager();
@@ -490,7 +481,7 @@ public class BfDependencyCollectorTest
         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() );
+                | DependencyNode.MANAGED_PROPERTIES | DependencyNode.MANAGED_EXCLUSIONS, node.getManagedBits() );
         assertEquals( "ver", DependencyManagerUtils.getPremanagedVersion( node ) );
         assertEquals( "compile", DependencyManagerUtils.getPremanagedScope( node ) );
         assertEquals( Boolean.FALSE, DependencyManagerUtils.getPremanagedOptional( node ) );
@@ -504,7 +495,7 @@ public class BfDependencyCollectorTest
         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 ) );
+        CollectRequest request = new CollectRequest( root, singletonList( repository ) );
         request.addManagedDependency( newDep( "gid:root:ext:must-retain-core-management" ) );
         CollectResult result = collector.collectDependencies( session, request );
 
@@ -513,7 +504,7 @@ public class BfDependencyCollectorTest
 
         // Same test for root artifact (POM) request.
         final CollectRequest rootArtifactRequest = new CollectRequest();
-        rootArtifactRequest.setRepositories( Collections.singletonList( repository ) );
+        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" ) );
@@ -526,13 +517,13 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testDependencyManagement_DefaultDependencyManager()
-        throws DependencyCollectionException, IOException
+            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 ) );
+        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 );
@@ -542,7 +533,7 @@ public class BfDependencyCollectorTest
 
         // Same test for root artifact (POM) request.
         final CollectRequest rootArtifactRequest = new CollectRequest();
-        rootArtifactRequest.setRepositories( Arrays.asList( repository ) );
+        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" ) );
@@ -573,7 +564,7 @@ public class BfDependencyCollectorTest
 
     @Test
     public void testVersionFilter()
-        throws Exception
+            throws Exception
     {
         session.setVersionFilter( new HighestVersionFilter() );
         CollectRequest request = new CollectRequest().setRoot( newDep( "gid:aid:1" ) );
@@ -586,40 +577,40 @@ public class BfDependencyCollectorTest
     public void testDescriptorDependenciesEmpty()
             throws Exception
     {
-        collector.setArtifactDescriptorReader(newReader("dependencies-empty/"));
+        collector.setArtifactDescriptorReader( newReader( "dependencies-empty/" ) );
 
-        session.setDependencyGraphTransformer(new ConflictResolver(
+        session.setDependencyGraphTransformer( new ConflictResolver(
                 new NearestVersionSelector(), new JavaScopeSelector(), new SimpleOptionalitySelector(),
                 new JavaScopeDeriver()
-        ));
+        ) );
 
 
-        DependencyNode root = parser.parseResource("expectedSubtreeOnDescriptorDependenciesEmptyLeft.txt");
+        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());
+        CollectRequest request = new CollectRequest( dependency, singletonList( repository ) );
+        CollectResult result = collector.collectDependencies( session, request );
+        assertEqualSubtree( root, result.getRoot() );
 
-        root = parser.parseResource("expectedSubtreeOnDescriptorDependenciesEmptyRight.txt");
+        root = parser.parseResource( "expectedSubtreeOnDescriptorDependenciesEmptyRight.txt" );
         dependency = root.getDependency();
-        request = new CollectRequest(dependency, Arrays.asList(repository));
-        result = collector.collectDependencies(session, request);
-        assertEqualSubtree(root, result.getRoot());
+        request = new CollectRequest( dependency, singletonList( repository ) );
+        result = collector.collectDependencies( session, request );
+        assertEqualSubtree( root, result.getRoot() );
     }
 
     static class TestDependencyManager
-        implements DependencyManager
+            implements DependencyManager
     {
 
-        private Map<String, String> versions = new HashMap<>();
+        private final Map<String, String> versions = new HashMap<>();
 
-        private Map<String, String> scopes = new HashMap<>();
+        private final Map<String, String> scopes = new HashMap<>();
 
-        private Map<String, Boolean> optionals = new HashMap<>();
+        private final Map<String, Boolean> optionals = new HashMap<>();
 
-        private Map<String, String> paths = new HashMap<>();
+        private final Map<String, String> paths = new HashMap<>();
 
-        private Map<String, Collection<Exclusion>> exclusions = new HashMap<>();
+        private final Map<String, Collection<Exclusion>> exclusions = new HashMap<>();
 
         public void add( Dependency d, String version, String scope, String localPath )
         {
@@ -654,6 +645,7 @@ public class BfDependencyCollectorTest
             this.exclusions.put( id, exclusions != null ? Arrays.asList( exclusions ) : null );
         }
 
+        @Override
         public DependencyManagement manageDependency( Dependency dependency )
         {
             requireNonNull( dependency, "dependency cannot be null" );
@@ -676,6 +668,7 @@ public class BfDependencyCollectorTest
             return ArtifactIdUtils.toVersionlessId( dependency.getArtifact() );
         }
 
+        @Override
         public DependencyManager deriveChildManager( DependencyCollectionContext context )
         {
             requireNonNull( context, "context cannot be null" );
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 5a7487e8..6f3ea1dc 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 @@ package org.eclipse.aether.internal.impl.collect.bf;
  * 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<Boolean> 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<DependencyNode>() );
-    }
-
-    private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual,
-                                            LinkedList<DependencyNode> 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<DependencyNode> iterator1 = expected.getChildren().iterator();
-        Iterator<DependencyNode> 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<Exclusion> 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<Dependency> 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<RemoteRepository> repos = new ArrayList<>();
-
-        collector.setArtifactDescriptorReader( new ArtifactDescriptorReader()
-        {
-            public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session,
-                                                                    ArtifactDescriptorRequest request )
-            {
-                repos.addAll( request.getRepositories() );
-                return new ArtifactDescriptorResult( request );
-            }
-        } );
-
-        List<Dependency> 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<String, String> versions = new HashMap<>();
-
-        private Map<String, String> scopes = new HashMap<>();
-
-        private Map<String, Boolean> optionals = new HashMap<>();
-
-        private Map<String, String> paths = new HashMap<>();
-
-        private Map<String, Collection<Exclusion>> 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 5daa678b..00000000
--- 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<Exclusion> 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<Dependency> 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 b641bbd6..131e24c4 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 @@ package org.eclipse.aether.internal.impl.collect.df;
  * 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<DependencyNode>() );
-    }
-
-    private static void assertEqualSubtree( DependencyNode expected, DependencyNode actual,
-                                            LinkedList<DependencyNode> 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<DependencyNode> iterator1 = expected.getChildren().iterator();
-        Iterator<DependencyNode> 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<Dependency> 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<RemoteRepository> repos = new ArrayList<>();
-
-        collector.setArtifactDescriptorReader( new ArtifactDescriptorReader()
-        {
-            public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session,
-                                                                    ArtifactDescriptorRequest request )
-            {
-                repos.addAll( request.getRepositories() );
-                return new ArtifactDescriptorResult( request );
-            }
-        } );
-
-        List<Dependency> 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<String, String> versions = new HashMap<>();
-
-        private Map<String, String> scopes = new HashMap<>();
-
-        private Map<String, Boolean> optionals = new HashMap<>();
-
-        private Map<String, String> paths = new HashMap<>();
-
-        private Map<String, Collection<Exclusion>> 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