1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.shared.release.phase;
20
21 import javax.inject.Inject;
22 import javax.inject.Named;
23
24 import java.io.File;
25 import java.io.IOException;
26 import java.nio.file.Path;
27 import java.util.List;
28 import java.util.Objects;
29
30 import org.apache.maven.project.MavenProject;
31 import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
32 import org.apache.maven.scm.repository.ScmRepository;
33 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
34 import org.apache.maven.shared.release.config.ReleaseUtils;
35 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
36 import org.apache.maven.shared.release.util.ReleaseUtil;
37 import org.codehaus.plexus.testing.PlexusTest;
38 import org.junit.jupiter.api.Test;
39
40 import static org.codehaus.plexus.testing.PlexusExtension.getTestFile;
41 import static org.junit.jupiter.api.Assertions.assertEquals;
42 import static org.junit.jupiter.api.Assertions.assertFalse;
43 import static org.junit.jupiter.api.Assertions.assertTrue;
44
45
46
47
48
49
50 @PlexusTest
51 class RewritePomsForBranchPhaseTest extends AbstractEditModeRewritingReleasePhaseTestCase {
52 private static final String NEXT_VERSION = "1.0-SNAPSHOT";
53
54 private static final String ALTERNATIVE_NEXT_VERSION = "2.0-SNAPSHOT";
55
56 @Inject
57 @Named("rewrite-poms-for-branch")
58 private ReleasePhase phase;
59
60 @Override
61 protected ReleasePhase getTestedPhase() {
62 return phase;
63 }
64
65 @Override
66 protected Path getWorkingDirectory(String workingDir) {
67 return super.getWorkingDirectory("rewrite-for-branch/" + workingDir);
68 }
69
70 @Override
71 protected List<MavenProject> prepareReactorProjects(String path) throws Exception {
72 String dir = "rewrite-for-branch/" + Objects.toString(path, "");
73 return createReactorProjects(dir, path, null);
74 }
75
76 @Override
77 protected String readTestProjectFile(String fileName) throws IOException {
78 return ReleaseUtil.readXmlFile(getTestFile("target/test-classes/projects/rewrite-for-branch/" + fileName));
79 }
80
81 @Test
82 void testSimulateRewrite() throws Exception {
83 List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
84 ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom");
85 builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
86
87 String expected = readTestProjectFile("basic-pom/pom.xml");
88
89 phase.simulate(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
90
91 String actual = readTestProjectFile("basic-pom/pom.xml");
92 assertEquals(expected, actual, "Check the original POM untouched");
93
94 expected = readTestProjectFile("basic-pom/expected-pom.xml");
95 actual = readTestProjectFile("basic-pom/pom.xml.branch");
96 assertEquals(expected, actual, "Check the transformed POM");
97 }
98
99 @Test
100 void testRewriteWithDashedComments() throws Exception {
101 List<MavenProject> reactorProjects = createReactorProjects("basic-pom-with-dashes-in-comment");
102 ReleaseDescriptorBuilder builder =
103 createDescriptorFromBasicPom(reactorProjects, "basic-pom-with-dashes-in-comment");
104 builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
105
106 String expected = readTestProjectFile("basic-pom-with-dashes-in-comment/pom.xml");
107
108 phase.simulate(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
109
110 String actual = readTestProjectFile("basic-pom-with-dashes-in-comment/pom.xml");
111 assertEquals(expected, actual, "Check the original POM is untouched");
112
113 expected = readTestProjectFile("basic-pom-with-dashes-in-comment/expected-pom.xml");
114 actual = readTestProjectFile("basic-pom-with-dashes-in-comment/pom.xml.branch");
115 assertEquals(expected, actual, "Check the transformed POM");
116 }
117
118 @Test
119 void testClean() throws Exception {
120 List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
121 ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "basic-pom");
122 builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
123
124 File testFile = getTestFile("target/test-classes/projects/rewrite-for-branch/basic-pom/pom.xml.branch");
125 testFile.delete();
126 assertFalse(testFile.exists());
127
128 phase.simulate(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
129
130 assertTrue(testFile.exists());
131
132 ((ResourceGenerator) phase).clean(reactorProjects);
133
134 assertFalse(testFile.exists());
135 }
136
137 @Test
138 void testCleanNotExists() throws Exception {
139 List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
140 ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom");
141 builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
142
143 File testFile = getTestFile("target/test-classes/projects/rewrite-for-branch/basic-pom/pom.xml.branch");
144 testFile.delete();
145 assertFalse(testFile.exists());
146
147 ((ResourceGenerator) phase).clean(reactorProjects);
148
149 assertFalse(testFile.exists());
150 }
151
152
153 @Test
154 void testScmOverridden() throws Exception {
155 List<MavenProject> reactorProjects = createReactorProjects("pom-with-overridden-scm");
156 ReleaseDescriptorBuilder builder =
157 createConfigurationForWithParentNextVersion(reactorProjects, "pom-with-overridden-scm");
158 builder.addReleaseVersion("groupId:subsubproject", NEXT_VERSION);
159
160 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
161
162 comparePomFiles(reactorProjects);
163 }
164
165 @Override
166 protected void mapAlternateNextVersion(ReleaseDescriptorBuilder config, String projectId) {
167 config.addReleaseVersion(projectId, ALTERNATIVE_NEXT_VERSION);
168 }
169
170 @Override
171 protected void mapNextVersion(ReleaseDescriptorBuilder config, String projectId) {
172 config.addReleaseVersion(projectId, NEXT_VERSION);
173 }
174
175 @Override
176 protected ReleaseDescriptorBuilder createConfigurationForPomWithParentAlternateNextVersion(
177 List<MavenProject> reactorProjects, String workingDirectory) {
178 ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, workingDirectory);
179
180 builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
181 builder.addReleaseVersion("groupId:subproject1", ALTERNATIVE_NEXT_VERSION);
182 return builder;
183 }
184
185 @Override
186 protected ReleaseDescriptorBuilder createConfigurationForWithParentNextVersion(
187 List<MavenProject> reactorProjects, String workingDirectory) {
188 ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, workingDirectory);
189
190 builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
191 builder.addReleaseVersion("groupId:subproject1", NEXT_VERSION);
192 return builder;
193 }
194
195 @Override
196 protected void unmapNextVersion(ReleaseDescriptorBuilder config, String projectId) {
197
198 }
199
200 @Test
201 void testRewriteBasicPomWithGit() throws Exception {
202
203 List<MavenProject> reactorProjects = createReactorProjects("basic-pom-with-git");
204 ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "basic-pom-with-git");
205 mapNextVersion(builder, "groupId:artifactId");
206
207 String sourceUrl = "scm:git:git://localhost/repo";
208 SvnScmProviderRepository scmProviderRepository = new SvnScmProviderRepository(sourceUrl);
209 ScmRepository repository = new ScmRepository("git", scmProviderRepository);
210 scmManager.addScmRepositoryForUrl("scm:git:git://localhost/repo", repository);
211
212 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
213
214 comparePomFiles(reactorProjects);
215 }
216
217 @Test
218 void testRewriteBasicPomWithScmExpression() throws Exception {
219
220 List<MavenProject> reactorProjects = createReactorProjects("basic-pom-with-scm-expression");
221 ReleaseDescriptorBuilder builder =
222 createDescriptorFromProjects(reactorProjects, "basic-pom-with-scm-expression");
223 mapNextVersion(builder, "groupId:artifactId");
224
225 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
226
227 comparePomFiles(reactorProjects);
228 }
229
230 @Test
231 void testRewriteBasicPomWithTagBase() throws Exception {
232
233 List<MavenProject> reactorProjects = createReactorProjects("basic-pom-with-tag-base");
234 ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "basic-pom-with-tag-base");
235 builder.setScmBranchBase("file://localhost/tmp/scm-repo/branches");
236 mapNextVersion(builder, "groupId:artifactId");
237
238 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
239
240 comparePomFiles(reactorProjects);
241 }
242
243 @Test
244 void testRewriteBasicPomWithTagBaseAndVaryingScmUrls() throws Exception {
245 List<MavenProject> reactorProjects = createReactorProjects("basic-pom-with-tag-base-and-varying-scm-urls");
246 ReleaseDescriptorBuilder builder =
247 createDescriptorFromProjects(reactorProjects, "basic-pom-with-tag-base-and-varying-scm-urls");
248 builder.setScmBranchBase("file://localhost/tmp/scm-repo/allprojects/branches");
249 mapNextVersion(builder, "groupId:artifactId");
250
251 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
252
253 comparePomFiles(reactorProjects);
254 }
255
256 @Test
257 void testRewriteBasicPomWithGitFromTag() throws Exception {
258 List<MavenProject> reactorProjects = createReactorProjects("basic-pom-with-git-from-tag");
259 ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "basic-pom-with-git-from-tag");
260 mapNextVersion(builder, "groupId:artifactId");
261
262 String sourceUrl = "scm:git:git://localhost/repo";
263 SvnScmProviderRepository scmProviderRepository = new SvnScmProviderRepository(sourceUrl);
264 ScmRepository repository = new ScmRepository("git", scmProviderRepository);
265 scmManager.addScmRepositoryForUrl("scm:git:git://localhost/repo", repository);
266
267 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
268
269 comparePomFiles(reactorProjects);
270 }
271
272 @Test
273 void testRewriteBasicPomWithEmptyScm() throws Exception {
274 List<MavenProject> reactorProjects = createReactorProjects("basic-pom-with-empty-scm");
275 ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "basic-pom-with-empty-scm");
276 mapNextVersion(builder, "groupId:artifactId");
277
278 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
279
280 comparePomFiles(reactorProjects);
281 }
282
283 @Test
284 void testRewriteInterpolatedVersions() throws Exception {
285 List<MavenProject> reactorProjects = createReactorProjects("interpolated-versions");
286 ReleaseDescriptorBuilder builder = createMappedConfiguration(reactorProjects, "interpolated-versions");
287
288 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
289
290 comparePomFiles(reactorProjects);
291 }
292
293 @Test
294 void testRewriteInterpolatedVersionsDifferentVersion() throws Exception {
295 List<MavenProject> reactorProjects = createReactorProjects("interpolated-versions");
296 ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "interpolated-versions");
297
298 builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
299 builder.addReleaseVersion("groupId:subproject1", ALTERNATIVE_NEXT_VERSION);
300 builder.addReleaseVersion("groupId:subproject2", NEXT_VERSION);
301 builder.addReleaseVersion("groupId:subproject3", NEXT_VERSION);
302
303 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
304
305 for (MavenProject project : reactorProjects) {
306
307 if (!"groupId".equals(project.getGroupId()) || !"subproject1".equals(project.getArtifactId())) {
308 comparePomFiles(project, "-different-version", true);
309 }
310 }
311 }
312
313 @Test
314 void testRewriteBasicPomWithInheritedScm() throws Exception {
315 List<MavenProject> reactorProjects = createReactorProjects("basic-pom-inherited-scm");
316 ReleaseDescriptorBuilder builder =
317 createConfigurationForWithParentNextVersion(reactorProjects, "basic-pom-inherited-scm");
318 builder.addReleaseVersion("groupId:subsubproject", NEXT_VERSION);
319
320 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
321
322 comparePomFiles(reactorProjects);
323 }
324
325 @Test
326 void testRewritePomWithParentAndProperties() throws Exception {
327 List<MavenProject> reactorProjects = createReactorProjects("pom-with-parent-and-properties");
328
329 ReleaseDescriptorBuilder builder =
330 createDescriptorFromProjects(reactorProjects, "pom-with-parent-and-properties");
331 builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
332 builder.addReleaseVersion("groupId:subproject1", ALTERNATIVE_NEXT_VERSION);
333 builder.addReleaseVersion("groupId:subproject2", ALTERNATIVE_NEXT_VERSION);
334
335 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
336
337 comparePomFiles(reactorProjects);
338 }
339
340
341 @Test
342 void testRewritePomWithDependencyPropertyCoordinate() throws Exception {
343 List<MavenProject> reactorProjects = createReactorProjects("pom-with-property-dependency-coordinate");
344
345 ReleaseDescriptorBuilder builder =
346 createDescriptorFromProjects(reactorProjects, "pom-with-property-dependency-coordinate");
347 builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
348 builder.addReleaseVersion("groupId:subproject1-3.4", ALTERNATIVE_NEXT_VERSION);
349 builder.addReleaseVersion("groupId:subproject2", ALTERNATIVE_NEXT_VERSION);
350
351 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
352
353 comparePomFiles(reactorProjects);
354 }
355
356
357 @Test
358 void testRewritePomWithScmOfParentEndingWithASlash() throws Exception {
359 List<MavenProject> reactorProjects = createReactorProjects("pom-with-scm-of-parent-ending-with-a-slash");
360
361 ReleaseDescriptorBuilder builder =
362 createDescriptorFromProjects(reactorProjects, "pom-with-scm-of-parent-ending-with-a-slash");
363 builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
364 builder.addReleaseVersion("groupId:subproject1", ALTERNATIVE_NEXT_VERSION);
365
366 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
367
368 comparePomFiles(reactorProjects);
369 }
370
371 @Test
372 void testRewritePomWithDeepSubprojects() throws Exception {
373 List<MavenProject> reactorProjects = createReactorProjects("multimodule-with-deep-subprojects");
374
375 ReleaseDescriptorBuilder builder =
376 createDescriptorFromProjects(reactorProjects, "multimodule-with-deep-subprojects");
377 builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
378 builder.addReleaseVersion("groupId:subproject1", ALTERNATIVE_NEXT_VERSION);
379 builder.addReleaseVersion("groupId:subproject2", ALTERNATIVE_NEXT_VERSION);
380
381 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
382
383 comparePomFiles(reactorProjects);
384 }
385
386 @Test
387 void testRewritePomForFlatMultiModule() throws Exception {
388 List<MavenProject> reactorProjects = createReactorProjects(
389 "rewrite-for-branch/pom-with-parent-flat", "pom-with-parent-flat", "root-project");
390 ReleaseDescriptorBuilder builder =
391 createConfigurationForPomWithParentAlternateNextVersion(reactorProjects, "pom-with-parent-flat");
392
393 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
394
395 comparePomFiles(reactorProjects);
396 }
397
398
399 @Test
400 void testRewritePomWithCDATASectionOnWindows() throws Exception {
401 List<MavenProject> reactorProjects = createReactorProjects("cdata-section");
402 ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "cdata-section");
403 mapNextVersion(builder, "groupId:artifactId");
404
405 AbstractRewritePomsPhase phase = (AbstractRewritePomsPhase) this.phase;
406 ReleaseDescriptorBuilder.BuilderReleaseDescriptor builderReleaseDescriptor =
407 ReleaseUtils.buildReleaseDescriptor(builder);
408 builderReleaseDescriptor.setLineSeparator("\r\n");
409 phase.execute(builderReleaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects);
410
411
412 comparePomFiles(reactorProjects, false);
413 }
414
415 protected ReleaseDescriptorBuilder createDescriptorFromProjects(
416 List<MavenProject> reactorProjects, String workingDirectory) {
417 ReleaseDescriptorBuilder builder = super.createDescriptorFromProjects(reactorProjects, workingDirectory);
418 builder.setScmReleaseLabel("release-label");
419 return builder;
420 }
421
422
423 @Test
424 void testRewritePomWithImportedDependencyManagementInReactor() throws Exception {
425 List<MavenProject> reactorProjects = createReactorProjects("imported-dependency-management-in-reactor");
426 ReleaseDescriptorBuilder builder =
427 createMappedConfiguration(reactorProjects, "imported-dependency-management-in-reactor");
428
429 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
430
431 comparePomFiles(reactorProjects);
432 }
433
434 @Test
435 void testRewritePomWithDifferentVersionsAcrossModules() throws Exception {
436 List<MavenProject> reactorProjects = createReactorProjects("modules-with-different-versions");
437 ReleaseDescriptorBuilder builder =
438 createMappedConfiguration(reactorProjects, "modules-with-different-versions");
439 builder.addReleaseVersion("groupId:subproject2", ALTERNATIVE_NEXT_VERSION);
440
441 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
442
443 comparePomFiles(reactorProjects);
444 }
445 }