1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugins.assembly.artifact;
20
21 import java.io.File;
22 import java.util.Arrays;
23 import java.util.Collections;
24 import java.util.HashSet;
25 import java.util.Set;
26
27 import org.apache.maven.artifact.Artifact;
28 import org.apache.maven.artifact.DefaultArtifact;
29 import org.apache.maven.artifact.handler.DefaultArtifactHandler;
30 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
31 import org.apache.maven.artifact.versioning.VersionRange;
32 import org.apache.maven.execution.MavenSession;
33 import org.apache.maven.model.Model;
34 import org.apache.maven.plugins.assembly.AssemblerConfigurationSource;
35 import org.apache.maven.plugins.assembly.model.DependencySet;
36 import org.apache.maven.plugins.assembly.model.ModuleBinaries;
37 import org.apache.maven.plugins.assembly.model.ModuleSet;
38 import org.apache.maven.project.MavenProject;
39 import org.eclipse.aether.RepositorySystem;
40 import org.eclipse.aether.RepositorySystemSession;
41 import org.eclipse.aether.graph.DefaultDependencyNode;
42 import org.eclipse.aether.graph.Dependency;
43 import org.eclipse.aether.resolution.DependencyRequest;
44 import org.eclipse.aether.resolution.DependencyResult;
45 import org.junit.jupiter.api.Test;
46 import org.junit.jupiter.api.extension.ExtendWith;
47 import org.mockito.InjectMocks;
48 import org.mockito.Mock;
49 import org.mockito.junit.jupiter.MockitoExtension;
50 import org.mockito.junit.jupiter.MockitoSettings;
51 import org.mockito.quality.Strictness;
52
53 import static org.junit.jupiter.api.Assertions.assertEquals;
54 import static org.junit.jupiter.api.Assertions.assertTrue;
55 import static org.mockito.ArgumentMatchers.any;
56 import static org.mockito.ArgumentMatchers.eq;
57 import static org.mockito.Mockito.mock;
58 import static org.mockito.Mockito.verify;
59 import static org.mockito.Mockito.when;
60
61 @MockitoSettings(strictness = Strictness.WARN)
62 @ExtendWith(MockitoExtension.class)
63 public class DefaultDependencyResolverTest {
64
65 @Mock
66 private ArtifactHandlerManager artifactHandlerManager;
67
68 @Mock
69 private RepositorySystem repositorySystem;
70
71 @Mock
72 private RepositorySystemSession systemSession;
73
74 @InjectMocks
75 private DefaultDependencyResolver resolver;
76
77 @Test
78 public void testGetDependencySetResolutionRequirementsTransitive() throws Exception {
79 final DependencySet ds = new DependencySet();
80 ds.setScope(Artifact.SCOPE_SYSTEM);
81 ds.setUseTransitiveDependencies(true);
82
83 final MavenProject project = createMavenProject("main-group", "main-artifact", "1", null);
84
85 Set<Artifact> artifacts = new HashSet<>();
86 artifacts.add(newArtifact("g.id", "a-id", "1"));
87 artifacts.add(newArtifact("g.id", "a-id-2", "2"));
88
89 DefaultDependencyNode node1 = new DefaultDependencyNode(new Dependency(
90 new org.eclipse.aether.artifact.DefaultArtifact("g.id:a-id:1").setFile(new File(".")), "runtime"));
91 DefaultDependencyNode node2 = new DefaultDependencyNode(new Dependency(
92 new org.eclipse.aether.artifact.DefaultArtifact("g.id:a-id-2:2").setFile(new File(".")), "runtime"));
93
94 DependencyResult dependencyResult = new DependencyResult(new DependencyRequest());
95 DefaultDependencyNode rootDependencyNode = new DefaultDependencyNode((Dependency) null);
96 rootDependencyNode.setChildren(Arrays.asList(node1, node2));
97 dependencyResult.setRoot(rootDependencyNode);
98
99 when(repositorySystem.resolveDependencies(eq(systemSession), any())).thenReturn(dependencyResult);
100
101 final ResolutionManagementInfo info = new ResolutionManagementInfo();
102 resolver.updateDependencySetResolutionRequirements(systemSession, ds, info, project);
103 assertEquals(artifacts, info.getArtifacts());
104
105 info.getArtifacts().forEach(artifact -> {
106 assertEquals(2, artifact.getDependencyTrail().size());
107 assertEquals(
108 project.getArtifact().getId(), artifact.getDependencyTrail().get(0));
109 assertEquals(artifact.getId(), artifact.getDependencyTrail().get(1));
110 });
111 }
112
113 @Test
114 public void testGetDependencySetResolutionRequirementsNonTransitive() throws DependencyResolutionException {
115 final DependencySet ds = new DependencySet();
116 ds.setScope(Artifact.SCOPE_SYSTEM);
117 ds.setUseTransitiveDependencies(false);
118
119 final MavenProject project = createMavenProject("main-group", "main-artifact", "1", null);
120
121 Set<Artifact> dependencyArtifacts = new HashSet<>();
122 dependencyArtifacts.add(newArtifact("g.id", "a-id", "1"));
123 Set<Artifact> artifacts = new HashSet<>(dependencyArtifacts);
124 artifacts.add(newArtifact("g.id", "a-id-2", "2"));
125 project.setArtifacts(artifacts);
126 project.setDependencyArtifacts(dependencyArtifacts);
127
128 final ResolutionManagementInfo info = new ResolutionManagementInfo();
129 resolver.updateDependencySetResolutionRequirements(systemSession, ds, info, project);
130 assertEquals(dependencyArtifacts, info.getArtifacts());
131 }
132
133 @Test
134 public void testGetModuleSetResolutionRequirementsWithoutBinaries() throws DependencyResolutionException {
135 final File rootDir = new File("root");
136 final MavenProject project = createMavenProject("main-group", "main-artifact", "1", rootDir);
137 final MavenProject module1 = createMavenProject("main-group", "module-1", "1", new File(rootDir, "module-1"));
138 final MavenProject module2 = createMavenProject("main-group", "module-2", "1", new File(rootDir, "module-2"));
139
140 project.getModel().addModule(module1.getArtifactId());
141 project.getModel().addModule(module2.getArtifactId());
142
143 final ResolutionManagementInfo info = new ResolutionManagementInfo();
144
145 final ModuleSet ms = new ModuleSet();
146 ms.setBinaries(null);
147
148 resolver.updateModuleSetResolutionRequirements(ms, new DependencySet(), info, null);
149 assertTrue(info.getArtifacts().isEmpty());
150 }
151
152 @Test
153 public void testGetModuleSetResolutionRequirementsIncludeDeps() throws Exception {
154 final File rootDir = new File("root");
155 final MavenProject project = createMavenProject("main-group", "main-artifact", "1", rootDir);
156 final MavenProject module1 = createMavenProject("main-group", "module-1", "1", new File(rootDir, "module-1"));
157 final MavenProject module2 = createMavenProject("main-group", "module-2", "1", new File(rootDir, "module-2"));
158
159 Set<Artifact> module1Artifacts = Collections.singleton(newArtifact("group.id", "module-1-dep", "1"));
160 Set<Artifact> module2Artifacts = Collections.singleton(newArtifact("group.id", "module-2-dep", "1"));
161 module1.setArtifacts(module1Artifacts);
162 module2.setArtifacts(module2Artifacts);
163
164 project.getModel().addModule(module1.getArtifactId());
165 project.getModel().addModule(module2.getArtifactId());
166
167 final AssemblerConfigurationSource cs = mock(AssemblerConfigurationSource.class);
168 when(cs.getReactorProjects()).thenReturn(Arrays.asList(project, module1, module2));
169 when(cs.getProject()).thenReturn(project);
170 MavenSession mavenSession = mock(MavenSession.class);
171 when(cs.getMavenSession()).thenReturn(mavenSession);
172 when(mavenSession.getRepositorySession()).thenReturn(systemSession);
173
174 final ResolutionManagementInfo info = new ResolutionManagementInfo();
175
176 final ModuleSet ms = new ModuleSet();
177 final ModuleBinaries mb = new ModuleBinaries();
178 mb.setIncludeDependencies(true);
179 ms.setBinaries(mb);
180
181 ms.addInclude("*:module-1");
182
183 DefaultDependencyNode node1 = new DefaultDependencyNode(new Dependency(
184 new org.eclipse.aether.artifact.DefaultArtifact("group.id:module-1-dep:1").setFile(new File(".")),
185 "runtime"));
186
187 DependencyResult dependencyResult = new DependencyResult(new DependencyRequest());
188 DefaultDependencyNode rootDependencyNode = new DefaultDependencyNode((Dependency) null);
189 rootDependencyNode.setChildren(Collections.singletonList(node1));
190 dependencyResult.setRoot(rootDependencyNode);
191
192 when(repositorySystem.resolveDependencies(eq(systemSession), any())).thenReturn(dependencyResult);
193
194 resolver.updateModuleSetResolutionRequirements(ms, new DependencySet(), info, cs);
195 assertEquals(module1Artifacts, info.getArtifacts());
196
197
198 verify(cs).getReactorProjects();
199 verify(cs).getProject();
200 }
201
202 private MavenProject createMavenProject(
203 final String groupId, final String artifactId, final String version, final File basedir) {
204 final Model model = new Model();
205
206 model.setGroupId(groupId);
207 model.setArtifactId(artifactId);
208 model.setVersion(version);
209 model.setPackaging("pom");
210
211 final MavenProject project = new MavenProject(model);
212
213 final Artifact pomArtifact = newArtifact(groupId, artifactId, version);
214 project.setArtifact(pomArtifact);
215 project.setArtifacts(new HashSet<>());
216 project.setDependencyArtifacts(new HashSet<>());
217
218 project.setFile(new File(basedir, "pom.xml"));
219
220 return project;
221 }
222
223 private Artifact newArtifact(final String groupId, final String artifactId, final String version) {
224 return new DefaultArtifact(
225 groupId,
226 artifactId,
227 VersionRange.createFromVersion(version),
228 "compile",
229 "jar",
230 null,
231 new DefaultArtifactHandler());
232 }
233 }