View Javadoc

1   package org.apache.maven.continuum.release.executors;
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 org.apache.continuum.release.config.ContinuumReleaseDescriptor;
23  import org.apache.maven.continuum.release.ContinuumReleaseManager;
24  import org.apache.maven.continuum.release.tasks.PerformReleaseProjectTask;
25  import org.apache.maven.continuum.release.tasks.PrepareReleaseProjectTask;
26  import org.apache.maven.continuum.release.tasks.RollbackReleaseProjectTask;
27  import org.apache.maven.scm.ScmFileSet;
28  import org.apache.maven.scm.ScmVersion;
29  import org.apache.maven.scm.manager.NoSuchScmProviderException;
30  import org.apache.maven.scm.manager.ScmManager;
31  import org.apache.maven.scm.repository.ScmRepository;
32  import org.apache.maven.scm.repository.ScmRepositoryException;
33  import org.apache.maven.shared.release.ReleaseResult;
34  import org.apache.maven.shared.release.config.ReleaseDescriptor;
35  import org.apache.maven.shared.release.config.ReleaseDescriptorStoreException;
36  import org.codehaus.plexus.spring.PlexusInSpringTestCase;
37  import org.codehaus.plexus.taskqueue.Task;
38  import org.codehaus.plexus.taskqueue.execution.TaskExecutionException;
39  import org.codehaus.plexus.taskqueue.execution.TaskExecutor;
40  import org.codehaus.plexus.util.FileUtils;
41  import org.codehaus.plexus.util.IOUtil;
42  
43  import java.io.File;
44  import java.io.FileInputStream;
45  import java.io.FileNotFoundException;
46  import java.io.FileOutputStream;
47  import java.io.IOException;
48  import java.io.InputStream;
49  import java.io.OutputStream;
50  import java.util.Properties;
51  
52  /**
53   * @author Edwin Punzalan
54   */
55  public class ReleaseTaskExecutorTest
56      extends PlexusInSpringTestCase
57  {
58      private ScmManager scmManager;
59  
60      private TaskExecutor prepareExec;
61  
62      private TaskExecutor performExec;
63  
64      private TaskExecutor rollbackExec;
65  
66      private ContinuumReleaseManager releaseManager;
67  
68      protected void setUp()
69          throws Exception
70      {
71          super.setUp();
72  
73          if ( scmManager == null )
74          {
75              scmManager = (ScmManager) lookup( "org.apache.maven.scm.manager.ScmManager" );
76          }
77  
78          if ( prepareExec == null )
79          {
80              prepareExec = (TaskExecutor) lookup( TaskExecutor.class.getName(), "prepare-release" );
81          }
82  
83          if ( performExec == null )
84          {
85              performExec = (TaskExecutor) lookup( TaskExecutor.class.getName(), "perform-release" );
86          }
87  
88          if ( rollbackExec == null )
89          {
90              rollbackExec = (TaskExecutor) lookup( TaskExecutor.class.getName(), "rollback-release" );
91          }
92  
93          if ( releaseManager == null )
94          {
95              releaseManager = (ContinuumReleaseManager) lookup( ContinuumReleaseManager.ROLE );
96          }
97          File scmPath = new File( getBasedir(), "target/scm-src" ).getAbsoluteFile();
98          File scmTargetPath = new File( getBasedir(), "target/scm-test" ).getAbsoluteFile();
99          FileUtils.copyDirectoryStructure( scmPath, scmTargetPath );
100     }
101     
102     public void releaseSimpleProject()
103         throws Exception
104     {
105         String scmPath = new File( getBasedir(), "target/scm-test" ).getAbsolutePath().replace( '\\', '/' );
106         File workDir = new File( getBasedir(), "target/test-classes/work-dir" );
107         FileUtils.deleteDirectory( workDir );
108         File testDir = new File( getBasedir(), "target/test-classes/test-dir" );
109         FileUtils.deleteDirectory( testDir );
110 
111         ContinuumReleaseDescriptor descriptor = new ContinuumReleaseDescriptor();
112         descriptor.setInteractive( false );
113         descriptor.setScmSourceUrl( "scm:svn:file://localhost/" + scmPath + "/trunk" );
114         descriptor.setWorkingDirectory( workDir.getAbsolutePath() );
115 
116         ScmRepository repository = getScmRepositorty( descriptor.getScmSourceUrl() );
117         ScmFileSet fileSet = new ScmFileSet( workDir );
118         scmManager.getProviderByRepository( repository ).checkOut( repository, fileSet, (ScmVersion) null );
119 
120         String pom = FileUtils.fileRead( new File( workDir, "pom.xml" ) );
121         assertTrue( "Test dev version", pom.indexOf( "<version>1.0-SNAPSHOT</version>" ) > 0 );
122 
123         doPrepareWithNoError( descriptor );
124 
125         pom = FileUtils.fileRead( new File( workDir, "pom.xml" ) );
126         assertTrue( "Test version increment", pom.indexOf( "<version>1.1-SNAPSHOT</version>" ) > 0 );
127 
128         repository = getScmRepositorty( "scm:svn:file://localhost/" + scmPath + "/tags/test-artifact-1.0" );
129         fileSet = new ScmFileSet( testDir );
130         scmManager.getProviderByRepository( repository ).checkOut( repository, fileSet, (ScmVersion) null );
131 
132         pom = FileUtils.fileRead( new File( testDir, "pom.xml" ) );
133         assertTrue( "Test released version", pom.indexOf( "<version>1.0</version>" ) > 0 );
134     }
135 
136     public void testReleases()
137         throws Exception
138     {
139         releaseSimpleProject();
140         releaseAndRollbackProject();
141         releaseSimpleProjectWithNextVersion();
142         releasePerformWithExecutableInDescriptor();
143         releaseProjectWithDependencyOfCustomPackagingType();
144     }
145 
146     public void releaseSimpleProjectWithNextVersion()
147         throws Exception
148     {
149         String scmPath = new File( getBasedir(), "target/scm-test" ).getAbsolutePath().replace( '\\', '/' );
150         File workDir = new File( getBasedir(), "target/test-classes/work-dir" );
151         FileUtils.deleteDirectory( workDir );
152         File testDir = new File( getBasedir(), "target/test-classes/test-dir" );
153         FileUtils.deleteDirectory( testDir );
154 
155         ContinuumReleaseDescriptor descriptor = new ContinuumReleaseDescriptor();
156         descriptor.setInteractive( false );
157         descriptor.setScmSourceUrl( "scm:svn:file://localhost/" + scmPath + "/trunk" );
158         descriptor.setWorkingDirectory( workDir.getAbsolutePath() );
159         descriptor.mapReleaseVersion( "test-group:test-artifact", "2.0" );
160         descriptor.mapDevelopmentVersion( "test-group:test-artifact", "2.1-SNAPSHOT" );
161 
162         ScmRepository repository = getScmRepositorty( descriptor.getScmSourceUrl() );
163         ScmFileSet fileSet = new ScmFileSet( workDir );
164         scmManager.getProviderByRepository( repository ).checkOut( repository, fileSet, (ScmVersion) null );
165 
166         String pom = FileUtils.fileRead( new File( workDir, "pom.xml" ) );
167         assertTrue( "Test dev version", pom.indexOf( "<version>1.1-SNAPSHOT</version>" ) > 0 );
168 
169         doPrepareWithNoError( descriptor );
170 
171         pom = FileUtils.fileRead( new File( workDir, "pom.xml" ) );
172         assertTrue( "Test version increment", pom.indexOf( "<version>2.1-SNAPSHOT</version>" ) > 0 );
173 
174         repository = getScmRepositorty( "scm:svn:file://localhost/" + scmPath + "/tags/test-artifact-2.0" );
175         fileSet = new ScmFileSet( testDir );
176         scmManager.getProviderByRepository( repository ).checkOut( repository, fileSet, (ScmVersion) null );
177 
178         pom = FileUtils.fileRead( new File( testDir, "pom.xml" ) );
179         assertTrue( "Test released version", pom.indexOf( "<version>2.0</version>" ) > 0 );
180 
181         performExec.executeTask(
182             getPerformTask( "testRelease", descriptor, new File( getBasedir(), "target/test-classes/build-dir" ) ) );
183 
184         ReleaseResult result = (ReleaseResult) releaseManager.getReleaseResults().get( "testRelease" );
185         if ( result.getResultCode() != ReleaseResult.SUCCESS )
186         {
187             fail( "Error in release:perform. Release output follows:\n" + result.getOutput() );
188         }
189     }
190 
191     public void releaseAndRollbackProject()
192         throws Exception
193     {
194         String scmPath = new File( getBasedir(), "target/scm-test" ).getAbsolutePath().replace( '\\', '/' );
195         File workDir = new File( getBasedir(), "target/test-classes/work-dir" );
196         FileUtils.deleteDirectory( workDir );
197         File testDir = new File( getBasedir(), "target/test-classes/test-dir" );
198         FileUtils.deleteDirectory( testDir );
199 
200         ContinuumReleaseDescriptor descriptor = new ContinuumReleaseDescriptor();
201         descriptor.setInteractive( false );
202         descriptor.setScmSourceUrl( "scm:svn:file://localhost/" + scmPath + "/trunk" );
203         descriptor.setWorkingDirectory( workDir.getAbsolutePath() );
204 
205         ScmRepository repository = getScmRepositorty( descriptor.getScmSourceUrl() );
206         ScmFileSet fileSet = new ScmFileSet( workDir );
207         scmManager.getProviderByRepository( repository ).checkOut( repository, fileSet, (ScmVersion) null );
208 
209         String pom = FileUtils.fileRead( new File( workDir, "pom.xml" ) );
210         assertTrue( "Test dev version", pom.indexOf( "<version>1.1-SNAPSHOT</version>" ) > 0 );
211 
212         doPrepareWithNoError( descriptor );
213 
214         pom = FileUtils.fileRead( new File( workDir, "pom.xml" ) );
215         assertTrue( "Test version increment", pom.indexOf( "<version>1.2-SNAPSHOT</version>" ) > 0 );
216 
217         repository = getScmRepositorty( "scm:svn:file://localhost/" + scmPath + "/tags/test-artifact-1.1" );
218         fileSet = new ScmFileSet( testDir );
219         scmManager.getProviderByRepository( repository ).checkOut( repository, fileSet, (ScmVersion) null );
220 
221         pom = FileUtils.fileRead( new File( testDir, "pom.xml" ) );
222         assertTrue( "Test released version", pom.indexOf( "<version>1.1</version>" ) > 0 );
223 
224         rollbackExec.executeTask( new RollbackReleaseProjectTask( "testRelease", descriptor, null ) );
225 
226         pom = FileUtils.fileRead( new File( workDir, "pom.xml" ) );
227         assertTrue( "Test rollback version", pom.indexOf( "<version>1.1-SNAPSHOT</version>" ) > 0 );
228 
229         assertFalse( "Test that release.properties has been cleaned",
230                      new File( workDir, "release.properties" ).exists() );
231         assertFalse( "Test that backup file has been cleaned", new File( workDir, "pom.xml.releaseBackup" ).exists() );
232 
233         //@todo when implemented already, check if tag was also removed
234     }
235 
236     public void releasePerformWithExecutableInDescriptor()
237         throws Exception
238     {
239         String scmPath = new File( getBasedir(), "target/scm-test" ).getAbsolutePath().replace( '\\', '/' );
240         File workDir = new File( getBasedir(), "target/test-classes/work-dir" );
241         FileUtils.deleteDirectory( workDir );
242         File testDir = new File( getBasedir(), "target/test-classes/test-dir" );
243         FileUtils.deleteDirectory( testDir );
244 
245         ContinuumReleaseDescriptor descriptor = new ContinuumReleaseDescriptor();
246         descriptor.setInteractive( false );
247         descriptor.setScmSourceUrl( "scm:svn:file://localhost/" + scmPath + "/trunk" );
248         descriptor.setWorkingDirectory( workDir.getAbsolutePath() );
249 
250         ScmRepository repository = getScmRepositorty( descriptor.getScmSourceUrl() );
251         ScmFileSet fileSet = new ScmFileSet( workDir );
252         scmManager.getProviderByRepository( repository ).checkOut( repository, fileSet, (ScmVersion) null );
253 
254         String pom = FileUtils.fileRead( new File( workDir, "pom.xml" ) );
255         assertTrue( "Test dev version", pom.indexOf( "<version>2.1-SNAPSHOT</version>" ) > 0 );
256 
257         doPrepareWithNoError( descriptor );
258 
259         pom = FileUtils.fileRead( new File( workDir, "pom.xml" ) );
260         assertTrue( "Test version increment", pom.indexOf( "<version>2.2-SNAPSHOT</version>" ) > 0 );
261 
262         repository = getScmRepositorty( "scm:svn:file://localhost/" + scmPath + "/tags/test-artifact-2.1" );
263         fileSet = new ScmFileSet( testDir );
264         scmManager.getProviderByRepository( repository ).checkOut( repository, fileSet, (ScmVersion) null );
265 
266         pom = FileUtils.fileRead( new File( testDir, "pom.xml" ) );
267         assertTrue( "Test released version", pom.indexOf( "<version>2.1</version>" ) > 0 );
268 
269         File file = new File( descriptor.getWorkingDirectory(), "release.properties" );
270         assertTrue( "release.properties file does not exist", file.exists() );
271 
272         Properties properties = new Properties();
273 
274         InputStream inStream = null;
275         OutputStream outStream = null;
276         
277         try
278         {
279             inStream = new FileInputStream( file );
280 
281             properties.load( inStream );
282 
283             properties.setProperty( "build.executable", "test/executable/mvn" );
284 
285             outStream = new FileOutputStream( file );
286 
287             properties.store( outStream, "release configuration" );
288         }
289         finally
290         {
291             IOUtil.close( inStream );
292         }
293 
294         performExec.executeTask(
295             getPerformTask( "testRelease", descriptor, new File( getBasedir(), "target/test-classes/build-dir" ) ) );
296 
297         ReleaseResult result = (ReleaseResult) releaseManager.getReleaseResults().get( "testRelease" );
298 
299         if ( !result.getOutput().replace( "\\", "/" ).contains( "test/executable/mvn" ) )
300         {
301             fail( "Error in release:perform. Missing executable" );
302         }
303     }
304     
305     // CONTINUUM-1814
306     public void releaseProjectWithDependencyOfCustomPackagingType()
307     	throws Exception
308 	{
309     	String scmPath = new File( getBasedir(), "target/scm-test/continuum-1814" ).getAbsolutePath().replace( '\\', '/' );
310         File workDir = new File( getBasedir(), "target/test-classes/continuum-1814" );
311         FileUtils.deleteDirectory( workDir );
312         File testDir = new File( getBasedir(), "target/test-classes/test-dir" );
313         FileUtils.deleteDirectory( testDir );
314 
315         ContinuumReleaseDescriptor descriptor = new ContinuumReleaseDescriptor();
316         descriptor.setInteractive( false );
317         descriptor.setScmSourceUrl( "scm:svn:file://localhost/" + scmPath + "/trunk" );
318         descriptor.setWorkingDirectory( workDir.getAbsolutePath() );
319 
320         ScmRepository repository = getScmRepositorty( descriptor.getScmSourceUrl() );
321         ScmFileSet fileSet = new ScmFileSet( workDir );
322         scmManager.getProviderByRepository( repository ).checkOut( repository, fileSet, (ScmVersion) null );
323 
324         String pom = FileUtils.fileRead( new File( workDir, "pom.xml" ) );
325         assertTrue( "Test dev version", pom.indexOf( "<version>1.6-SNAPSHOT</version>" ) > 0 );
326 
327         doPrepareWithNoError( descriptor );
328 
329         pom = FileUtils.fileRead( new File( workDir, "pom.xml" ) );
330         assertTrue( "Test version increment", pom.indexOf( "<version>1.7-SNAPSHOT</version>" ) > 0 );
331 
332         repository = getScmRepositorty( "scm:svn:file://localhost/" + scmPath + "/tags/continuum-1814-1.6" );
333         fileSet = new ScmFileSet( testDir );
334         scmManager.getProviderByRepository( repository ).checkOut( repository, fileSet, (ScmVersion) null );
335 
336         pom = FileUtils.fileRead( new File( testDir, "pom.xml" ) );
337         assertTrue( "Test released version", pom.indexOf( "<version>1.6</version>" ) > 0 );
338         
339         performExec.executeTask(
340                 getPerformTask( "testRelease", descriptor, new File( getBasedir(), "target/test-classes/build-dir" ) ) );
341 
342         ReleaseResult result = (ReleaseResult) releaseManager.getReleaseResults().get( "testRelease" );
343         if ( result.getResultCode() != ReleaseResult.SUCCESS )
344         {
345             fail( "Error in release:perform. Release output follows:\n" + result.getOutput() );
346         }
347 	}
348 
349     private void doPrepareWithNoError( ReleaseDescriptor descriptor )
350         throws TaskExecutionException
351     {
352         prepareExec.executeTask( getPrepareTask( "testRelease", descriptor ) );
353 
354         ReleaseResult result = (ReleaseResult) releaseManager.getReleaseResults().get( "testRelease" );
355         if ( result.getResultCode() != ReleaseResult.SUCCESS )
356         {
357             fail( "Error in release:prepare. Release output follows:\n" + result.getOutput() );
358         }
359     }
360 
361     private Task getPrepareTask( String releaseId, ReleaseDescriptor descriptor )
362     {
363         return new PrepareReleaseProjectTask( releaseId, descriptor, null );
364     }
365 
366     private Task getPerformTask( String releaseId, ReleaseDescriptor descriptor, File buildDir )
367     {
368         return new PerformReleaseProjectTask( releaseId, descriptor, buildDir, "package", true, null );
369     }
370 
371     private ScmRepository getScmRepositorty( String scmUrl )
372         throws ScmRepositoryException, NoSuchScmProviderException
373     {
374         ScmRepository repository = scmManager.makeScmRepository( scmUrl.trim() );
375 
376         repository.getProviderRepository().setPersistCheckout( true );
377 
378         return repository;
379     }
380 }