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