View Javadoc
1   package org.apache.maven.shared.release.phase;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import static org.junit.Assert.assertTrue;
23  
24  import static org.mockito.Matchers.argThat;
25  import static org.mockito.Matchers.isA;
26  import static org.mockito.Mockito.mock;
27  import static org.mockito.Mockito.verify;
28  import static org.mockito.Mockito.verifyNoMoreInteractions;
29  import static org.mockito.Mockito.when;
30  
31  import java.io.File;
32  import java.io.IOException;
33  import java.util.ArrayList;
34  import java.util.Collections;
35  import java.util.Iterator;
36  import java.util.List;
37  
38  import org.apache.maven.project.MavenProject;
39  import org.apache.maven.scm.ScmFile;
40  import org.apache.maven.scm.ScmFileSet;
41  import org.apache.maven.scm.ScmFileStatus;
42  import org.apache.maven.scm.command.add.AddScmResult;
43  import org.apache.maven.scm.manager.ScmManager;
44  import org.apache.maven.scm.manager.ScmManagerStub;
45  import org.apache.maven.scm.provider.ScmProvider;
46  import org.apache.maven.scm.repository.ScmRepository;
47  import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
48  import org.apache.maven.shared.release.config.ReleaseUtils;
49  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
50  import org.apache.maven.shared.release.util.ReleaseUtil;
51  import org.junit.Test;
52  
53  /**
54   * Test the generate release POMs phase.
55   *
56   * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
57   */
58  public class GenerateReleasePomsPhaseTest
59      extends AbstractRewritingReleasePhaseTestCase
60  {
61      private static final String NEXT_VERSION = "1.0";
62  
63      private static final String ALTERNATIVE_NEXT_VERSION = "2.0";
64  
65      private ScmProvider scmProviderMock;
66  
67      public GenerateReleasePomsPhaseTest( String modelETL )
68      {
69          super( modelETL );
70      }
71  
72      @Override
73      public void setUp()
74          throws Exception
75      {
76          super.setUp();
77  
78          scmProviderMock = null;
79      }
80  
81      @Override
82      protected String getRoleHint()
83      {
84          return "generate-release-poms";
85      }
86  
87      // TODO: MRELEASE-262
88      // @Test public void testRewriteInternalRangeDependency() throws Exception
89      // {
90      // List reactorProjects = createReactorProjects( "internal-snapshot-range-dependency" );
91      // ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
92      //
93      // phase.execute( config, null, reactorProjects );
94      //
95      // compareFiles( reactorProjects );
96      // }
97  
98      @Test
99      public void testRewriteExternalRangeDependency()
100         throws Exception
101     {
102         List<MavenProject> reactorProjects = createReactorProjects( "external-range-dependency" );
103         ReleaseDescriptorBuilder builder = createMappedConfiguration( reactorProjects, "external-range-dependency" );
104 
105         phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
106 
107         comparePomFiles( reactorProjects );
108     }
109 
110     // MRELEASE-787
111     @Test
112     public void testSuppressCommitBeforeTagOrBranch()
113         throws Exception
114     {
115         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
116         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
117         builder.setGenerateReleasePoms( true );
118         builder.setSuppressCommitBeforeTagOrBranch( true );
119         builder.setRemoteTagging( false );
120         builder.setPinExternals( false );
121         mapNextVersion( builder, "groupId:artifactId" );
122 
123         phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
124 
125         verify( scmProviderMock ).add( isA( ScmRepository.class ), isA( ScmFileSet.class ) );
126 
127         verifyNoMoreInteractions( scmProviderMock );
128     }
129 
130     @Test
131     public void testSuppressCommitBeforeTagOrBranchAndReomoteTagging()
132         throws Exception
133     {
134         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
135         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
136         builder.setGenerateReleasePoms( true );
137         builder.setSuppressCommitBeforeTagOrBranch( true );
138         builder.setRemoteTagging( true );
139         builder.setPinExternals( false );
140         mapNextVersion( builder, "groupId:artifactId" );
141 
142         phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
143 
144         verify( scmProviderMock ).add( isA( ScmRepository.class ), isA( ScmFileSet.class ) );
145 
146         verifyNoMoreInteractions( scmProviderMock );
147     }
148 
149     // MRELEASE-808
150     @Test
151     public void testFinalName()
152         throws Exception
153     {
154         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-finalname" );
155         ReleaseDescriptorBuilder builder = createConfigurationForWithParentNextVersion( reactorProjects, "pom-with-finalname" );
156         builder.setGenerateReleasePoms( true );
157 
158         phase.execute( ReleaseUtils.buildReleaseDescriptor( builder ), new DefaultReleaseEnvironment(), reactorProjects );
159 
160         assertTrue( comparePomFiles( reactorProjects ) );
161     }
162 
163     /*
164      * @see
165      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#createDescriptorFromProjects(java.
166      * util.List)
167      */
168     @Override
169     protected ReleaseDescriptorBuilder createDescriptorFromProjects( List<MavenProject> reactorProjects, String workingDirectory )
170     {
171         ReleaseDescriptorBuilder builder = super.createDescriptorFromProjects( reactorProjects, workingDirectory );
172         builder.setScmReleaseLabel( "release-label" );
173         builder.setGenerateReleasePoms( true );
174         return builder;
175     }
176 
177     /*
178      * @see org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#createReactorProjects(java.lang.
179      * String, boolean)
180      */
181     @Override
182     protected List<MavenProject> prepareReactorProjects( String path )
183         throws Exception
184     {
185         String dir = "generate-release-poms/" + path;
186         List<MavenProject> reactorProjects = createReactorProjects( dir, dir, null );
187 
188         scmProviderMock = mock( ScmProvider.class );
189 
190         List<File> releasePoms = new ArrayList<>();
191 
192         for ( MavenProject project : reactorProjects )
193         {
194             releasePoms.add( ReleaseUtil.getReleasePom( project ) );
195         }
196 
197         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
198         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile(), releasePoms );
199 
200         when( scmProviderMock.add( isA( ScmRepository.class ),
201                argThat( new IsScmFileSetEquals( fileSet ) ) ) ).thenReturn( new AddScmResult( "...",
202                               Collections.singletonList( new ScmFile( "pom.xml", ScmFileStatus.ADDED ) ) ) );
203 
204         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.class );
205         stub.setScmProvider( scmProviderMock );
206 
207         return reactorProjects;
208     }
209 
210     @Override
211     protected void verifyReactorProjects( String path, boolean copyFiles )
212         throws Exception
213     {
214         String dir = "generate-release-poms/"+ path;
215         List<MavenProject> reactorProjects = createReactorProjects( dir, dir, null );
216 
217         List<File> releasePoms = new ArrayList<>();
218 
219         for ( Iterator<MavenProject> iterator = reactorProjects.iterator(); iterator.hasNext(); )
220         {
221             MavenProject project = iterator.next();
222 
223             releasePoms.add( ReleaseUtil.getReleasePom( project ) );
224         }
225 
226         MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
227         ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile(), releasePoms );
228 
229         verify( scmProviderMock ).add( isA( ScmRepository.class ), argThat( new IsScmFileSetEquals( fileSet ) ) );
230         verifyNoMoreInteractions( scmProviderMock );
231     }
232 
233     @Override
234     protected void mapNextVersion( ReleaseDescriptorBuilder config, String projectId )
235     {
236         config.addReleaseVersion( projectId, NEXT_VERSION );
237     }
238 
239     /*
240      * @see
241      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#mapAlternateNextVersion(org.apache.
242      * maven.shared.release.config.ReleaseDescriptor, java.lang.String)
243      */
244     @Override
245     protected void mapAlternateNextVersion( ReleaseDescriptorBuilder config, String projectId )
246     {
247         config.addReleaseVersion( projectId, ALTERNATIVE_NEXT_VERSION );
248     }
249 
250     /*
251      * @see
252      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#unmapNextVersion(org.apache.maven.
253      * shared.release.config.ReleaseDescriptor, java.lang.String)
254      */
255     @Override
256     protected void unmapNextVersion( ReleaseDescriptorBuilder config, String projectId )
257     {
258         // nothing to do
259     }
260 
261     /*
262      * @see org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#
263      * createConfigurationForPomWithParentAlternateNextVersion(java.util.List)
264      */
265     @Override
266     protected ReleaseDescriptorBuilder createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects, String workingDirectory )
267         throws Exception
268     {
269         ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects, workingDirectory );
270 
271         builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
272         builder.addReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
273 
274         return builder;
275     }
276 
277     /*
278      * @see org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#
279      * createConfigurationForWithParentNextVersion(java.util.List)
280      */
281     @Override
282     protected ReleaseDescriptorBuilder createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects, String workingDirectory )
283         throws Exception
284     {
285         ReleaseDescriptorBuilder builder = createDescriptorFromProjects( reactorProjects, workingDirectory );
286 
287         builder.addReleaseVersion( "groupId:artifactId", NEXT_VERSION );
288         builder.addReleaseVersion( "groupId:subproject1", NEXT_VERSION );
289 
290         return builder;
291     }
292 
293     /*
294      * @see
295      * org.apache.maven.shared.release.phase.AbstractRewritingReleasePhaseTestCase#readTestProjectFile(java.lang.String)
296      */
297     @Override
298     protected String readTestProjectFile( String fileName )
299         throws IOException
300     {
301         return ReleaseUtil.readXmlFile( getTestFile( "target/test-classes/projects/generate-release-poms/"
302             + fileName ) );
303     }
304 
305     /*
306      * @see
307      * org.apache.maven.shared.release.phase.AbstractReleaseTestCase#compareFiles(org.apache.maven.project.MavenProject,
308      * java.lang.String)
309      */
310     // @Override
311     @Override
312     protected void comparePomFiles( MavenProject project, String expectedFileSuffix, boolean normalizeLineEndings )
313         throws IOException
314     {
315         File actualFile = ReleaseUtil.getReleasePom( project );
316         File expectedFile =
317             new File( actualFile.getParentFile(), "expected-release-pom" + expectedFileSuffix + ".xml" );
318 
319         comparePomFiles( expectedFile, actualFile, normalizeLineEndings, true );
320     }
321 }