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.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
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 }