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