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 junit.framework.TestCase;
25  import org.apache.maven.execution.ProjectDependencyGraph;
26  import org.apache.maven.model.Dependency;
27  import org.apache.maven.project.DuplicateProjectException;
28  import org.apache.maven.project.MavenProject;
29  import org.codehaus.plexus.util.dag.CycleDetectedException;
30  
31  /**
32   * @author Kristian Rosenvold
33   */
34  public class DefaultProjectDependencyGraphTest extends TestCase {
35  
36      private final MavenProject aProject = createA();
37  
38      private final MavenProject depender1 = createProject(Arrays.asList(toDependency(aProject)), "depender1");
39  
40      private final MavenProject depender2 = createProject(Arrays.asList(toDependency(aProject)), "depender2");
41  
42      private final MavenProject depender3 = createProject(Arrays.asList(toDependency(aProject)), "depender3");
43  
44      private final MavenProject depender4 =
45              createProject(Arrays.asList(toDependency(aProject), toDependency(depender3)), "depender4");
46  
47      private final MavenProject transitiveOnly = createProject(Arrays.asList(toDependency(depender3)), "depender5");
48  
49      public void testGetSortedProjects() throws DuplicateProjectException, CycleDetectedException {
50          ProjectDependencyGraph graph = new DefaultProjectDependencyGraph(Arrays.asList(depender1, aProject));
51          final List<MavenProject> sortedProjects = graph.getSortedProjects();
52          assertEquals(aProject, sortedProjects.get(0));
53          assertEquals(depender1, sortedProjects.get(1));
54      }
55  
56      public void testVerifyExpectedParentStructure() throws CycleDetectedException, DuplicateProjectException {
57          // This test verifies the baseline structure used in subsequent tests. If this fails, the rest will fail.
58          ProjectDependencyGraph graph = threeProjectsDependingOnASingle();
59          final List<MavenProject> sortedProjects = graph.getSortedProjects();
60          assertEquals(aProject, sortedProjects.get(0));
61          assertEquals(depender1, sortedProjects.get(1));
62          assertEquals(depender2, sortedProjects.get(2));
63          assertEquals(depender3, sortedProjects.get(3));
64      }
65  
66      public void testVerifyThatDownstreamProjectsComeInSortedOrder()
67              throws CycleDetectedException, DuplicateProjectException {
68          final List<MavenProject> downstreamProjects =
69                  threeProjectsDependingOnASingle().getDownstreamProjects(aProject, true);
70          assertEquals(depender1, downstreamProjects.get(0));
71          assertEquals(depender2, downstreamProjects.get(1));
72          assertEquals(depender3, downstreamProjects.get(2));
73      }
74  
75      public void testTransitivesInOrder() throws CycleDetectedException, DuplicateProjectException {
76          final ProjectDependencyGraph graph =
77                  new DefaultProjectDependencyGraph(Arrays.asList(depender1, depender4, depender2, depender3, aProject));
78  
79          final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, true);
80          assertEquals(depender1, downstreamProjects.get(0));
81          assertEquals(depender3, downstreamProjects.get(1));
82          assertEquals(depender4, downstreamProjects.get(2));
83          assertEquals(depender2, downstreamProjects.get(3));
84      }
85  
86      public void testNonTransitivesInOrder() throws CycleDetectedException, DuplicateProjectException {
87          final ProjectDependencyGraph graph =
88                  new DefaultProjectDependencyGraph(Arrays.asList(depender1, depender4, depender2, depender3, aProject));
89  
90          final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, false);
91          assertEquals(depender1, downstreamProjects.get(0));
92          assertEquals(depender3, downstreamProjects.get(1));
93          assertEquals(depender4, downstreamProjects.get(2));
94          assertEquals(depender2, downstreamProjects.get(3));
95      }
96  
97      public void testWithTransitiveOnly() throws CycleDetectedException, DuplicateProjectException {
98          final ProjectDependencyGraph graph = new DefaultProjectDependencyGraph(
99                  Arrays.asList(depender1, transitiveOnly, depender2, depender3, aProject));
100 
101         final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, true);
102         assertEquals(depender1, downstreamProjects.get(0));
103         assertEquals(depender3, downstreamProjects.get(1));
104         assertEquals(transitiveOnly, downstreamProjects.get(2));
105         assertEquals(depender2, downstreamProjects.get(3));
106     }
107 
108     public void testWithMissingTransitiveOnly() throws CycleDetectedException, DuplicateProjectException {
109         final ProjectDependencyGraph graph = new DefaultProjectDependencyGraph(
110                 Arrays.asList(depender1, transitiveOnly, 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(depender2, downstreamProjects.get(2));
116     }
117 
118     public void testGetUpstreamProjects() throws CycleDetectedException, DuplicateProjectException {
119         ProjectDependencyGraph graph = threeProjectsDependingOnASingle();
120         final List<MavenProject> downstreamProjects = graph.getUpstreamProjects(depender1, true);
121         assertEquals(aProject, downstreamProjects.get(0));
122     }
123 
124     private ProjectDependencyGraph threeProjectsDependingOnASingle()
125             throws CycleDetectedException, DuplicateProjectException {
126         return new DefaultProjectDependencyGraph(Arrays.asList(depender1, depender2, depender3, aProject));
127     }
128 
129     private static MavenProject createA() {
130         MavenProject result = new MavenProject();
131         result.setGroupId("org.apache");
132         result.setArtifactId("A");
133         result.setVersion("1.2");
134         return result;
135     }
136 
137     static Dependency toDependency(MavenProject mavenProject) {
138         final Dependency dependency = new Dependency();
139         dependency.setArtifactId(mavenProject.getArtifactId());
140         dependency.setGroupId(mavenProject.getGroupId());
141         dependency.setVersion(mavenProject.getVersion());
142         return dependency;
143     }
144 
145     private static MavenProject createProject(List<Dependency> dependencies, String artifactId) {
146         MavenProject result = new MavenProject();
147         result.setGroupId("org.apache");
148         result.setArtifactId(artifactId);
149         result.setVersion("1.2");
150         result.setDependencies(dependencies);
151         return result;
152     }
153 }