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