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.BufferedReader;
30  import java.io.File;
31  import java.io.StringReader;
32  import java.util.ArrayList;
33  import java.util.Collections;
34  import java.util.Iterator;
35  import java.util.List;
36  
37  import org.apache.maven.Maven;
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.remove.RemoveScmResult;
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.ReleaseResult;
48  import org.apache.maven.shared.release.config.ReleaseDescriptor;
49  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
50  import org.apache.maven.shared.release.util.ReleaseUtil;
51  import org.codehaus.plexus.util.IOUtil;
52  
53  /**
54   * Test the remove release POMs phase.
55   *
56   * @author <a href="mailto:markhobson@gmail.com">Mark Hobson</a>
57   */
58  public class RemoveReleasePomsPhaseTest
59      extends AbstractReleaseTestCase
60  {
61      protected void setUp()
62          throws Exception
63      {
64          super.setUp();
65  
66          phase = (ReleasePhase) lookup( ReleasePhase.ROLE, "remove-release-poms" );
67      }
68  
69      public void testExecuteBasicPom()
70          throws Exception
71      {
72          // prepare
73          List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
74          ReleaseDescriptor config = createReleaseDescriptor();
75          MavenProject project = ReleaseUtil.getRootProject( reactorProjects );
76  
77          File releasePom = ReleaseUtil.getReleasePom( project );
78          ScmFileSet fileSet = new ScmFileSet( new File( config.getWorkingDirectory() ), releasePom );
79  
80          ScmProvider scmProviderMock = mock( ScmProvider.class );
81          when( scmProviderMock.remove( isA( ScmRepository.class ),
82                                        argThat( new IsScmFileSetEquals( fileSet ) ),
83                                        isA( String.class ) ) ).thenReturn( new RemoveScmResult( "...", Collections
84                         .singletonList( new ScmFile( Maven.RELEASE_POMv4, ScmFileStatus.DELETED ) ) ) );
85          
86          ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
87          stub.setScmProvider( scmProviderMock );
88  
89          // execute
90          phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
91  
92          //verify
93          verify( scmProviderMock ).remove( isA( ScmRepository.class ),
94                                            argThat( new IsScmFileSetEquals( fileSet ) ),
95                                            isA( String.class ) );
96          verifyNoMoreInteractions( scmProviderMock );
97      }
98  
99      public void testExecutePomWithModules()
100         throws Exception
101     {
102         // prepare
103         List<MavenProject> reactorProjects = createReactorProjects( "pom-with-modules" );
104         ReleaseDescriptor config = createReleaseDescriptor();
105 
106         List<File> releasePoms = new ArrayList<File>();
107         for ( Iterator<MavenProject> iterator = reactorProjects.iterator(); iterator.hasNext(); )
108         {
109             MavenProject project = iterator.next();
110             File releasePom = ReleaseUtil.getReleasePom( project );
111             releasePoms.add( releasePom );
112         }
113 
114         ScmFileSet fileSet = new ScmFileSet( new File( config.getWorkingDirectory() ), releasePoms );
115 
116         ScmProvider scmProviderMock = mock( ScmProvider.class );
117         when( scmProviderMock.remove( isA( ScmRepository.class ),
118                                       argThat( new IsScmFileSetEquals( fileSet ) ),
119                                       isA( String.class ) ) ).thenReturn( new RemoveScmResult( "...", Collections
120                        .singletonList( new ScmFile( Maven.RELEASE_POMv4, ScmFileStatus.DELETED ) ) ) );
121 
122         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
123         stub.setScmProvider( scmProviderMock );
124 
125         // execute
126         phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
127 
128         // verify
129         verify( scmProviderMock ).remove( isA( ScmRepository.class ),
130                                           argThat( new IsScmFileSetEquals( fileSet ) ),
131                                           isA( String.class ) );
132         verifyNoMoreInteractions( scmProviderMock );
133     }
134 
135     public void testSimulateBasicPom()
136         throws Exception
137     {
138         // prepare
139         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
140         ReleaseDescriptor config = createReleaseDescriptor();
141 
142         ScmProvider scmProviderMock = mock( ScmProvider.class );
143 
144         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
145         stub.setScmProvider( scmProviderMock );
146 
147         // execute
148         phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
149 
150         // never invoke scmProviderMock
151         verifyNoMoreInteractions( scmProviderMock );
152     }
153     
154     public void testExecuteWithSuppressCommitBeforeTag() throws Exception
155     {
156         // prepare
157         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
158         ReleaseDescriptor config = createReleaseDescriptor();
159         config.setSuppressCommitBeforeTagOrBranch( true );
160         config.setGenerateReleasePoms( true );
161 
162         ScmProvider scmProviderMock = mock( ScmProvider.class );
163 
164         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
165         stub.setScmProvider( scmProviderMock );
166         
167         // execute
168         ReleaseResult result = phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
169         
170         BufferedReader reader = null;
171         try 
172         {
173             reader = new BufferedReader( new StringReader( result.getOutput() ) );
174             
175             assertEquals( "[INFO] Removing release POM for 'Unnamed - groupId:artifactId:jar:1.0-SNAPSHOT'..." , reader.readLine() );
176             assertEquals( "Expected EOF",  null, reader.readLine() );
177         }
178         finally
179         {
180             IOUtil.close( reader );
181         }
182 
183         // never invoke scmProviderMock
184         verifyNoMoreInteractions( scmProviderMock );
185     }
186 
187     public void testSimulateWithSuppressCommitBeforeTag() throws Exception
188     {
189         // prepare
190         List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
191         ReleaseDescriptor config = createReleaseDescriptor();
192         config.setSuppressCommitBeforeTagOrBranch( true );
193         config.setGenerateReleasePoms( true );
194 
195         ScmProvider scmProviderMock = mock( ScmProvider.class );
196 
197         ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
198         stub.setScmProvider( scmProviderMock );
199 
200         // execute
201         ReleaseResult result = phase.simulate( config, new DefaultReleaseEnvironment(), reactorProjects );
202 
203         BufferedReader reader = null;
204         try 
205         {
206             reader = new BufferedReader( new StringReader( result.getOutput() ) );
207             
208             assertEquals( "[INFO] Removing release POM for 'Unnamed - groupId:artifactId:jar:1.0-SNAPSHOT'..." , reader.readLine() );
209             assertEquals( "[INFO] Full run would be removing [" + reactorProjects.get( 0 ).getFile().getParent() + File.separator + "release-pom.xml]", reader.readLine() );
210             assertEquals( "Expected EOF",  null, reader.readLine() );
211         }
212         finally
213         {
214             IOUtil.close( reader );
215         }
216 
217         // never invoke scmProviderMock
218         verifyNoMoreInteractions( scmProviderMock );
219     }
220 
221     private List<MavenProject> createReactorProjects( String path )
222         throws Exception
223     {
224         return createReactorProjects( "remove-release-poms/", path );
225     }
226 
227     private ReleaseDescriptor createReleaseDescriptor()
228     {
229         ReleaseDescriptor descriptor = new ReleaseDescriptor();
230         descriptor.setGenerateReleasePoms( true );
231         descriptor.setWorkingDirectory( getTestFile( "target/test/checkout" ).getAbsolutePath() );
232         return descriptor;
233     }
234 }