1 package org.apache.maven.continuum.release.executors;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
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
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
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 }