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.eq;
23  import static org.mockito.Matchers.isA;
24  import static org.mockito.Mockito.mock;
25  import static org.mockito.Mockito.times;
26  import static org.mockito.Mockito.verify;
27  import static org.mockito.Mockito.verifyNoMoreInteractions;
28  import static org.mockito.Mockito.when;
29  
30  import java.util.Collections;
31  import java.util.List;
32  
33  import org.apache.maven.model.Model;
34  import org.apache.maven.project.MavenProject;
35  import org.apache.maven.shared.release.ReleaseExecutionException;
36  import org.apache.maven.shared.release.config.ReleaseDescriptor;
37  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
38  import org.codehaus.plexus.PlexusTestCase;
39  import org.codehaus.plexus.components.interactivity.Prompter;
40  import org.codehaus.plexus.components.interactivity.PrompterException;
41  
42  /**
43   * Test the variable input phase.
44   *
45   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
46   */
47  public class InputVariablesPhaseTest
48      extends PlexusTestCase
49  {
50      private InputVariablesPhase phase;
51  
52      protected void setUp()
53          throws Exception
54      {
55          super.setUp();
56          phase = (InputVariablesPhase) lookup( ReleasePhase.ROLE, "input-variables" );
57      }
58  
59      public void testInputVariablesInteractive()
60          throws Exception
61      {
62          // prepare
63          Prompter mockPrompter = mock( Prompter.class );
64          when( mockPrompter.prompt( isA( String.class ), eq( "artifactId-1.0" ) ) ).thenReturn( "tag-value", "simulated-tag-value" );
65          phase.setPrompter( mockPrompter );
66  
67          List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
68  
69          ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
70          releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
71          releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
72  
73          // execute
74          phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
75  
76          // verify
77          assertEquals( "Check tag", "tag-value", releaseDescriptor.getScmReleaseLabel() );
78  
79          // prepare
80          releaseDescriptor = new ReleaseDescriptor();
81          releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
82          releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
83  
84          // execute
85          phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
86  
87          //verify
88          assertEquals( "Check tag", "simulated-tag-value", releaseDescriptor.getScmReleaseLabel() );
89          
90          verify( mockPrompter, times( 2 ) ).prompt( isA( String.class ), eq( "artifactId-1.0" ) );
91          verifyNoMoreInteractions( mockPrompter );
92      }
93  
94      public void testUnmappedVersion()
95          throws Exception
96      {
97          List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
98  
99          ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
100 
101         try
102         {
103             phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
104 
105             fail( "Expected an exception" );
106         }
107         catch ( ReleaseExecutionException e )
108         {
109             assertNull( "check no cause", e.getCause() );
110         }
111 
112         releaseDescriptor = new ReleaseDescriptor();
113 
114         try
115         {
116             phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
117 
118             fail( "Expected an exception" );
119         }
120         catch ( ReleaseExecutionException e )
121         {
122             assertNull( "check no cause", e.getCause() );
123         }
124     }
125 
126     public void testInputVariablesNonInteractive()
127         throws Exception
128     {
129         // prepare
130         Prompter mockPrompter = mock( Prompter.class );
131         phase.setPrompter( mockPrompter );
132 
133         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
134 
135         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
136         releaseDescriptor.setInteractive( false );
137         releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
138         releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
139 
140         // execute
141         phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
142 
143         // verify
144         assertEquals( "Check tag", "artifactId-1.0", releaseDescriptor.getScmReleaseLabel() );
145 
146         // prepare
147         releaseDescriptor = new ReleaseDescriptor();
148         releaseDescriptor.setInteractive( false );
149         releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
150         releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
151 
152         // execute
153         phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
154 
155         // verify
156         assertEquals( "Check tag", "artifactId-1.0", releaseDescriptor.getScmReleaseLabel() );
157         
158         // never use prompter
159         verifyNoMoreInteractions( mockPrompter );
160     }
161 
162     public void testInputVariablesNonInteractiveConfigured()
163         throws Exception
164     {
165         // prepare
166         Prompter mockPrompter = mock( Prompter.class );
167         phase.setPrompter( mockPrompter );
168 
169         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
170 
171         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
172         releaseDescriptor.setInteractive( false );
173         releaseDescriptor.setScmReleaseLabel( "tag-value" );
174 
175         // execute
176         phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
177 
178         // verify
179         assertEquals( "Check tag", "tag-value", releaseDescriptor.getScmReleaseLabel() );
180 
181         // prepare
182         releaseDescriptor = new ReleaseDescriptor();
183         releaseDescriptor.setInteractive( false );
184         releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" );
185 
186         // execute
187         phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
188 
189         // verify
190         assertEquals( "Check tag", "simulated-tag-value", releaseDescriptor.getScmReleaseLabel() );
191         
192         // never use prompter
193         verifyNoMoreInteractions( mockPrompter );
194     }
195 
196     public void testInputVariablesInteractiveConfigured()
197         throws Exception
198     {
199         // prepare
200         Prompter mockPrompter = mock( Prompter.class );
201         phase.setPrompter( mockPrompter );
202 
203         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
204 
205         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
206         releaseDescriptor.setScmReleaseLabel( "tag-value" );
207 
208         // execute
209         phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
210 
211         // verify
212         assertEquals( "Check tag", "tag-value", releaseDescriptor.getScmReleaseLabel() );
213 
214         // prepare
215         releaseDescriptor = new ReleaseDescriptor();
216         releaseDescriptor.setScmReleaseLabel( "simulated-tag-value" );
217 
218         // execute
219         phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
220 
221         // verify
222         assertEquals( "Check tag", "simulated-tag-value", releaseDescriptor.getScmReleaseLabel() );
223         
224         // never use prompter
225         verifyNoMoreInteractions( mockPrompter );
226     }
227 
228     public void testPrompterException()
229         throws Exception
230     {
231         // prepare
232         Prompter mockPrompter = mock( Prompter.class );
233         when( mockPrompter.prompt( isA( String.class ), isA( String.class ) ) ).thenThrow( new PrompterException( "..." ) );
234         phase.setPrompter( mockPrompter );
235 
236         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
237 
238         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
239         releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
240         releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
241 
242         // execute
243         try
244         {
245             phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
246 
247             fail( "Expected an exception" );
248         }
249         catch ( ReleaseExecutionException e )
250         {
251             assertEquals( "check cause", PrompterException.class, e.getCause().getClass() );
252         }
253 
254         // prepare
255         releaseDescriptor = new ReleaseDescriptor();
256         releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
257         releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
258 
259         // execute
260         try
261         {
262             phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
263 
264             fail( "Expected an exception" );
265         }
266         catch ( ReleaseExecutionException e )
267         {
268             assertEquals( "check cause", PrompterException.class, e.getCause().getClass() );
269         }
270         
271         //verify
272         verify( mockPrompter, times( 2 ) ).prompt( isA( String.class ), isA( String.class ) );
273         verifyNoMoreInteractions( mockPrompter );
274     }
275 
276     //MRELEASE-110
277     public void testCvsTag()
278         throws Exception
279     {
280         // prepare
281         Prompter mockPrompter = mock( Prompter.class );
282         phase.setPrompter( mockPrompter );
283 
284         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
285 
286         ReleaseDescriptor releaseConfiguration = new ReleaseDescriptor();
287         releaseConfiguration.setInteractive( false );
288         releaseConfiguration.mapReleaseVersion( "groupId:artifactId", "1.0" );
289         releaseConfiguration.setScmSourceUrl( "scm:cvs:pserver:anoncvs@localhost:/tmp/scm-repo:module" );
290 
291         // execute
292         phase.execute( releaseConfiguration, new DefaultReleaseEnvironment(), reactorProjects );
293 
294         // verify
295         assertEquals( "Check tag", "artifactId-1_0", releaseConfiguration.getScmReleaseLabel() );
296 
297         // prepare
298         releaseConfiguration = new ReleaseDescriptor();
299         releaseConfiguration.setInteractive( false );
300         releaseConfiguration.mapReleaseVersion( "groupId:artifactId", "1.0" );
301         releaseConfiguration.setScmSourceUrl( "scm:cvs:pserver:anoncvs@localhost:/tmp/scm-repo:module" );
302 
303         // execute
304         phase.simulate( releaseConfiguration, new DefaultReleaseEnvironment(), reactorProjects );
305 
306         // verify
307         assertEquals( "Check tag", "artifactId-1_0", releaseConfiguration.getScmReleaseLabel() );
308         
309         // never use prompter
310         verifyNoMoreInteractions( mockPrompter );
311     }
312 
313     //MRELEASE-159
314     public void testCustomTagFormat()
315         throws Exception
316     {
317         // prepare
318         Prompter mockPrompter = mock( Prompter.class );
319         phase.setPrompter( mockPrompter );
320 
321         List<MavenProject> reactorProjects = Collections.singletonList( createProject( "artifactId", "1.0" ) );
322         ReleaseDescriptor releaseDescriptor = new ReleaseDescriptor();
323         releaseDescriptor.setInteractive( false );
324         releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
325         releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
326 
327         // execute
328         phase.execute( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
329 
330         // verify
331         assertEquals( "Check tag", "artifactId-1.0", releaseDescriptor.getScmReleaseLabel() );
332 
333         // prepare
334         releaseDescriptor = new ReleaseDescriptor();
335         releaseDescriptor.setInteractive( false );
336         releaseDescriptor.mapReleaseVersion( "groupId:artifactId", "1.0" );
337         releaseDescriptor.setScmSourceUrl( "scm:svn:file://localhost/tmp/scm-repo" );
338         releaseDescriptor.setScmTagNameFormat( "simulated-@{artifactId}-@{version}" );
339 
340         // execute
341         phase.simulate( releaseDescriptor, new DefaultReleaseEnvironment(), reactorProjects );
342 
343         // verify
344         assertEquals( "Check tag", "simulated-artifactId-1.0", releaseDescriptor.getScmReleaseLabel() );
345         
346         // never use prompter
347         verifyNoMoreInteractions( mockPrompter );
348     }
349 
350     private static MavenProject createProject( String artifactId, String version )
351     {
352         Model model = new Model();
353         model.setGroupId( "groupId" );
354         model.setArtifactId( artifactId );
355         model.setVersion( version );
356         return new MavenProject( model );
357     }
358 
359 }