View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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   * Test the SCM modification check phase.
47   *
48   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
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     // MRELEASE-116
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         // nothing to do
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             // skip subproject1 - we don't need to worry about its version mapping change, it has no deps of any kind
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     // MRELEASE-311
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     // MRELEASE-305
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     // MRELEASE-383
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         // compare POMS without line ending normalization
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     // MRELEASE-454
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 }