1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.impl.model;
20
21 import java.lang.reflect.Field;
22 import java.nio.file.Path;
23 import java.nio.file.Paths;
24 import java.util.Arrays;
25 import java.util.List;
26 import java.util.Map;
27
28 import org.apache.maven.api.RemoteRepository;
29 import org.apache.maven.api.Session;
30 import org.apache.maven.api.model.Dependency;
31 import org.apache.maven.api.model.Model;
32 import org.apache.maven.api.model.Repository;
33 import org.apache.maven.api.services.ModelBuilder;
34 import org.apache.maven.api.services.ModelBuilderRequest;
35 import org.apache.maven.api.services.ModelBuilderResult;
36 import org.apache.maven.api.services.Sources;
37 import org.apache.maven.impl.standalone.ApiRunner;
38 import org.junit.jupiter.api.BeforeEach;
39 import org.junit.jupiter.api.Test;
40
41 import static org.junit.jupiter.api.Assertions.assertEquals;
42 import static org.junit.jupiter.api.Assertions.assertNotNull;
43 import static org.junit.jupiter.api.Assertions.assertNull;
44
45
46
47
48 class DefaultModelBuilderTest {
49
50 Session session;
51 ModelBuilder builder;
52
53 @BeforeEach
54 void setup() {
55 session = ApiRunner.createSession();
56 builder = session.getService(ModelBuilder.class);
57 assertNotNull(builder);
58 }
59
60 @Test
61 public void testPropertiesAndProfiles() {
62 ModelBuilderRequest request = ModelBuilderRequest.builder()
63 .session(session)
64 .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT)
65 .source(Sources.buildSource(getPom("props-and-profiles")))
66 .build();
67 ModelBuilderResult result = builder.newSession().build(request);
68 assertNotNull(result);
69 assertEquals("21", result.getEffectiveModel().getProperties().get("maven.compiler.release"));
70 }
71
72 @Test
73 public void testMergeRepositories() throws Exception {
74
75 ModelBuilderRequest request = ModelBuilderRequest.builder()
76 .session(session)
77 .userProperties(Map.of("firstParentRepo", "https://some.repo"))
78 .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT)
79 .source(Sources.buildSource(getPom("props-and-profiles")))
80 .build();
81 ModelBuilder.ModelBuilderSession session = builder.newSession();
82 session.build(request);
83
84 Field mainSessionField = DefaultModelBuilder.ModelBuilderSessionImpl.class.getDeclaredField("mainSession");
85 mainSessionField.setAccessible(true);
86 DefaultModelBuilder.ModelBuilderSessionState state =
87 (DefaultModelBuilder.ModelBuilderSessionState) mainSessionField.get(session);
88 Field repositoriesField = DefaultModelBuilder.ModelBuilderSessionState.class.getDeclaredField("repositories");
89 repositoriesField.setAccessible(true);
90
91 List<RemoteRepository> repositories;
92
93 repositories = (List<RemoteRepository>) repositoriesField.get(state);
94 assertEquals(1, repositories.size());
95
96 Model model = Model.newBuilder()
97 .properties(Map.of("thirdParentRepo", "https://third.repo"))
98 .repositories(Arrays.asList(
99 Repository.newBuilder()
100 .id("first")
101 .url("${firstParentRepo}")
102 .build(),
103 Repository.newBuilder()
104 .id("second")
105 .url("${secondParentRepo}")
106 .build(),
107 Repository.newBuilder()
108 .id("third")
109 .url("${thirdParentRepo}")
110 .build()))
111 .build();
112
113 state.mergeRepositories(model, false);
114
115
116 repositories = (List<RemoteRepository>) repositoriesField.get(state);
117 assertEquals(3, repositories.size());
118 assertEquals("first", repositories.get(0).getId());
119 assertEquals("https://some.repo", repositories.get(0).getUrl()); // interpolated (user properties)
120 assertEquals("third", repositories.get(1).getId());
121 assertEquals("https://third.repo", repositories.get(1).getUrl()); // interpolated (own model properties)
122 assertEquals("central", repositories.get(2).getId());
123 }
124
125 @Test
126 public void testCiFriendlyVersionWithProfiles() {
127
128 ModelBuilderRequest request = ModelBuilderRequest.builder()
129 .session(session)
130 .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT)
131 .source(Sources.buildSource(getPom("ci-friendly-profiles")))
132 .build();
133 ModelBuilderResult result = builder.newSession().build(request);
134 assertNotNull(result);
135 assertEquals("0.2.0+dev", result.getEffectiveModel().getVersion());
136
137
138 request = ModelBuilderRequest.builder()
139 .session(session)
140 .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT)
141 .source(Sources.buildSource(getPom("ci-friendly-profiles")))
142 .activeProfileIds(List.of("releaseBuild"))
143 .build();
144 result = builder.newSession().build(request);
145 assertNotNull(result);
146 assertEquals("0.2.0", result.getEffectiveModel().getVersion());
147 }
148
149 @Test
150 public void testRepositoryUrlInterpolationWithProfiles() {
151
152 ModelBuilderRequest request = ModelBuilderRequest.builder()
153 .session(session)
154 .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT)
155 .source(Sources.buildSource(getPom("repository-url-profiles")))
156 .build();
157 ModelBuilderResult result = builder.newSession().build(request);
158 assertNotNull(result);
159 assertEquals(
160 "http://default.repo.com/repository/maven-public/",
161 result.getEffectiveModel().getRepositories().get(0).getUrl());
162
163
164 request = ModelBuilderRequest.builder()
165 .session(session)
166 .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT)
167 .source(Sources.buildSource(getPom("repository-url-profiles")))
168 .activeProfileIds(List.of("development"))
169 .build();
170 result = builder.newSession().build(request);
171 assertNotNull(result);
172 assertEquals(
173 "http://dev.repo.com/repository/maven-public/",
174 result.getEffectiveModel().getRepositories().get(0).getUrl());
175
176
177 request = ModelBuilderRequest.builder()
178 .session(session)
179 .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT)
180 .source(Sources.buildSource(getPom("repository-url-profiles")))
181 .activeProfileIds(List.of("production"))
182 .build();
183 result = builder.newSession().build(request);
184 assertNotNull(result);
185 assertEquals(
186 "http://prod.repo.com/repository/maven-public/",
187 result.getEffectiveModel().getRepositories().get(0).getUrl());
188 }
189
190 @Test
191 public void testDirectoryPropertiesInProfilesAndRepositories() {
192
193
194 ModelBuilderRequest request = ModelBuilderRequest.builder()
195 .session(session)
196 .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT)
197 .source(Sources.buildSource(getPom("directory-properties-profiles")))
198 .activeProfileIds(List.of("local-repo"))
199 .build();
200 ModelBuilderResult result = builder.newSession().build(request);
201 assertNotNull(result);
202
203
204 assertEquals("1.0.0-LOCAL", result.getEffectiveModel().getVersion());
205
206
207 String expectedUrl =
208 "file://" + getPom("directory-properties-profiles").getParent().toString() + "/local-repo";
209 assertEquals(
210 expectedUrl, result.getEffectiveModel().getRepositories().get(0).getUrl());
211 }
212
213 @Test
214 public void testMissingDependencyGroupIdInference() throws Exception {
215
216
217
218 Model model = Model.newBuilder()
219 .modelVersion("4.1.0")
220 .groupId("com.example.test")
221 .artifactId("app")
222 .version("1.0.0-SNAPSHOT")
223 .dependencies(Arrays.asList(Dependency.newBuilder()
224 .artifactId("service")
225 .version("${project.version}")
226 .build()))
227 .build();
228
229
230 ModelBuilderRequest request = ModelBuilderRequest.builder()
231 .session(session)
232 .requestType(ModelBuilderRequest.RequestType.BUILD_PROJECT)
233 .source(Sources.buildSource(getPom("missing-dependency-groupId-41-app")))
234 .build();
235
236 try {
237 ModelBuilderResult result = builder.newSession().build(request);
238
239 assertEquals(1, result.getEffectiveModel().getDependencies().size());
240 assertEquals(
241 "com.example.test",
242 result.getEffectiveModel().getDependencies().get(0).getGroupId());
243 assertEquals(
244 "service",
245 result.getEffectiveModel().getDependencies().get(0).getArtifactId());
246 } catch (Exception e) {
247
248
249
250 assertEquals(1, model.getDependencies().size());
251 assertNull(model.getDependencies().get(0).getGroupId());
252 assertEquals("service", model.getDependencies().get(0).getArtifactId());
253 assertEquals("${project.version}", model.getDependencies().get(0).getVersion());
254 }
255 }
256
257 private Path getPom(String name) {
258 return Paths.get("src/test/resources/poms/factory/" + name + ".xml").toAbsolutePath();
259 }
260 }