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.util.ArrayList;
27  import java.util.Collections;
28  import java.util.Iterator;
29  import java.util.List;
30  
31  import org.apache.maven.project.MavenProject;
32  import org.apache.maven.scm.ScmFile;
33  import org.apache.maven.scm.ScmFileSet;
34  import org.apache.maven.scm.ScmFileStatus;
35  import org.apache.maven.scm.command.add.AddScmResult;
36  import org.apache.maven.scm.provider.ScmProvider;
37  import org.apache.maven.scm.repository.ScmRepository;
38  import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
39  import org.apache.maven.shared.release.config.ReleaseUtils;
40  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
41  import org.apache.maven.shared.release.util.ReleaseUtil;
42  import org.codehaus.plexus.testing.PlexusTest;
43  import org.junit.jupiter.api.Test;
44  
45  import static org.codehaus.plexus.testing.PlexusExtension.getTestFile;
46  import static org.mockito.ArgumentMatchers.argThat;
47  import static org.mockito.ArgumentMatchers.isA;
48  import static org.mockito.Mockito.mock;
49  import static org.mockito.Mockito.verify;
50  import static org.mockito.Mockito.verifyNoMoreInteractions;
51  import static org.mockito.Mockito.when;
52  
53  /**
54   * Test the generate release POMs phase.
55   *
56   * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
57   */
58  @PlexusTest
59  class GenerateReleasePomsPhaseTest extends AbstractRewritingReleasePhaseTestCase {
60      private static final String NEXT_VERSION = "1.0";
61  
62      private static final String ALTERNATIVE_NEXT_VERSION = "2.0";
63  
64      private ScmProvider scmProviderMock;
65  
66      @Inject
67      @Named("generate-release-poms")
68      private ReleasePhase phase;
69  
70      @Override
71      protected ReleasePhase getTestedPhase() {
72          return phase;
73      }
74  
75      // TODO: MRELEASE-262
76      // @Test public void testRewriteInternalRangeDependency() throws Exception
77      // {
78      // List reactorProjects = createReactorProjects( "internal-snapshot-range-dependency" );
79      // ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
80      //
81      // phase.execute( config, null, reactorProjects );
82      //
83      // compareFiles( reactorProjects );
84      // }
85  
86      @Test
87      void testRewriteExternalRangeDependency() throws Exception {
88          List<MavenProject> reactorProjects = createReactorProjects("external-range-dependency");
89          ReleaseDescriptorBuilder builder = createMappedConfiguration(reactorProjects, "external-range-dependency");
90  
91          phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
92  
93          comparePomFiles(reactorProjects);
94      }
95  
96      // MRELEASE-787
97      @Test
98      void testSuppressCommitBeforeTagOrBranch() throws Exception {
99          List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
100         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
101         builder.setGenerateReleasePoms(true);
102         builder.setSuppressCommitBeforeTagOrBranch(true);
103         builder.setRemoteTagging(false);
104         builder.setPinExternals(false);
105         mapNextVersion(builder, "groupId:artifactId");
106 
107         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
108 
109         verify(scmProviderMock).add(isA(ScmRepository.class), isA(ScmFileSet.class));
110 
111         verifyNoMoreInteractions(scmProviderMock);
112     }
113 
114     @Test
115     void testSuppressCommitBeforeTagOrBranchAndReomoteTagging() throws Exception {
116         List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
117         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
118         builder.setGenerateReleasePoms(true);
119         builder.setSuppressCommitBeforeTagOrBranch(true);
120         builder.setRemoteTagging(true);
121         builder.setPinExternals(false);
122         mapNextVersion(builder, "groupId:artifactId");
123 
124         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
125 
126         verify(scmProviderMock).add(isA(ScmRepository.class), isA(ScmFileSet.class));
127 
128         verifyNoMoreInteractions(scmProviderMock);
129     }
130 
131     // MRELEASE-808
132     @Test
133     void testFinalName() throws Exception {
134         List<MavenProject> reactorProjects = createReactorProjects("pom-with-finalname");
135         ReleaseDescriptorBuilder builder =
136                 createConfigurationForWithParentNextVersion(reactorProjects, "pom-with-finalname");
137         builder.setGenerateReleasePoms(true);
138 
139         phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
140 
141         comparePomFiles(reactorProjects);
142     }
143 
144     /*
145      * @see
146      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#createDescriptorFromProjects(java.
147      * util.List)
148      */
149     @Override
150     protected ReleaseDescriptorBuilder createDescriptorFromProjects(
151             List<MavenProject> reactorProjects, String workingDirectory) {
152         ReleaseDescriptorBuilder builder = super.createDescriptorFromProjects(reactorProjects, workingDirectory);
153         builder.setScmReleaseLabel("release-label");
154         builder.setGenerateReleasePoms(true);
155         return builder;
156     }
157 
158     /*
159      * @see org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#createReactorProjects(java.lang.
160      * String, boolean)
161      */
162     @Override
163     protected List<MavenProject> prepareReactorProjects(String path) throws Exception {
164         String dir = "generate-release-poms/" + path;
165         List<MavenProject> reactorProjects = createReactorProjects(dir, dir, null);
166 
167         scmProviderMock = mock(ScmProvider.class);
168 
169         List<File> releasePoms = new ArrayList<>();
170 
171         for (MavenProject project : reactorProjects) {
172             releasePoms.add(ReleaseUtil.getReleasePom(project));
173         }
174 
175         MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
176         ScmFileSet fileSet = new ScmFileSet(rootProject.getFile().getParentFile(), releasePoms);
177 
178         when(scmProviderMock.add(isA(ScmRepository.class), argThat(new IsScmFileSetEquals(fileSet))))
179                 .thenReturn(new AddScmResult(
180                         "...", Collections.singletonList(new ScmFile("pom.xml", ScmFileStatus.ADDED))));
181 
182         scmManager.setScmProvider(scmProviderMock);
183 
184         return reactorProjects;
185     }
186 
187     @Override
188     protected void verifyReactorProjects(String path, boolean copyFiles) throws Exception {
189         String dir = "generate-release-poms/" + path;
190         List<MavenProject> reactorProjects = createReactorProjects(dir, dir, null);
191 
192         List<File> releasePoms = new ArrayList<>();
193 
194         for (Iterator<MavenProject> iterator = reactorProjects.iterator(); iterator.hasNext(); ) {
195             MavenProject project = iterator.next();
196 
197             releasePoms.add(ReleaseUtil.getReleasePom(project));
198         }
199 
200         MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
201         ScmFileSet fileSet = new ScmFileSet(rootProject.getFile().getParentFile(), releasePoms);
202 
203         verify(scmProviderMock).add(isA(ScmRepository.class), argThat(new IsScmFileSetEquals(fileSet)));
204         verifyNoMoreInteractions(scmProviderMock);
205     }
206 
207     @Override
208     protected void mapNextVersion(ReleaseDescriptorBuilder config, String projectId) {
209         config.addReleaseVersion(projectId, NEXT_VERSION);
210     }
211 
212     /*
213      * @see
214      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#mapAlternateNextVersion(org.apache.
215      * maven.shared.release.config.ReleaseDescriptor, java.lang.String)
216      */
217     @Override
218     protected void mapAlternateNextVersion(ReleaseDescriptorBuilder config, String projectId) {
219         config.addReleaseVersion(projectId, ALTERNATIVE_NEXT_VERSION);
220     }
221 
222     /*
223      * @see
224      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#unmapNextVersion(org.apache.maven.
225      * shared.release.config.ReleaseDescriptor, java.lang.String)
226      */
227     @Override
228     protected void unmapNextVersion(ReleaseDescriptorBuilder config, String projectId) {
229         // nothing to do
230     }
231 
232     /*
233      * @see org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#
234      * createConfigurationForPomWithParentAlternateNextVersion(java.util.List)
235      */
236     @Override
237     protected ReleaseDescriptorBuilder createConfigurationForPomWithParentAlternateNextVersion(
238             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
239         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, workingDirectory);
240 
241         builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
242         builder.addReleaseVersion("groupId:subproject1", ALTERNATIVE_NEXT_VERSION);
243 
244         return builder;
245     }
246 
247     /*
248      * @see org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#
249      * createConfigurationForWithParentNextVersion(java.util.List)
250      */
251     @Override
252     protected ReleaseDescriptorBuilder createConfigurationForWithParentNextVersion(
253             List<MavenProject> reactorProjects, String workingDirectory) throws Exception {
254         ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, workingDirectory);
255 
256         builder.addReleaseVersion("groupId:artifactId", NEXT_VERSION);
257         builder.addReleaseVersion("groupId:subproject1", NEXT_VERSION);
258 
259         return builder;
260     }
261 
262     /*
263      * @see
264      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#readTestProjectFile(java.lang.String)
265      */
266     @Override
267     protected String readTestProjectFile(String fileName) throws IOException {
268         return ReleaseUtil.readXmlFile(getTestFile("target/test-classes/projects/generate-release-poms/" + fileName));
269     }
270 
271     /*
272      * @see
273      * org.apache.maven.shared.release.phase.AbstractReleaseTestCase#compareFiles(org.apache.maven.project.MavenProject,
274      * java.lang.String)
275      */
276     // @Override
277     @Override
278     protected void comparePomFiles(MavenProject project, String expectedFileSuffix, boolean normalizeLineEndings)
279             throws IOException {
280         File actualFile = ReleaseUtil.getReleasePom(project);
281         File expectedFile = new File(actualFile.getParentFile(), "expected-release-pom" + expectedFileSuffix + ".xml");
282 
283         comparePomFiles(expectedFile, actualFile, normalizeLineEndings, true);
284     }
285 }