View Javadoc
1   package org.apache.maven.plugins.release;
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.isA;
23  import static org.mockito.Mockito.doThrow;
24  import static org.mockito.Mockito.mock;
25  import static org.mockito.Mockito.verify;
26  import static org.mockito.Mockito.verifyNoMoreInteractions;
27  
28  import java.io.File;
29  import java.util.Arrays;
30  
31  import org.apache.maven.model.DistributionManagement;
32  import org.apache.maven.model.Profile;
33  import org.apache.maven.model.Site;
34  import org.apache.maven.plugin.MojoExecutionException;
35  import org.apache.maven.plugin.MojoFailureException;
36  import org.apache.maven.plugin.testing.AbstractMojoTestCase;
37  import org.apache.maven.project.MavenProject;
38  import org.apache.maven.shared.release.ReleaseExecutionException;
39  import org.apache.maven.shared.release.ReleaseFailureException;
40  import org.apache.maven.shared.release.ReleaseManager;
41  import org.apache.maven.shared.release.ReleasePerformRequest;
42  import org.apache.maven.shared.release.config.ReleaseDescriptor;
43  import org.mockito.ArgumentCaptor;
44  
45  /**
46   * Test release:perform.
47   *
48   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
49   */
50  public class PerformReleaseMojoTest
51      extends AbstractMojoTestCase
52  {
53      private File workingDirectory;
54  
55      public void testPerform()
56          throws Exception
57      {
58          PerformReleaseMojo mojo = getMojoWithProjectSite( "perform.xml" );
59  
60          ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
61          releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
62          File checkoutDirectory = getTestFile( "target/checkout" );
63          releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
64          releaseDescriptor.setPerformGoals( "deploy site-deploy" );
65  
66          ReleaseManager mock = mock( ReleaseManager.class );
67          mojo.setReleaseManager( mock );
68          
69          // execute
70          mojo.execute();
71          
72          // verify
73          ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
74          verify( mock ).perform( argument.capture() );
75          assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
76          assertNotNull( argument.getValue().getReleaseEnvironment()  );
77          assertNull( argument.getValue().getReactorProjects() );
78          assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
79          verifyNoMoreInteractions( mock );
80      }
81  
82      public void testPerformWithFlatStructure()
83          throws Exception
84      {
85          PerformReleaseMojo mojo = getMojoWithProjectSite( "perform-with-flat-structure.xml" );
86  
87          ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
88          releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
89          File checkoutDirectory = getTestFile( "target/checkout" );
90          releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
91          releaseDescriptor.setPerformGoals( "deploy" );
92          releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/target/svnroot/flat-multi-module/trunk/root-project" );
93  
94          ReleaseManager mock = mock( ReleaseManager.class );
95          mojo.setReleaseManager( mock );
96  
97          // execute
98          mojo.execute();
99          
100         // verify
101         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
102         verify( mock ).perform( argument.capture() );
103         assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
104         assertNotNull( argument.getValue().getReleaseEnvironment()  );
105         assertNull( argument.getValue().getReactorProjects() );
106         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
107         verifyNoMoreInteractions( mock );
108     }
109 
110     
111     public void testPerformWithoutSite()
112         throws Exception
113     {
114         File testFileDirectory = getTestFile( "target/test-classes/mojos/perform/" );
115         PerformReleaseMojo mojo =
116             (PerformReleaseMojo) lookupMojo( "perform", new File( testFileDirectory, "perform-without-site.xml" ) );
117         mojo.setBasedir( testFileDirectory );
118 
119         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
120         releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
121         File checkoutDirectory = getTestFile( "target/checkout" );
122         releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
123         releaseDescriptor.setPerformGoals( "deploy" );
124 
125         ReleaseManager mock = mock( ReleaseManager.class );
126         mojo.setReleaseManager( mock );
127 
128         // execute
129         mojo.execute();
130 
131         // verify
132         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
133         verify( mock ).perform( argument.capture() );
134         assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
135         assertNotNull( argument.getValue().getReleaseEnvironment()  );
136         assertNull( argument.getValue().getReactorProjects() );
137         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
138         verifyNoMoreInteractions( mock );
139     }
140 
141     private PerformReleaseMojo getMojoWithProjectSite( String fileName )
142         throws Exception
143     {
144         PerformReleaseMojo mojo = (PerformReleaseMojo) lookupMojo( "perform", new File( workingDirectory, fileName ) );
145         mojo.setBasedir( workingDirectory );
146 
147         MavenProject project = (MavenProject) getVariableValueFromObject( mojo, "project" );
148         DistributionManagement distributionManagement = new DistributionManagement();
149         distributionManagement.setSite( new Site() );
150         project.setDistributionManagement( distributionManagement );
151 
152         return mojo;
153     }
154 
155     public void testPerformWithExecutionException()
156         throws Exception
157     {
158         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform.xml" );
159 
160         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
161         releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
162         File checkoutDirectory = getTestFile( "target/checkout" );
163         releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
164         releaseDescriptor.setPerformGoals( "deploy site-deploy" );
165 
166         ReleaseManager mock = mock( ReleaseManager.class );
167         doThrow( new ReleaseExecutionException( "..." ) ).when( mock ).perform( isA( ReleasePerformRequest.class ) );
168         mojo.setReleaseManager( mock );
169 
170         // execute
171         try
172         {
173             mojo.execute();
174 
175             fail( "Should have thrown an exception" );
176         }
177         catch ( MojoExecutionException e )
178         {
179             assertEquals( "Check cause", ReleaseExecutionException.class, e.getCause().getClass() );
180         }
181         
182         // verify
183         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
184         verify( mock ).perform( argument.capture() );
185         assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
186         assertNotNull( argument.getValue().getReleaseEnvironment()  );
187         assertNull( argument.getValue().getReactorProjects() );
188         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
189 
190         verifyNoMoreInteractions( mock );
191     }
192 
193     public void testPerformWithExecutionFailure()
194         throws Exception
195     {
196         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform.xml" );
197 
198         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
199         releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
200         File checkoutDirectory = getTestFile( "target/checkout" );
201         releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
202         releaseDescriptor.setPerformGoals( "deploy site-deploy" );
203 
204         ReleaseManager mock = mock( ReleaseManager.class );
205         ReleaseFailureException cause = new ReleaseFailureException( "..." );
206         doThrow( cause ).when( mock ).perform( isA( ReleasePerformRequest.class ) );
207 
208         mojo.setReleaseManager( mock );
209 
210         // execute
211         try
212         {
213             mojo.execute();
214 
215             fail( "Should have thrown an exception" );
216         }
217         catch ( MojoFailureException e )
218         {
219             assertEquals( "Check cause exists", cause, e.getCause() );
220         }
221         
222         // verify
223         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
224         verify( mock ).perform( argument.capture() );
225         assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
226         assertNotNull( argument.getValue().getReleaseEnvironment()  );
227         assertNull( argument.getValue().getReactorProjects() );
228         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
229 
230         verifyNoMoreInteractions( mock );
231     }
232 
233     public void testPerformWithScm()
234         throws Exception
235     {
236         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform-with-scm.xml" );
237 
238         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
239         releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
240         File checkoutDirectory = getTestFile( "target/checkout" );
241         releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
242         releaseDescriptor.setPerformGoals( "deploy site-deploy" );
243         releaseDescriptor.setScmSourceUrl( "scm-url" );
244 
245         ReleaseManager mock = mock( ReleaseManager.class );
246         mojo.setReleaseManager( mock );
247 
248         // execute
249         mojo.execute();
250         
251         // verify
252         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
253         verify( mock ).perform( argument.capture() );
254         assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
255         assertNotNull( argument.getValue().getReleaseEnvironment()  );
256         assertNull( argument.getValue().getReactorProjects() );
257         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
258 
259         verifyNoMoreInteractions( mock );
260     }
261 
262     public void testPerformWithProfiles()
263         throws Exception
264     {
265         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform.xml" );
266 
267         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
268         releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
269         File checkoutDirectory = getTestFile( "target/checkout" );
270         releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
271         releaseDescriptor.setPerformGoals( "deploy site-deploy" );
272         releaseDescriptor.setAdditionalArguments( "-P prof1,2prof" );
273 
274         MavenProject project = (MavenProject) getVariableValueFromObject( mojo, "project" );
275         Profile profile1 = new Profile();
276         profile1.setId( "prof1" );
277         Profile profile2 = new Profile();
278         profile2.setId( "2prof" );
279         project.setActiveProfiles( Arrays.asList( new Profile[]{profile1, profile2} ) );
280 
281         ReleaseManager mock = mock( ReleaseManager.class );
282         mojo.setReleaseManager( mock );
283 
284         // execute
285         mojo.execute();
286 
287         // verify
288         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
289         verify( mock ).perform( argument.capture() );
290         assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
291         assertNotNull( argument.getValue().getReleaseEnvironment()  );
292         assertNull( argument.getValue().getReactorProjects() );
293         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
294 
295         verifyNoMoreInteractions( mock );
296     }
297 
298     public void testPerformWithProfilesAndArguments()
299         throws Exception
300     {
301         PerformReleaseMojo mojo = getMojoWithProjectSite( "perform-with-args.xml" );
302 
303         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
304         releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
305         File checkoutDirectory = getTestFile( "target/checkout" );
306         releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
307         releaseDescriptor.setPerformGoals( "deploy site-deploy" );
308         releaseDescriptor.setAdditionalArguments( "-Dmaven.test.skip=true -P prof1,2prof" );
309 
310         MavenProject project = (MavenProject) getVariableValueFromObject( mojo, "project" );
311         Profile profile1 = new Profile();
312         profile1.setId( "prof1" );
313         Profile profile2 = new Profile();
314         profile2.setId( "2prof" );
315         project.setActiveProfiles( Arrays.asList( new Profile[]{profile1, profile2} ) );
316 
317         ReleaseManager mock = mock( ReleaseManager.class );
318         mojo.setReleaseManager( mock );
319 
320         // execute
321         mojo.execute();
322 
323         // verify
324         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
325         verify( mock ).perform( argument.capture() );
326         assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
327         assertNotNull( argument.getValue().getReleaseEnvironment()  );
328         assertNull( argument.getValue().getReactorProjects() );
329         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
330 
331         verifyNoMoreInteractions( mock );
332     }
333 
334     public void testPerformWithMultilineGoals()
335         throws Exception
336     {
337 	    PerformReleaseMojo mojo = getMojoWithProjectSite( "perform-with-multiline-goals.xml" );
338 
339         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
340         releaseDescriptor.setWorkingDirectory( workingDirectory.getAbsolutePath() );
341         File checkoutDirectory = getTestFile( "target/checkout" );
342         releaseDescriptor.setCheckoutDirectory( checkoutDirectory.getAbsolutePath() );
343         releaseDescriptor.setPerformGoals( "deploy site-deploy" );
344 
345         ReleaseManager mock = mock( ReleaseManager.class );
346         mojo.setReleaseManager( mock );
347 
348         // execute
349         mojo.execute();
350 
351         // verify
352         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
353         verify( mock ).perform( argument.capture() );
354         assertEquals( releaseDescriptor, argument.getValue().getReleaseDescriptor() );
355         assertNotNull( argument.getValue().getReleaseEnvironment()  );
356         assertNull( argument.getValue().getReactorProjects() );
357         assertEquals( Boolean.FALSE, argument.getValue().getDryRun() );
358 
359         verifyNoMoreInteractions( mock );
360     }
361 
362 
363     protected void setUp()
364         throws Exception
365     {
366         super.setUp();
367         workingDirectory = getTestFile( "target/test-classes/mojos/perform" );
368     }
369 }