1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.project;
20
21 import java.io.File;
22 import java.util.Collections;
23 import java.util.List;
24
25 import org.apache.maven.artifact.InvalidRepositoryException;
26 import org.apache.maven.bridge.MavenRepositorySystem;
27 import org.apache.maven.model.Dependency;
28 import org.apache.maven.model.Parent;
29 import org.apache.maven.model.resolution.ModelResolver;
30 import org.apache.maven.model.resolution.UnresolvableModelException;
31 import org.eclipse.aether.DefaultRepositorySystemSession;
32 import org.eclipse.aether.RepositorySystem;
33 import org.eclipse.aether.impl.RemoteRepositoryManager;
34 import org.eclipse.aether.repository.RemoteRepository;
35 import org.junit.jupiter.api.Test;
36
37 import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
38 import static org.hamcrest.MatcherAssert.assertThat;
39 import static org.hamcrest.Matchers.containsString;
40 import static org.junit.jupiter.api.Assertions.assertEquals;
41 import static org.junit.jupiter.api.Assertions.assertNotNull;
42 import static org.junit.jupiter.api.Assertions.assertThrows;
43
44
45
46
47
48
49 class ProjectModelResolverTest extends AbstractMavenProjectTestCase {
50
51
52
53
54 public ProjectModelResolverTest() {
55 super();
56 }
57
58 @Test
59 void testResolveParentThrowsUnresolvableModelExceptionWhenNotFound() throws Exception {
60 final Parent parent = new Parent();
61 parent.setGroupId("org.apache");
62 parent.setArtifactId("apache");
63 parent.setVersion("0");
64
65 UnresolvableModelException e = assertThrows(
66 UnresolvableModelException.class,
67 () -> newModelResolver().resolveModel(parent),
68 "Expected 'UnresolvableModelException' not thrown.");
69 assertNotNull(e.getMessage());
70 assertThat(e.getMessage(), containsString("Could not find artifact org.apache:apache:pom:0 in central"));
71 }
72
73 @Test
74 void testResolveParentThrowsUnresolvableModelExceptionWhenNoMatchingVersionFound() throws Exception {
75 final Parent parent = new Parent();
76 parent.setGroupId("org.apache");
77 parent.setArtifactId("apache");
78 parent.setVersion("[2.0,2.1)");
79
80 UnresolvableModelException e = assertThrows(
81 UnresolvableModelException.class,
82 () -> newModelResolver().resolveModel(parent),
83 "Expected 'UnresolvableModelException' not thrown.");
84 assertEquals("No versions matched the requested parent version range '[2.0,2.1)'", e.getMessage());
85 }
86
87 @Test
88 void testResolveParentThrowsUnresolvableModelExceptionWhenUsingRangesWithoutUpperBound() throws Exception {
89 final Parent parent = new Parent();
90 parent.setGroupId("org.apache");
91 parent.setArtifactId("apache");
92 parent.setVersion("[1,)");
93
94 UnresolvableModelException e = assertThrows(
95 UnresolvableModelException.class,
96 () -> newModelResolver().resolveModel(parent),
97 "Expected 'UnresolvableModelException' not thrown.");
98 assertEquals("The requested parent version range '[1,)' does not specify an upper bound", e.getMessage());
99 }
100
101 @Test
102 void testResolveParentSuccessfullyResolvesExistingParentWithoutRange() throws Exception {
103 final Parent parent = new Parent();
104 parent.setGroupId("org.apache");
105 parent.setArtifactId("apache");
106 parent.setVersion("1");
107
108 assertNotNull(this.newModelResolver().resolveModel(parent));
109 assertEquals("1", parent.getVersion());
110 }
111
112 @Test
113 void testResolveParentSuccessfullyResolvesExistingParentUsingHighestVersion() throws Exception {
114 final Parent parent = new Parent();
115 parent.setGroupId("org.apache");
116 parent.setArtifactId("apache");
117 parent.setVersion("(,2.0)");
118
119 assertNotNull(this.newModelResolver().resolveModel(parent));
120 assertEquals("1", parent.getVersion());
121 }
122
123 @Test
124 void testResolveDependencyThrowsUnresolvableModelExceptionWhenNotFound() throws Exception {
125 final Dependency dependency = new Dependency();
126 dependency.setGroupId("org.apache");
127 dependency.setArtifactId("apache");
128 dependency.setVersion("0");
129
130 UnresolvableModelException e = assertThrows(
131 UnresolvableModelException.class,
132 () -> newModelResolver().resolveModel(dependency),
133 "Expected 'UnresolvableModelException' not thrown.");
134 assertNotNull(e.getMessage());
135 assertThat(e.getMessage(), containsString("Could not find artifact org.apache:apache:pom:0 in central"));
136 }
137
138 @Test
139 void testResolveDependencyThrowsUnresolvableModelExceptionWhenNoMatchingVersionFound() throws Exception {
140 final Dependency dependency = new Dependency();
141 dependency.setGroupId("org.apache");
142 dependency.setArtifactId("apache");
143 dependency.setVersion("[2.0,2.1)");
144
145 UnresolvableModelException e = assertThrows(
146 UnresolvableModelException.class,
147 () -> newModelResolver().resolveModel(dependency),
148 "Expected 'UnresolvableModelException' not thrown.");
149 assertEquals("No versions matched the requested dependency version range '[2.0,2.1)'", e.getMessage());
150 }
151
152 @Test
153 void testResolveDependencyThrowsUnresolvableModelExceptionWhenUsingRangesWithoutUpperBound() throws Exception {
154 final Dependency dependency = new Dependency();
155 dependency.setGroupId("org.apache");
156 dependency.setArtifactId("apache");
157 dependency.setVersion("[1,)");
158
159 UnresolvableModelException e = assertThrows(
160 UnresolvableModelException.class,
161 () -> newModelResolver().resolveModel(dependency),
162 "Expected 'UnresolvableModelException' not thrown.");
163 assertEquals("The requested dependency version range '[1,)' does not specify an upper bound", e.getMessage());
164 }
165
166 @Test
167 void testResolveDependencySuccessfullyResolvesExistingDependencyWithoutRange() throws Exception {
168 final Dependency dependency = new Dependency();
169 dependency.setGroupId("org.apache");
170 dependency.setArtifactId("apache");
171 dependency.setVersion("1");
172
173 assertNotNull(this.newModelResolver().resolveModel(dependency));
174 assertEquals("1", dependency.getVersion());
175 }
176
177 @Test
178 void testResolveDependencySuccessfullyResolvesExistingDependencyUsingHighestVersion() throws Exception {
179 final Dependency dependency = new Dependency();
180 dependency.setGroupId("org.apache");
181 dependency.setArtifactId("apache");
182 dependency.setVersion("(,2.0)");
183
184 assertNotNull(this.newModelResolver().resolveModel(dependency));
185 assertEquals("1", dependency.getVersion());
186 }
187
188 private ModelResolver newModelResolver() throws Exception {
189 final File localRepo = new File(this.getLocalRepository().getBasedir());
190 final DefaultRepositorySystemSession repoSession = new DefaultRepositorySystemSession(h -> false);
191 repoSession.setLocalRepositoryManager(new LegacyLocalRepositoryManager(localRepo));
192
193 return new ProjectModelResolver(
194 repoSession,
195 null,
196 getContainer().lookup(RepositorySystem.class),
197 getContainer().lookup(RemoteRepositoryManager.class),
198 this.getRemoteRepositories(),
199 ProjectBuildingRequest.RepositoryMerging.REQUEST_DOMINANT,
200 null);
201 }
202
203 private List<RemoteRepository> getRemoteRepositories() throws InvalidRepositoryException {
204 final File repoDir = new File(getBasedir(), "src/test/remote-repo").getAbsoluteFile();
205 final RemoteRepository remoteRepository = new RemoteRepository.Builder(
206 MavenRepositorySystem.DEFAULT_REMOTE_REPO_ID,
207 "default",
208 repoDir.toURI().toASCIIString())
209 .build();
210
211 return Collections.singletonList(remoteRepository);
212 }
213 }