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