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