1 package org.apache.maven.lifecycle;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import java.io.File;
19 import java.util.ArrayList;
20 import java.util.Arrays;
21 import java.util.Collections;
22 import java.util.List;
23
24 import org.apache.maven.AbstractCoreMavenComponentTestCase;
25 import org.apache.maven.exception.ExceptionHandler;
26 import org.apache.maven.execution.MavenSession;
27 import org.apache.maven.execution.MojoExecutionEvent;
28 import org.apache.maven.execution.MojoExecutionListener;
29 import org.apache.maven.execution.ProjectDependencyGraph;
30 import org.apache.maven.execution.ProjectExecutionEvent;
31 import org.apache.maven.execution.ProjectExecutionListener;
32 import org.apache.maven.lifecycle.internal.DefaultLifecycleTaskSegmentCalculator;
33 import org.apache.maven.lifecycle.internal.ExecutionPlanItem;
34 import org.apache.maven.lifecycle.internal.LifecycleExecutionPlanCalculator;
35 import org.apache.maven.lifecycle.internal.LifecycleTask;
36 import org.apache.maven.lifecycle.internal.LifecycleTaskSegmentCalculator;
37 import org.apache.maven.lifecycle.internal.MojoDescriptorCreator;
38 import org.apache.maven.lifecycle.internal.TaskSegment;
39 import org.apache.maven.model.Plugin;
40 import org.apache.maven.plugin.MojoExecution;
41 import org.apache.maven.plugin.MojoExecutionException;
42 import org.apache.maven.plugin.MojoNotFoundException;
43 import org.apache.maven.plugin.descriptor.MojoDescriptor;
44 import org.apache.maven.project.MavenProject;
45 import org.codehaus.plexus.component.annotations.Requirement;
46 import org.codehaus.plexus.util.xml.Xpp3Dom;
47
48 public class LifecycleExecutorTest
49 extends AbstractCoreMavenComponentTestCase
50 {
51 @Requirement
52 private DefaultLifecycleExecutor lifecycleExecutor;
53
54 @Requirement
55 private DefaultLifecycleTaskSegmentCalculator lifeCycleTaskSegmentCalculator;
56
57 @Requirement
58 private LifecycleExecutionPlanCalculator lifeCycleExecutionPlanCalculator;
59
60 @Requirement
61 private MojoDescriptorCreator mojoDescriptorCreator;
62
63
64 protected void setUp()
65 throws Exception
66 {
67 super.setUp();
68 lifecycleExecutor = (DefaultLifecycleExecutor) lookup( LifecycleExecutor.class );
69 lifeCycleTaskSegmentCalculator =
70 (DefaultLifecycleTaskSegmentCalculator) lookup( LifecycleTaskSegmentCalculator.class );
71 lifeCycleExecutionPlanCalculator = lookup( LifecycleExecutionPlanCalculator.class );
72 mojoDescriptorCreator = lookup( MojoDescriptorCreator.class );
73 lookup( ExceptionHandler.class );
74 }
75
76 @Override
77 protected void tearDown()
78 throws Exception
79 {
80 lifecycleExecutor = null;
81 super.tearDown();
82 }
83
84 protected String getProjectsDirectory()
85 {
86 return "src/test/projects/lifecycle-executor";
87 }
88
89
90
91
92
93 public void testCalculationOfBuildPlanWithIndividualTaskWherePluginIsSpecifiedInThePom()
94 throws Exception
95 {
96
97
98 File pom = getProject( "project-basic" );
99 MavenSession session = createMavenSession( pom );
100 assertEquals( "project-basic", session.getCurrentProject().getArtifactId() );
101 assertEquals( "1.0", session.getCurrentProject().getVersion() );
102 List<MojoExecution> executionPlan = getExecutions( calculateExecutionPlan( session, "resources:resources" ) );
103 assertEquals( 1, executionPlan.size() );
104 MojoExecution mojoExecution = executionPlan.get( 0 );
105 assertNotNull( mojoExecution );
106 assertEquals( "org.apache.maven.plugins",
107 mojoExecution.getMojoDescriptor().getPluginDescriptor().getGroupId() );
108 assertEquals( "maven-resources-plugin",
109 mojoExecution.getMojoDescriptor().getPluginDescriptor().getArtifactId() );
110 assertEquals( "0.1", mojoExecution.getMojoDescriptor().getPluginDescriptor().getVersion() );
111 }
112
113 public void testCalculationOfBuildPlanWithIndividualTaskOfTheCleanLifecycle()
114 throws Exception
115 {
116
117
118 File pom = getProject( "project-basic" );
119 MavenSession session = createMavenSession( pom );
120 assertEquals( "project-basic", session.getCurrentProject().getArtifactId() );
121 assertEquals( "1.0", session.getCurrentProject().getVersion() );
122 List<MojoExecution> executionPlan = getExecutions( calculateExecutionPlan( session, "clean" ) );
123 assertEquals( 1, executionPlan.size() );
124 MojoExecution mojoExecution = executionPlan.get( 0 );
125 assertNotNull( mojoExecution );
126 assertEquals( "org.apache.maven.plugins",
127 mojoExecution.getMojoDescriptor().getPluginDescriptor().getGroupId() );
128 assertEquals( "maven-clean-plugin", mojoExecution.getMojoDescriptor().getPluginDescriptor().getArtifactId() );
129 assertEquals( "0.1", mojoExecution.getMojoDescriptor().getPluginDescriptor().getVersion() );
130 }
131
132 public void testCalculationOfBuildPlanWithIndividualTaskOfTheCleanCleanGoal()
133 throws Exception
134 {
135
136
137 File pom = getProject( "project-basic" );
138 MavenSession session = createMavenSession( pom );
139 assertEquals( "project-basic", session.getCurrentProject().getArtifactId() );
140 assertEquals( "1.0", session.getCurrentProject().getVersion() );
141 List<MojoExecution> executionPlan = getExecutions( calculateExecutionPlan( session, "clean:clean" ) );
142 assertEquals( 1, executionPlan.size() );
143 MojoExecution mojoExecution = executionPlan.get( 0 );
144 assertNotNull( mojoExecution );
145 assertEquals( "org.apache.maven.plugins",
146 mojoExecution.getMojoDescriptor().getPluginDescriptor().getGroupId() );
147 assertEquals( "maven-clean-plugin", mojoExecution.getMojoDescriptor().getPluginDescriptor().getArtifactId() );
148 assertEquals( "0.1", mojoExecution.getMojoDescriptor().getPluginDescriptor().getVersion() );
149 }
150
151 List<MojoExecution> getExecutions( MavenExecutionPlan mavenExecutionPlan )
152 {
153 List<MojoExecution> result = new ArrayList<>();
154 for ( ExecutionPlanItem executionPlanItem : mavenExecutionPlan )
155 {
156 result.add( executionPlanItem.getMojoExecution() );
157 }
158 return result;
159 }
160
161
162 public void testCalculationOfBuildPlanTasksOfTheCleanLifecycleAndTheInstallLifecycle()
163 throws Exception
164 {
165 File pom = getProject( "project-with-additional-lifecycle-elements" );
166 MavenSession session = createMavenSession( pom );
167 assertEquals( "project-with-additional-lifecycle-elements", session.getCurrentProject().getArtifactId() );
168 assertEquals( "1.0", session.getCurrentProject().getVersion() );
169 List<MojoExecution> executionPlan = getExecutions( calculateExecutionPlan( session, "clean", "install" ) );
170
171
172
173
174
175
176
177
178
179
180
181
182 assertEquals( 10, executionPlan.size() );
183
184 assertEquals( "clean:clean", executionPlan.get( 0 ).getMojoDescriptor().getFullGoalName() );
185 assertEquals( "resources:resources", executionPlan.get( 1 ).getMojoDescriptor().getFullGoalName() );
186 assertEquals( "compiler:compile", executionPlan.get( 2 ).getMojoDescriptor().getFullGoalName() );
187 assertEquals( "it:generate-metadata", executionPlan.get( 3 ).getMojoDescriptor().getFullGoalName() );
188 assertEquals( "resources:testResources", executionPlan.get( 4 ).getMojoDescriptor().getFullGoalName() );
189 assertEquals( "compiler:testCompile", executionPlan.get( 5 ).getMojoDescriptor().getFullGoalName() );
190 assertEquals( "it:generate-test-metadata", executionPlan.get( 6 ).getMojoDescriptor().getFullGoalName() );
191 assertEquals( "surefire:test", executionPlan.get( 7 ).getMojoDescriptor().getFullGoalName() );
192 assertEquals( "jar:jar", executionPlan.get( 8 ).getMojoDescriptor().getFullGoalName() );
193 assertEquals( "install:install", executionPlan.get( 9 ).getMojoDescriptor().getFullGoalName() );
194 }
195
196
197 public void testCalculationOfBuildPlanWithMultipleExecutionsOfModello()
198 throws Exception
199 {
200 File pom = getProject( "project-with-multiple-executions" );
201 MavenSession session = createMavenSession( pom );
202 assertEquals( "project-with-multiple-executions", session.getCurrentProject().getArtifactId() );
203 assertEquals( "1.0.1", session.getCurrentProject().getVersion() );
204
205 MavenExecutionPlan plan = calculateExecutionPlan( session, "clean", "install" );
206
207 List<MojoExecution> executions = getExecutions( plan );
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227 assertEquals( 16, executions.size() );
228
229 assertEquals( "clean:clean", executions.get( 0 ).getMojoDescriptor().getFullGoalName() );
230 assertEquals( "it:xpp3-writer", executions.get( 1 ).getMojoDescriptor().getFullGoalName() );
231 assertEquals( "it:java", executions.get( 2 ).getMojoDescriptor().getFullGoalName() );
232 assertEquals( "it:xpp3-reader", executions.get( 3 ).getMojoDescriptor().getFullGoalName() );
233 assertEquals( "it:xpp3-writer", executions.get( 4 ).getMojoDescriptor().getFullGoalName() );
234 assertEquals( "it:java", executions.get( 5 ).getMojoDescriptor().getFullGoalName() );
235 assertEquals( "it:xpp3-reader", executions.get( 6 ).getMojoDescriptor().getFullGoalName() );
236 assertEquals( "resources:resources", executions.get( 7 ).getMojoDescriptor().getFullGoalName() );
237 assertEquals( "compiler:compile", executions.get( 8 ).getMojoDescriptor().getFullGoalName() );
238 assertEquals( "plugin:descriptor", executions.get( 9 ).getMojoDescriptor().getFullGoalName() );
239 assertEquals( "resources:testResources", executions.get( 10 ).getMojoDescriptor().getFullGoalName() );
240 assertEquals( "compiler:testCompile", executions.get( 11 ).getMojoDescriptor().getFullGoalName() );
241 assertEquals( "surefire:test", executions.get( 12 ).getMojoDescriptor().getFullGoalName() );
242 assertEquals( "jar:jar", executions.get( 13 ).getMojoDescriptor().getFullGoalName() );
243 assertEquals( "plugin:addPluginArtifactMetadata", executions.get( 14 ).getMojoDescriptor().getFullGoalName() );
244 assertEquals( "install:install", executions.get( 15 ).getMojoDescriptor().getFullGoalName() );
245
246 assertEquals( "src/main/mdo/remote-resources.mdo",
247 new MojoExecutionXPathContainer( executions.get( 1 ) ).getValue(
248 "configuration/models[1]/model" ) );
249 assertEquals( "src/main/mdo/supplemental-model.mdo",
250 new MojoExecutionXPathContainer( executions.get( 4 ) ).getValue(
251 "configuration/models[1]/model" ) );
252 }
253
254 public void testLifecycleQueryingUsingADefaultLifecyclePhase()
255 throws Exception
256 {
257 File pom = getProject( "project-with-additional-lifecycle-elements" );
258 MavenSession session = createMavenSession( pom );
259 assertEquals( "project-with-additional-lifecycle-elements", session.getCurrentProject().getArtifactId() );
260 assertEquals( "1.0", session.getCurrentProject().getVersion() );
261 List<MojoExecution> executionPlan = getExecutions( calculateExecutionPlan( session, "package" ) );
262
263
264
265
266
267
268
269
270
271
272 assertEquals( 8, executionPlan.size() );
273
274 assertEquals( "resources:resources", executionPlan.get( 0 ).getMojoDescriptor().getFullGoalName() );
275 assertEquals( "compiler:compile", executionPlan.get( 1 ).getMojoDescriptor().getFullGoalName() );
276 assertEquals( "it:generate-metadata", executionPlan.get( 2 ).getMojoDescriptor().getFullGoalName() );
277 assertEquals( "resources:testResources", executionPlan.get( 3 ).getMojoDescriptor().getFullGoalName() );
278 assertEquals( "compiler:testCompile", executionPlan.get( 4 ).getMojoDescriptor().getFullGoalName() );
279 assertEquals( "it:generate-test-metadata", executionPlan.get( 5 ).getMojoDescriptor().getFullGoalName() );
280 assertEquals( "surefire:test", executionPlan.get( 6 ).getMojoDescriptor().getFullGoalName() );
281 assertEquals( "jar:jar", executionPlan.get( 7 ).getMojoDescriptor().getFullGoalName() );
282 }
283
284 public void testLifecyclePluginsRetrievalForDefaultLifecycle()
285 throws Exception
286 {
287 List<Plugin> plugins =
288 new ArrayList<>( lifecycleExecutor.getPluginsBoundByDefaultToAllLifecycles( "jar" ) );
289
290 assertEquals( 8, plugins.size() );
291 }
292
293 public void testPluginConfigurationCreation()
294 throws Exception
295 {
296 File pom = getProject( "project-with-additional-lifecycle-elements" );
297 MavenSession session = createMavenSession( pom );
298 MojoDescriptor mojoDescriptor =
299 mojoDescriptorCreator.getMojoDescriptor( "org.apache.maven.its.plugins:maven-it-plugin:0.1:java", session,
300 session.getCurrentProject() );
301 Xpp3Dom dom = MojoDescriptorCreator.convert( mojoDescriptor );
302 System.out.println( dom );
303 }
304
305 MavenExecutionPlan calculateExecutionPlan( MavenSession session, String... tasks )
306 throws Exception
307 {
308 List<TaskSegment> taskSegments =
309 lifeCycleTaskSegmentCalculator.calculateTaskSegments( session, Arrays.asList( tasks ) );
310
311 TaskSegment mergedSegment = new TaskSegment( false );
312
313 for ( TaskSegment taskSegment : taskSegments )
314 {
315 mergedSegment.getTasks().addAll( taskSegment.getTasks() );
316 }
317
318 return lifeCycleExecutionPlanCalculator.calculateExecutionPlan( session, session.getCurrentProject(),
319 mergedSegment.getTasks() );
320 }
321
322 public void testInvalidGoalName()
323 throws Exception
324 {
325 File pom = getProject( "project-basic" );
326 MavenSession session = createMavenSession( pom );
327 try
328 {
329 getExecutions( calculateExecutionPlan( session, "resources:" ) );
330 fail( "expected a MojoNotFoundException" );
331 }
332 catch ( MojoNotFoundException e )
333 {
334 assertEquals( "", e.getGoal() );
335 }
336
337 try
338 {
339 getExecutions( calculateExecutionPlan( session, "org.apache.maven.plugins:maven-resources-plugin:0.1:resources:toomany" ) );
340 fail( "expected a MojoNotFoundException" );
341 }
342 catch ( MojoNotFoundException e )
343 {
344 assertEquals( "resources:toomany", e.getGoal() );
345 }
346 }
347
348
349 public void testPluginPrefixRetrieval()
350 throws Exception
351 {
352 File pom = getProject( "project-basic" );
353 MavenSession session = createMavenSession( pom );
354 Plugin plugin = mojoDescriptorCreator.findPluginForPrefix( "resources", session );
355 assertEquals( "org.apache.maven.plugins", plugin.getGroupId() );
356 assertEquals( "maven-resources-plugin", plugin.getArtifactId() );
357 }
358
359
360
361 public void testFindingPluginPrefixforCleanClean()
362 throws Exception
363 {
364 File pom = getProject( "project-basic" );
365 MavenSession session = createMavenSession( pom );
366 Plugin plugin = mojoDescriptorCreator.findPluginForPrefix( "clean", session );
367 assertNotNull( plugin );
368 }
369
370 public void testSetupMojoExecution()
371 throws Exception
372 {
373 File pom = getProject( "mojo-configuration" );
374
375 MavenSession session = createMavenSession( pom );
376
377 LifecycleTask task = new LifecycleTask( "generate-sources" );
378 MavenExecutionPlan executionPlan =
379 lifeCycleExecutionPlanCalculator.calculateExecutionPlan( session, session.getCurrentProject(),
380 Arrays.asList( (Object) task ), false );
381
382 MojoExecution execution = executionPlan.getMojoExecutions().get(0);
383 assertEquals(execution.toString(), "maven-it-plugin", execution.getArtifactId());
384 assertNull(execution.getConfiguration());
385
386 lifeCycleExecutionPlanCalculator.setupMojoExecution( session, session.getCurrentProject(), execution );
387 assertNotNull(execution.getConfiguration());
388 assertEquals("1.0", execution.getConfiguration().getChild( "version" ).getAttribute( "default-value" ));
389 }
390
391 public void testExecutionListeners()
392 throws Exception
393 {
394 final File pom = getProject( "project-basic" );
395 final MavenSession session = createMavenSession( pom );
396 session.setProjectDependencyGraph( new ProjectDependencyGraph()
397 {
398 public List<MavenProject> getUpstreamProjects( MavenProject project, boolean transitive )
399 {
400 return Collections.emptyList();
401 }
402
403 public List<MavenProject> getAllProjects()
404 {
405 return session.getAllProjects();
406 }
407
408 public List<MavenProject> getSortedProjects()
409 {
410 return Collections.singletonList( session.getCurrentProject() );
411 }
412
413 public List<MavenProject> getDownstreamProjects( MavenProject project, boolean transitive )
414 {
415 return Collections.emptyList();
416 }
417
418 public java.util.List<MavenProject> getAllSortedProjects()
419 {
420 return Collections.emptyList();
421 }
422 } );
423
424 final List<String> log = new ArrayList<>();
425
426 MojoExecutionListener mojoListener = new MojoExecutionListener()
427 {
428 public void beforeMojoExecution( MojoExecutionEvent event )
429 throws MojoExecutionException
430 {
431 assertNotNull( event.getSession() );
432 assertNotNull( event.getProject() );
433 assertNotNull( event.getExecution() );
434 assertNotNull( event.getMojo() );
435 assertNull( event.getCause() );
436
437 log.add( "beforeMojoExecution " + event.getProject().getArtifactId() + ":"
438 + event.getExecution().getExecutionId() );
439 }
440
441 public void afterMojoExecutionSuccess( MojoExecutionEvent event )
442 throws MojoExecutionException
443 {
444 assertNotNull( event.getSession() );
445 assertNotNull( event.getProject() );
446 assertNotNull( event.getExecution() );
447 assertNotNull( event.getMojo() );
448 assertNull( event.getCause() );
449
450 log.add( "afterMojoExecutionSuccess " + event.getProject().getArtifactId() + ":"
451 + event.getExecution().getExecutionId() );
452 }
453
454 public void afterExecutionFailure( MojoExecutionEvent event )
455 {
456 assertNotNull( event.getSession() );
457 assertNotNull( event.getProject() );
458 assertNotNull( event.getExecution() );
459 assertNotNull( event.getMojo() );
460 assertNotNull( event.getCause() );
461
462 log.add( "afterExecutionFailure " + event.getProject().getArtifactId() + ":"
463 + event.getExecution().getExecutionId() );
464 }
465 };
466 ProjectExecutionListener projectListener = new ProjectExecutionListener()
467 {
468 public void beforeProjectExecution( ProjectExecutionEvent event )
469 throws LifecycleExecutionException
470 {
471 assertNotNull( event.getSession() );
472 assertNotNull( event.getProject() );
473 assertNull( event.getExecutionPlan() );
474 assertNull( event.getCause() );
475
476 log.add( "beforeProjectExecution " + event.getProject().getArtifactId() );
477 }
478
479 public void beforeProjectLifecycleExecution( ProjectExecutionEvent event )
480 throws LifecycleExecutionException
481 {
482 assertNotNull( event.getSession() );
483 assertNotNull( event.getProject() );
484 assertNotNull( event.getExecutionPlan() );
485 assertNull( event.getCause() );
486
487 log.add( "beforeProjectLifecycleExecution " + event.getProject().getArtifactId() );
488 }
489
490 public void afterProjectExecutionSuccess( ProjectExecutionEvent event )
491 throws LifecycleExecutionException
492 {
493 assertNotNull( event.getSession() );
494 assertNotNull( event.getProject() );
495 assertNotNull( event.getExecutionPlan() );
496 assertNull( event.getCause() );
497
498 log.add( "afterProjectExecutionSuccess " + event.getProject().getArtifactId() );
499 }
500
501 public void afterProjectExecutionFailure( ProjectExecutionEvent event )
502 {
503 assertNotNull( event.getSession() );
504 assertNotNull( event.getProject() );
505 assertNull( event.getExecutionPlan() );
506 assertNotNull( event.getCause() );
507
508 log.add( "afterProjectExecutionFailure " + event.getProject().getArtifactId() );
509 }
510 };
511 lookup( DelegatingProjectExecutionListener.class ).addProjectExecutionListener( projectListener );
512 lookup( DelegatingMojoExecutionListener.class ).addMojoExecutionListener( mojoListener );
513
514 try
515 {
516 lifecycleExecutor.execute( session );
517 }
518 finally
519 {
520 lookup( DelegatingProjectExecutionListener.class ).removeProjectExecutionListener( projectListener );
521 lookup( DelegatingMojoExecutionListener.class ).removeMojoExecutionListener( mojoListener );
522 }
523
524 List<String> expectedLog = Arrays.asList( "beforeProjectExecution project-basic",
525 "beforeProjectLifecycleExecution project-basic",
526 "beforeMojoExecution project-basic:default-resources",
527 "afterMojoExecutionSuccess project-basic:default-resources",
528 "beforeMojoExecution project-basic:default-compile",
529 "afterMojoExecutionSuccess project-basic:default-compile",
530 "beforeMojoExecution project-basic:default-testResources",
531 "afterMojoExecutionSuccess project-basic:default-testResources",
532 "beforeMojoExecution project-basic:default-testCompile",
533 "afterMojoExecutionSuccess project-basic:default-testCompile",
534 "beforeMojoExecution project-basic:default-test",
535 "afterMojoExecutionSuccess project-basic:default-test",
536 "beforeMojoExecution project-basic:default-jar",
537 "afterMojoExecutionSuccess project-basic:default-jar",
538 "afterProjectExecutionSuccess project-basic"
539 );
540
541 assertEventLog( expectedLog, log );
542 }
543
544 private static void assertEventLog( List<String> expectedList, List<String> actualList )
545 {
546 assertEquals( toString( expectedList ), toString( actualList ) );
547 }
548
549 private static String toString( List<String> lines )
550 {
551 StringBuilder sb = new StringBuilder();
552 for ( String line : lines )
553 {
554 sb.append( line ).append( '\n' );
555 }
556 return sb.toString();
557 }
558 }