1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
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 }