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 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   * Test the SCM modification check phase.
41   *
42   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
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     // MRELEASE-116
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         // nothing to do
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             // skip subproject1 - we don't need to worry about its version mapping change, it has no deps of any kind
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     // MRELEASE-311
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     // MRELEASE-305
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     // MRELEASE-383
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         // compare POMS without line ending normalization
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     // MRELEASE-454
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 }