View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.graph;
20  
21  import java.util.Arrays;
22  import java.util.List;
23  
24  import org.apache.maven.execution.ProjectDependencyGraph;
25  import org.apache.maven.model.Dependency;
26  import org.apache.maven.project.CycleDetectedException;
27  import org.apache.maven.project.DuplicateProjectException;
28  import org.apache.maven.project.MavenProject;
29  import org.junit.jupiter.api.Test;
30  
31  import static org.junit.jupiter.api.Assertions.assertEquals;
32  
33  /**
34   */
35  class DefaultProjectDependencyGraphTest {
36  
37      private final MavenProject aProject = createA();
38  
39      private final MavenProject depender1 = createProject(Arrays.asList(toDependency(aProject)), "depender1");
40  
41      private final MavenProject depender2 = createProject(Arrays.asList(toDependency(aProject)), "depender2");
42  
43      private final MavenProject depender3 = createProject(Arrays.asList(toDependency(aProject)), "depender3");
44  
45      private final MavenProject depender4 =
46              createProject(Arrays.asList(toDependency(aProject), toDependency(depender3)), "depender4");
47  
48      private final MavenProject transitiveOnly = createProject(Arrays.asList(toDependency(depender3)), "depender5");
49  
50      @Test
51      void testGetSortedProjects() throws DuplicateProjectException, CycleDetectedException {
52          ProjectDependencyGraph graph = new DefaultProjectDependencyGraph(Arrays.asList(depender1, aProject));
53          final List<MavenProject> sortedProjects = graph.getSortedProjects();
54          assertEquals(aProject, sortedProjects.get(0));
55          assertEquals(depender1, sortedProjects.get(1));
56      }
57  
58      @Test
59      void testVerifyExpectedParentStructure() throws CycleDetectedException, DuplicateProjectException {
60          // This test verifies the baseline structure used in subsequent tests. If this fails, the rest will fail.
61          ProjectDependencyGraph graph = threeProjectsDependingOnASingle();
62          final List<MavenProject> sortedProjects = graph.getSortedProjects();
63          assertEquals(aProject, sortedProjects.get(0));
64          assertEquals(depender1, sortedProjects.get(1));
65          assertEquals(depender2, sortedProjects.get(2));
66          assertEquals(depender3, sortedProjects.get(3));
67      }
68  
69      @Test
70      void testVerifyThatDownstreamProjectsComeInSortedOrder() throws CycleDetectedException, DuplicateProjectException {
71          final List<MavenProject> downstreamProjects =
72                  threeProjectsDependingOnASingle().getDownstreamProjects(aProject, true);
73          assertEquals(depender1, downstreamProjects.get(0));
74          assertEquals(depender2, downstreamProjects.get(1));
75          assertEquals(depender3, downstreamProjects.get(2));
76      }
77  
78      @Test
79      void testTransitivesInOrder() throws CycleDetectedException, DuplicateProjectException {
80          final ProjectDependencyGraph graph =
81                  new DefaultProjectDependencyGraph(Arrays.asList(depender1, depender4, depender2, depender3, aProject));
82  
83          final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, true);
84          assertEquals(depender1, downstreamProjects.get(0));
85          assertEquals(depender3, downstreamProjects.get(1));
86          assertEquals(depender4, downstreamProjects.get(2));
87          assertEquals(depender2, downstreamProjects.get(3));
88      }
89  
90      @Test
91      void testNonTransitivesInOrder() throws CycleDetectedException, DuplicateProjectException {
92          final ProjectDependencyGraph graph =
93                  new DefaultProjectDependencyGraph(Arrays.asList(depender1, depender4, depender2, depender3, aProject));
94  
95          final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, false);
96          assertEquals(depender1, downstreamProjects.get(0));
97          assertEquals(depender3, downstreamProjects.get(1));
98          assertEquals(depender4, downstreamProjects.get(2));
99          assertEquals(depender2, downstreamProjects.get(3));
100     }
101 
102     @Test
103     void testWithTransitiveOnly() throws CycleDetectedException, DuplicateProjectException {
104         final ProjectDependencyGraph graph = new DefaultProjectDependencyGraph(
105                 Arrays.asList(depender1, transitiveOnly, depender2, depender3, aProject));
106 
107         final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, true);
108         assertEquals(depender1, downstreamProjects.get(0));
109         assertEquals(depender3, downstreamProjects.get(1));
110         assertEquals(transitiveOnly, downstreamProjects.get(2));
111         assertEquals(depender2, downstreamProjects.get(3));
112     }
113 
114     @Test
115     void testWithMissingTransitiveOnly() throws CycleDetectedException, DuplicateProjectException {
116         final ProjectDependencyGraph graph = new DefaultProjectDependencyGraph(
117                 Arrays.asList(depender1, transitiveOnly, depender2, depender3, aProject));
118 
119         final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, false);
120         assertEquals(depender1, downstreamProjects.get(0));
121         assertEquals(depender3, downstreamProjects.get(1));
122         assertEquals(depender2, downstreamProjects.get(2));
123     }
124 
125     @Test
126     void testGetUpstreamProjects() throws CycleDetectedException, DuplicateProjectException {
127         ProjectDependencyGraph graph = threeProjectsDependingOnASingle();
128         final List<MavenProject> downstreamProjects = graph.getUpstreamProjects(depender1, true);
129         assertEquals(aProject, downstreamProjects.get(0));
130     }
131 
132     private ProjectDependencyGraph threeProjectsDependingOnASingle()
133             throws CycleDetectedException, DuplicateProjectException {
134         return new DefaultProjectDependencyGraph(Arrays.asList(depender1, depender2, depender3, aProject));
135     }
136 
137     private static MavenProject createA() {
138         MavenProject result = new MavenProject();
139         result.setGroupId("org.apache");
140         result.setArtifactId("A");
141         result.setVersion("1.2");
142         return result;
143     }
144 
145     static Dependency toDependency(MavenProject mavenProject) {
146         final Dependency dependency = new Dependency();
147         dependency.setArtifactId(mavenProject.getArtifactId());
148         dependency.setGroupId(mavenProject.getGroupId());
149         dependency.setVersion(mavenProject.getVersion());
150         return dependency;
151     }
152 
153     private static MavenProject createProject(List<Dependency> dependencies, String artifactId) {
154         MavenProject result = new MavenProject();
155         result.setGroupId("org.apache");
156         result.setArtifactId(artifactId);
157         result.setVersion("1.2");
158         result.setDependencies(dependencies);
159         return result;
160     }
161 }