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