@@ -39,6 +39,13 @@ public class DefaultProjectDependencyGraphTest extends TestCase {
3939
4040 private final MavenProject cProject = createProject (Arrays .asList (toDependency (bProject )), "cProject" );
4141
42+ private final MavenProject dProject = createProject (
43+ Arrays .asList (toDependency (aProject ), toDependency (bProject ), toDependency (cProject )), "dProject" );
44+
45+ private final MavenProject eProject = createProject (
46+ Arrays .asList (toDependency (aProject ), toDependency (bProject ), toDependency (cProject ), toDependency (dProject )),
47+ "eProject" );
48+
4249 private final MavenProject depender1 = createProject (Arrays .asList (toDependency (aProject )), "depender1" );
4350
4451 private final MavenProject depender2 = createProject (Arrays .asList (toDependency (aProject )), "depender2" );
@@ -61,6 +68,37 @@ public void testNonTransitiveFiltering() throws DuplicateProjectException, Cycle
6168 assertTrue (graph .getDownstreamProjects (aProject , false ).contains (cProject ));
6269 }
6370
71+ // Test verifying that getDownstreamProjects does not contain duplicates.
72+ // This is a regression test for https://github.com/apache/maven/issues/2487.
73+ //
74+ // The graph is:
75+ // aProject -> bProject
76+ // | -> dProject
77+ // | -> eProject
78+ // bProject -> cProject
79+ // | -> dProject
80+ // | -> eProject
81+ // cProject -> dProject
82+ // | -> eProject
83+ // dProject -> eProject
84+ //
85+ // When getting the non-transitive, downstream projects of aProject with a whitelist of aProject, dProject,
86+ // and eProject, we expect to get dProject, and eProject with no duplicates.
87+ // Before the fix, this would return dProject and eProject twice, once from bProject and once from cProject. As
88+ // aProject is whitelisted, it should not be returned as a downstream project for itself. bProject and cProject
89+ // are not whitelisted, so they should return their downstream projects, both have dProject and eProject as
90+ // downstream projects. Which would result in dProject and eProject being returned twice, but now the results are
91+ // made unique.
92+ public void testGetDownstreamDoesNotDuplicateProjects () throws CycleDetectedException , DuplicateProjectException {
93+ ProjectDependencyGraph graph = new DefaultProjectDependencyGraph (
94+ Arrays .asList (aProject , bProject , cProject , dProject , eProject ));
95+ graph = new FilteredProjectDependencyGraph (graph , Arrays .asList (aProject , dProject , eProject ));
96+ final List <MavenProject > downstreamProjects = graph .getDownstreamProjects (aProject , false );
97+ assertEquals (2 , downstreamProjects .size ());
98+ assertTrue (downstreamProjects .contains (dProject ));
99+ assertTrue (downstreamProjects .contains (eProject ));
100+ }
101+
64102 public void testGetSortedProjects () throws DuplicateProjectException , CycleDetectedException {
65103 ProjectDependencyGraph graph = new DefaultProjectDependencyGraph (Arrays .asList (depender1 , aProject ));
66104 final List <MavenProject > sortedProjects = graph .getSortedProjects ();
0 commit comments