1 package org.apache.maven.plugin.invoker;
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.maven.plugin.AbstractMojo;
23 import org.apache.maven.plugin.MojoExecutionException;
24 import org.apache.maven.plugin.MojoFailureException;
25 import org.apache.maven.plugin.invoker.model.io.xpp3.BuildJobXpp3Reader;
26 import org.codehaus.plexus.util.ReaderFactory;
27 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
28
29 import java.io.File;
30 import java.io.IOException;
31
32 /**
33 * Checks the results of maven-invoker-plugin based integration tests and fails the build if any tests failed.
34 *
35 * @goal verify
36 * @phase verify
37 * @threadSafe
38 * @author <a href="mailto:olamy@apache.org">olamy</a>
39 * @since 1.4
40 */
41 public class VerifyMojo extends AbstractMojo
42 {
43
44 /**
45 * Flag used to suppress certain invocations. This is useful in tailoring the build using profiles.
46 *
47 * @parameter expression="${invoker.skip}" default-value="false"
48 * @since 1.1
49 */
50 private boolean skipInvocation;
51
52 /**
53 * Base directory where all build reports are read from.
54 *
55 * @parameter expression="${invoker.reportsDirectory}" default-value="${project.build.directory}/invoker-reports"
56 * @since 1.4
57 */
58 private File reportsDirectory;
59
60 /**
61 * A flag controlling whether failures of the sub builds should fail the main build, too. If set to
62 * <code>true</code>, the main build will proceed even if one or more sub builds failed.
63 *
64 * @parameter expression="${maven.test.failure.ignore}" default-value="false"
65 * @since 1.3
66 */
67 private boolean ignoreFailures;
68
69 /**
70 * Flag used to suppress the summary output notifying of successes and failures. If set to <code>true</code>, the
71 * only indication of the build's success or failure will be the effect it has on the main build (if it fails, the
72 * main build should fail as well).
73 *
74 * @parameter default-value="false"
75 */
76 private boolean suppressSummaries;
77
78 /**
79 * Invokes Maven on the configured test projects.
80 *
81 * @throws org.apache.maven.plugin.MojoExecutionException If the goal encountered severe errors.
82 * @throws org.apache.maven.plugin.MojoFailureException If any of the Maven builds failed.
83 */
84 public void execute()
85 throws MojoExecutionException, MojoFailureException
86 {
87 if ( skipInvocation )
88 {
89 getLog().info( "Skipping invocation per configuration."
90 + " If this is incorrect, ensure the skipInvocation parameter is not set to true." );
91 return;
92 }
93
94 File[] reportFiles = ReportUtils.getReportFiles( reportsDirectory );
95 if ( reportFiles.length <= 0 )
96 {
97 getLog().info( "No invoker report files found, nothing to check." );
98 return;
99 }
100
101 InvokerSession invokerSession = new InvokerSession();
102 for ( int i = 0, size = reportFiles.length; i < size; i++ )
103 {
104 File reportFile = reportFiles[i];
105 try
106 {
107 BuildJobXpp3Reader reader = new BuildJobXpp3Reader();
108 invokerSession.addJob( reader.read( ReaderFactory.newXmlReader( reportFile ) ) );
109 }
110 catch ( XmlPullParserException e )
111 {
112 throw new MojoExecutionException( "Failed to parse report file: " + reportFile, e );
113 }
114 catch ( IOException e )
115 {
116 throw new MojoExecutionException( "Failed to read report file: " + reportFile, e );
117 }
118 }
119
120 if ( !suppressSummaries )
121 {
122 invokerSession.logSummary( getLog(), ignoreFailures );
123 }
124
125 invokerSession.handleFailures( getLog(), ignoreFailures );
126 }
127
128 }