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.LinkedList;
25  import java.util.List;
26  
27  import org.apache.maven.artifact.ArtifactUtils;
28  import org.apache.maven.model.Scm;
29  import org.apache.maven.project.MavenProject;
30  import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
31  import org.apache.maven.shared.release.config.ReleaseUtils;
32  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
33  import org.apache.maven.shared.release.util.ReleaseUtil;
34  import org.junit.Test;
35  
36  import static org.junit.Assert.assertEquals;
37  import static org.junit.Assert.assertFalse;
38  import static org.junit.Assert.assertTrue;
39  
40  /**
41   * Test the SCM modification check phase.
42   *
43   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
44   */
45  public class RewritePomsForDevelopmentPhaseTest extends AbstractEditModeRewritingReleasePhaseTestCase {
46      private static final String NEXT_VERSION = "1.1-SNAPSHOT";
47  
48      private static final String ALTERNATIVE_NEXT_VERSION = "2.1-SNAPSHOT";
49  
50      private static final String RELEASE_VERSION = "1.0";
51  
52      private static final String ALTERNATIVE_RELEASE_VERSION = "2.0";
53  
54      public RewritePomsForDevelopmentPhaseTest(String modelETL) {
55          super(modelETL);
56      }
57  
58      @Override
59      protected String getRoleHint() {
60          return "rewrite-poms-for-development";
61      }
62  
63      @Override
64      protected Path getWorkingDirectory(String workingDir) {
65          return super.getWorkingDirectory("rewrite-for-development/" + workingDir);
66      }
67  
68      @Test
69      public void testSimulateRewrite() throws Exception {
70          List<MavenProject> reactorProjects = createReactorProjectsWhenSimulated("basic-pom");
71          ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom");
72          builder.addReleaseVersion("groupId:artifactId", RELEASE_VERSION);
73          builder.addDevelopmentVersion("groupId:artifactId", NEXT_VERSION);
74  
75          String expected = readTestProjectFile("basic-pom/pom.xml");
76  
77          phase.simulate(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
78  
79          String actual = readTestProjectFile("basic-pom/pom.xml");
80          assertEquals("Check the original POM untouched", expected, actual);
81  
82          expected = readTestProjectFile("basic-pom/expected-pom.xml");
83          actual = readTestProjectFile("basic-pom/pom.xml.next");
84          assertEquals("Check the transformed POM", expected, actual);
85      }
86  
87      private List<MavenProject> createReactorProjectsWhenSimulated(String name) throws Exception {
88          return createReactorProjects("rewrite-for-release/" + name, name, null);
89      }
90  
91      @Test
92      public void testSimulateRewriteEjbClientDeps() throws Exception {
93          List<MavenProject> reactorProjects =
94                  new LinkedList<>(createReactorProjects("basic-pom-ejb-client-dep/project"));
95          reactorProjects.addAll(createReactorProjects("basic-pom-ejb-client-dep/ejb"));
96          ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom-ejb-client-dep");
97          builder.addReleaseVersion("groupId:artifactId", RELEASE_VERSION);
98          builder.addDevelopmentVersion("groupId:artifactId", NEXT_VERSION);
99          builder.addDevelopmentVersion(ArtifactUtils.versionlessKey("groupId", "artifactId1"), NEXT_VERSION);
100         builder.addReleaseVersion(ArtifactUtils.versionlessKey("groupId", "artifactId1"), RELEASE_VERSION);
101 
102         String expected = readTestProjectFile("basic-pom-ejb-client-dep/project/pom.xml");
103 
104         phase.simulate(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
105 
106         String actual = readTestProjectFile("basic-pom-ejb-client-dep/project/pom.xml");
107         assertEquals("Check the original POM untouched", expected, actual);
108 
109         expected = readTestProjectFile("basic-pom-ejb-client-dep/project/expected-pom.xml");
110         actual = readTestProjectFile("basic-pom-ejb-client-dep/project/pom.xml.next");
111         assertEquals("Check the transformed POM", expected, actual);
112     }
113 
114     @Test
115     public void testClean() throws Exception {
116         List<MavenProject> reactorProjects = createReactorProjectsWhenSimulated("basic-pom");
117         ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom");
118         builder.addReleaseVersion("groupId:artifactId", RELEASE_VERSION);
119         builder.addDevelopmentVersion("groupId:artifactId", NEXT_VERSION);
120 
121         File testFile = getTestFile("target/test-classes/projects/rewrite-for-development/basic-pom/pom.xml.next");
122         testFile.delete();
123         assertFalse(testFile.exists());
124 
125         phase.simulate(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
126 
127         assertTrue(testFile.exists());
128 
129         ((ResourceGenerator) phase).clean(reactorProjects);
130 
131         assertFalse(testFile.exists());
132     }
133 
134     @Test
135     public void testCleanNotExists() throws Exception {
136         List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
137 
138         File testFile = getTestFile("target/test-classes/projects/rewrite-for-development/basic-pom/pom.xml.next");
139         testFile.delete();
140         assertFalse(testFile.exists());
141 
142         ((ResourceGenerator) phase).clean(reactorProjects);
143 
144         assertFalse(testFile.exists());
145     }
146 
147     @Override
148     protected String readTestProjectFile(String fileName) throws IOException {
149         return readTestProjectFile(fileName, "rewrite-for-development/");
150     }
151 
152     protected String readTestProjectFile(String fileName, String subpath) throws IOException {
153         return ReleaseUtil.readXmlFile(getTestFile("target/test-classes/projects/" + subpath + fileName));
154     }
155 
156     @Override
157     protected List<MavenProject> prepareReactorProjects(String path) throws Exception {
158         String dir = "rewrite-for-development/" + path;
159         return createReactorProjects(dir, path, null);
160     }
161 
162     @Override
163     protected ReleaseDescriptorBuilder createDescriptorFromBasicPom(
164             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
165         ReleaseDescriptorBuilder builder = super.createDescriptorFromProjects(reactorProjects, workingDirectory);
166 
167         mapScm(builder);
168 
169         return builder;
170     }
171 
172     private void mapScm(ReleaseDescriptorBuilder builder) {
173         Scm scm = new Scm();
174         scm.setConnection("scm:svn:file://localhost/tmp/scm-repo/trunk");
175         scm.setDeveloperConnection("scm:svn:file://localhost/tmp/scm-repo/trunk");
176         scm.setUrl("file://localhost/tmp/scm-repo/trunk");
177         builder.addOriginalScmInfo("groupId:artifactId", scm);
178     }
179 
180     @Override
181     protected void mapAlternateNextVersion(ReleaseDescriptorBuilder config, String projectId) {
182         config.addReleaseVersion(projectId, ALTERNATIVE_RELEASE_VERSION);
183         config.addDevelopmentVersion(projectId, ALTERNATIVE_NEXT_VERSION);
184     }
185 
186     @Override
187     protected void mapNextVersion(ReleaseDescriptorBuilder config, String projectId) {
188         config.addReleaseVersion(projectId, RELEASE_VERSION);
189         config.addDevelopmentVersion(projectId, NEXT_VERSION);
190     }
191 
192     @Override
193     protected void unmapNextVersion(ReleaseDescriptorBuilder builder, String projectId) {
194         builder.addReleaseVersion(projectId, RELEASE_VERSION);
195     }
196 
197     @Override
198     protected ReleaseDescriptorBuilder createConfigurationForPomWithParentAlternateNextVersion(
199             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
200         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, workingDirectory);
201 
202         builder.addReleaseVersion("groupId:artifactId", RELEASE_VERSION);
203         builder.addDevelopmentVersion("groupId:artifactId", NEXT_VERSION);
204         builder.addReleaseVersion("groupId:subproject1", ALTERNATIVE_RELEASE_VERSION);
205         builder.addDevelopmentVersion("groupId:subproject1", ALTERNATIVE_NEXT_VERSION);
206         mapScm(builder);
207 
208         return builder;
209     }
210 
211     @Override
212     protected ReleaseDescriptorBuilder createConfigurationForWithParentNextVersion(
213             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
214         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, workingDirectory);
215 
216         builder.addReleaseVersion("groupId:artifactId", RELEASE_VERSION);
217         builder.addDevelopmentVersion("groupId:artifactId", NEXT_VERSION);
218         builder.addReleaseVersion("groupId:subproject1", RELEASE_VERSION);
219         builder.addDevelopmentVersion("groupId:subproject1", NEXT_VERSION);
220         mapScm(builder);
221 
222         return builder;
223     }
224 
225     @Test
226     public void testRewriteBasicPomWithGit() throws Exception {
227 
228         List<MavenProject> reactorProjects = createReactorProjects("basic-pom-with-git");
229         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "basic-pom-with-git");
230         mapNextVersion(builder, "groupId:artifactId");
231 
232         Scm scm = new Scm();
233         scm.setConnection("${scm.base}:git://localhost/repo");
234         scm.setDeveloperConnection("${scm.base}:git+ssh://${username}@localhost/tmp/repo");
235         scm.setUrl("${baseUrl}/repo");
236         builder.addOriginalScmInfo("groupId:artifactId", scm);
237 
238         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
239 
240         assertTrue(comparePomFiles(reactorProjects));
241     }
242 
243     @Test
244     public void testRewriteBasicPomWithGitFromTag() throws Exception {
245 
246         List<MavenProject> reactorProjects = createReactorProjects("basic-pom-with-git-from-tag");
247         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "basic-pom-with-git-from-tag");
248         mapNextVersion(builder, "groupId:artifactId");
249 
250         Scm scm = new Scm();
251         scm.setConnection("scm:git:git://localhost/repo");
252         scm.setDeveloperConnection("scm:git:git+ssh://${username}@localhost/tmp/repo");
253         scm.setUrl("http://localhost/viewgit.cgi/repo");
254         scm.setTag("original-label");
255         builder.addOriginalScmInfo("groupId:artifactId", scm);
256 
257         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
258 
259         assertTrue(comparePomFiles(reactorProjects));
260     }
261 
262     @Test
263     public void testRewriteBasicPomWithSvnFromTag() throws Exception {
264         List<MavenProject> reactorProjects = createReactorProjects("basic-pom-with-svn-from-tag");
265         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "basic-pom-with-svn-from-tag");
266         mapNextVersion(builder, "groupId:artifactId");
267 
268         Scm scm = new Scm();
269         scm.setConnection("scm:svn:file://localhost/svnroot/trunk/");
270         scm.setDeveloperConnection("scm:svn:file://localhost/svnroot/trunk/");
271         scm.setUrl("http://localhost/svn");
272         scm.setTag("trunk");
273         builder.addOriginalScmInfo("groupId:artifactId", scm);
274 
275         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
276 
277         assertTrue(comparePomFiles(reactorProjects));
278     }
279 
280     @Test
281     public void testRewriteBasicPomWithInheritedScm() throws Exception {
282 
283         List<MavenProject> reactorProjects = createReactorProjects("basic-pom-inherited-scm");
284         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "basic-pom-inherited-scm");
285 
286         builder.addReleaseVersion("groupId:artifactId", RELEASE_VERSION);
287         builder.addDevelopmentVersion("groupId:artifactId", NEXT_VERSION);
288         builder.addReleaseVersion("groupId:subproject1", RELEASE_VERSION);
289         builder.addDevelopmentVersion("groupId:subproject1", NEXT_VERSION);
290         builder.addReleaseVersion("groupId:subsubproject", RELEASE_VERSION);
291         builder.addDevelopmentVersion("groupId:subsubproject", NEXT_VERSION);
292         Scm scm = new Scm();
293         scm.setConnection("scm:svn:file://localhost/tmp/scm-repo/trunk/subproject1");
294         scm.setDeveloperConnection("scm:svn:file://localhost/tmp/scm-repo/trunk/subproject1");
295         // MRELEASE-107
296         scm.setUrl("http://localhost/viewvc/mypath/trunk/subproject1");
297         builder.addOriginalScmInfo("groupId:subproject1", scm);
298         builder.addOriginalScmInfo("groupId:subsubproject", null);
299 
300         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
301 
302         assertTrue(comparePomFiles(reactorProjects));
303     }
304 
305     @Test
306     public void testRewritePomWithParentAndProperties() throws Exception {
307         performTestRewritePomWithParentAndProperties("pom-with-parent-and-properties");
308     }
309 
310     // MRELEASE-454
311     @Test
312     public void testRewritePomWithParentAndPropertiesInDependencyManagement() throws Exception {
313         performTestRewritePomWithParentAndProperties("pom-with-parent-and-properties-in-dependency-management");
314     }
315 
316     // MRELEASE-454
317     @Test
318     public void testRewritePomWithParentAndPropertiesInDependencyManagementImport() throws Exception {
319         performTestRewritePomWithParentAndProperties("pom-with-parent-and-properties-in-dependency-management-import");
320     }
321 
322     private void performTestRewritePomWithParentAndProperties(String path) throws Exception {
323         List<MavenProject> reactorProjects = createReactorProjects(path);
324 
325         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, path);
326         builder.addReleaseVersion("groupId:artifactId", RELEASE_VERSION);
327         builder.addDevelopmentVersion("groupId:artifactId", NEXT_VERSION);
328         builder.addReleaseVersion("groupId:subproject1", ALTERNATIVE_RELEASE_VERSION);
329         builder.addDevelopmentVersion("groupId:subproject1", ALTERNATIVE_NEXT_VERSION);
330         builder.addReleaseVersion("groupId:subproject2", ALTERNATIVE_RELEASE_VERSION);
331         builder.addDevelopmentVersion("groupId:subproject2", ALTERNATIVE_NEXT_VERSION);
332 
333         mapScm(builder);
334 
335         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
336 
337         assertTrue(comparePomFiles(reactorProjects));
338     }
339 
340     @Test
341     public void testSimulateRewritePomWithParentAndProperties() throws Exception {
342         // use the original ones since simulation didn't modify them
343         List<MavenProject> reactorProjects = createReactorProjects("pom-with-parent-and-properties-sim");
344 
345         ReleaseDescriptorBuilder builder =
346                 createDescriptorFromProjects(reactorProjects, "pom-with-parent-and-properties-sim");
347         builder.addReleaseVersion("groupId:artifactId", RELEASE_VERSION);
348         builder.addDevelopmentVersion("groupId:artifactId", NEXT_VERSION);
349         builder.addReleaseVersion("groupId:subproject1", ALTERNATIVE_RELEASE_VERSION);
350         builder.addDevelopmentVersion("groupId:subproject1", ALTERNATIVE_NEXT_VERSION);
351         builder.addReleaseVersion("groupId:subproject2", ALTERNATIVE_RELEASE_VERSION);
352         builder.addDevelopmentVersion("groupId:subproject2", ALTERNATIVE_NEXT_VERSION);
353 
354         mapScm(builder);
355 
356         phase.simulate(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
357 
358         for (MavenProject project : reactorProjects) {
359             File pomFile = project.getFile();
360             File actualFile = new File(pomFile.getParentFile(), pomFile.getName() + ".next");
361             File expectedFile = new File(actualFile.getParentFile(), "expected-pom.xml");
362 
363             comparePomFiles(expectedFile, actualFile, true, false);
364         }
365     }
366 
367     // MRELEASE-311
368     @Test
369     public void testRewritePomWithDependencyPropertyCoordinate() throws Exception {
370         List<MavenProject> reactorProjects = createReactorProjects("pom-with-property-dependency-coordinate");
371 
372         ReleaseDescriptorBuilder builder =
373                 createDescriptorFromProjects(reactorProjects, "pom-with-property-dependency-coordinate");
374         builder.addReleaseVersion("groupId:artifactId", RELEASE_VERSION);
375         builder.addDevelopmentVersion("groupId:artifactId", NEXT_VERSION);
376         builder.addReleaseVersion("groupId:subproject1-3.4", ALTERNATIVE_RELEASE_VERSION);
377         builder.addDevelopmentVersion("groupId:subproject1-3.4", ALTERNATIVE_NEXT_VERSION);
378         builder.addReleaseVersion("groupId:subproject2", ALTERNATIVE_RELEASE_VERSION);
379         builder.addDevelopmentVersion("groupId:subproject2", ALTERNATIVE_NEXT_VERSION);
380 
381         mapScm(builder);
382 
383         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
384 
385         assertTrue(comparePomFiles(reactorProjects));
386     }
387 
388     @Test
389     public void testRewritePomDependenciesWithoutDependenciesVersionUpdate() throws Exception {
390         List<MavenProject> reactorProjects =
391                 createReactorProjects("internal-snapshot-dependencies-without-dependencies-version-update");
392         ReleaseDescriptorBuilder builder = createDefaultConfiguration(
393                 reactorProjects, "internal-snapshot-dependencies-without-dependencies-version-update");
394         builder.setUpdateDependencies(false);
395         mapNextVersion(builder, "groupId:subsubproject");
396 
397         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
398 
399         assertTrue(comparePomFiles(reactorProjects));
400     }
401 }