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