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  import static org.junit.jupiter.api.Assertions.assertTrue;
33  
34  /**
35   */
36  class DefaultProjectDependencyGraphTest {
37  
38      private final MavenProject aProject = createA();
39  
40      private final MavenProject bProject = createProject(Arrays.asList(toDependency(aProject)), "bProject");
41  
42      private final MavenProject cProject = createProject(Arrays.asList(toDependency(bProject)), "cProject");
43  
44      private final MavenProject depender1 = createProject(Arrays.asList(toDependency(aProject)), "depender1");
45  
46      private final MavenProject depender2 = createProject(Arrays.asList(toDependency(aProject)), "depender2");
47  
48      private final MavenProject depender3 = createProject(Arrays.asList(toDependency(aProject)), "depender3");
49  
50      private final MavenProject depender4 =
51              createProject(Arrays.asList(toDependency(aProject), toDependency(depender3)), "depender4");
52  
53      private final MavenProject transitiveOnly = createProject(Arrays.asList(toDependency(depender3)), "depender5");
54  
55      @Test
56      void testNonTransitiveFiltering() throws DuplicateProjectException, CycleDetectedException {
57          ProjectDependencyGraph graph = new FilteredProjectDependencyGraph(
58                  new DefaultProjectDependencyGraph(Arrays.asList(aProject, bProject, cProject)),
59                  Arrays.asList(aProject, cProject));
60          final List<MavenProject> sortedProjects = graph.getSortedProjects();
61          assertEquals(aProject, sortedProjects.get(0));
62          assertEquals(cProject, sortedProjects.get(1));
63  
64          assertTrue(graph.getDownstreamProjects(aProject, false).contains(cProject));
65      }
66  
67      @Test
68      void testGetSortedProjects() throws DuplicateProjectException, CycleDetectedException {
69          ProjectDependencyGraph graph = new DefaultProjectDependencyGraph(Arrays.asList(depender1, aProject));
70          final List<MavenProject> sortedProjects = graph.getSortedProjects();
71          assertEquals(aProject, sortedProjects.get(0));
72          assertEquals(depender1, sortedProjects.get(1));
73      }
74  
75      @Test
76      void testVerifyExpectedParentStructure() throws CycleDetectedException, DuplicateProjectException {
77          // This test verifies the baseline structure used in subsequent tests. If this fails, the rest will fail.
78          ProjectDependencyGraph graph = threeProjectsDependingOnASingle();
79          final List<MavenProject> sortedProjects = graph.getSortedProjects();
80          assertEquals(aProject, sortedProjects.get(0));
81          assertEquals(depender1, sortedProjects.get(1));
82          assertEquals(depender2, sortedProjects.get(2));
83          assertEquals(depender3, sortedProjects.get(3));
84      }
85  
86      @Test
87      void testVerifyThatDownstreamProjectsComeInSortedOrder() throws CycleDetectedException, DuplicateProjectException {
88          final List<MavenProject> downstreamProjects =
89                  threeProjectsDependingOnASingle().getDownstreamProjects(aProject, true);
90          assertEquals(depender1, downstreamProjects.get(0));
91          assertEquals(depender2, downstreamProjects.get(1));
92          assertEquals(depender3, downstreamProjects.get(2));
93      }
94  
95      @Test
96      void testTransitivesInOrder() throws CycleDetectedException, DuplicateProjectException {
97          final ProjectDependencyGraph graph =
98                  new DefaultProjectDependencyGraph(Arrays.asList(depender1, depender4, depender2, depender3, aProject));
99  
100         final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, true);
101         assertEquals(depender1, downstreamProjects.get(0));
102         assertEquals(depender3, downstreamProjects.get(1));
103         assertEquals(depender4, downstreamProjects.get(2));
104         assertEquals(depender2, downstreamProjects.get(3));
105     }
106 
107     @Test
108     void testNonTransitivesInOrder() throws CycleDetectedException, DuplicateProjectException {
109         final ProjectDependencyGraph graph =
110                 new DefaultProjectDependencyGraph(Arrays.asList(depender1, depender4, depender2, depender3, aProject));
111 
112         final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, false);
113         assertEquals(depender1, downstreamProjects.get(0));
114         assertEquals(depender3, downstreamProjects.get(1));
115         assertEquals(depender4, downstreamProjects.get(2));
116         assertEquals(depender2, downstreamProjects.get(3));
117     }
118 
119     @Test
120     void testWithTransitiveOnly() throws CycleDetectedException, DuplicateProjectException {
121         final ProjectDependencyGraph graph = new DefaultProjectDependencyGraph(
122                 Arrays.asList(depender1, transitiveOnly, depender2, depender3, aProject));
123 
124         final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, true);
125         assertEquals(depender1, downstreamProjects.get(0));
126         assertEquals(depender3, downstreamProjects.get(1));
127         assertEquals(transitiveOnly, downstreamProjects.get(2));
128         assertEquals(depender2, downstreamProjects.get(3));
129     }
130 
131     @Test
132     void testWithMissingTransitiveOnly() throws CycleDetectedException, DuplicateProjectException {
133         final ProjectDependencyGraph graph = new DefaultProjectDependencyGraph(
134                 Arrays.asList(depender1, transitiveOnly, depender2, depender3, aProject));
135 
136         final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, false);
137         assertEquals(depender1, downstreamProjects.get(0));
138         assertEquals(depender3, downstreamProjects.get(1));
139         assertEquals(depender2, downstreamProjects.get(2));
140     }
141 
142     @Test
143     void testGetUpstreamProjects() throws CycleDetectedException, DuplicateProjectException {
144         ProjectDependencyGraph graph = threeProjectsDependingOnASingle();
145         final List<MavenProject> downstreamProjects = graph.getUpstreamProjects(depender1, true);
146         assertEquals(aProject, downstreamProjects.get(0));
147     }
148 
149     private ProjectDependencyGraph threeProjectsDependingOnASingle()
150             throws CycleDetectedException, DuplicateProjectException {
151         return new DefaultProjectDependencyGraph(Arrays.asList(depender1, depender2, depender3, aProject));
152     }
153 
154     private static MavenProject createA() {
155         MavenProject result = new MavenProject();
156         result.setGroupId("org.apache");
157         result.setArtifactId("A");
158         result.setVersion("1.2");
159         return result;
160     }
161 
162     static Dependency toDependency(MavenProject mavenProject) {
163         final Dependency dependency = new Dependency();
164         dependency.setArtifactId(mavenProject.getArtifactId());
165         dependency.setGroupId(mavenProject.getGroupId());
166         dependency.setVersion(mavenProject.getVersion());
167         return dependency;
168     }
169 
170     private static MavenProject createProject(List<Dependency> dependencies, String artifactId) {
171         MavenProject result = new MavenProject();
172         result.setGroupId("org.apache");
173         result.setArtifactId(artifactId);
174         result.setVersion("1.2");
175         result.setDependencies(dependencies);
176         return result;
177     }
178 }