All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.processpuzzle.maven.plugin.fitnesse.mojo.VerifyMojo Maven / Gradle / Ivy

The newest version!
package com.processpuzzle.maven.plugin.fitnesse.mojo;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.surefire.SurefireHelper;
import org.apache.maven.surefire.shade.org.apache.maven.shared.utils.ReaderFactory;
import org.apache.maven.surefire.suite.RunResult;
import org.codehaus.plexus.util.IOUtil;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import fitnesse.slim.SlimServer;

/**
 * Goal that provides summary report on FitNesse tests run with 'run-tests' goal. Intended to be bound to the 'verify' phase. Will fail the build if there are
 * test failures.
 * 
 * @goal verify
 * @phase verify
 */
public class VerifyMojo extends RunTestsMojo {
   private static final String HTML = ".html";
   private static final String ERR_MSG = "FITNESSE ERROR in %s:%n%s";

   /**
    * @parameter property="fitnesse.maxErrorsToConsole"
    */
   protected int maxErrorsToConsole = 0;
   private int countErrorsToConsole = 0;
   private RunResult summary;

   public VerifyMojo() {
      super( false );
   }

   @Override
   public final void execute() throws MojoExecutionException, MojoFailureException {
      summary = readSummary();
      
      if( logErrorsToConsole() && errorOccured() ){
         logExceptions();
      }
      SurefireHelper.reportExecution( this, summary, getLog() );
   }

   private boolean errorOccured() {
      return summary.getErrors() > 0 || summary.getFailures() > 0;
   }

   private void logExceptions() throws MojoExecutionException {
      final Launch[] launches = super.launches();
      for( int i = 0; i < launches.length && logErrorsToConsole(); i++ ){
         final File indexFile = new File( this.reportsDir, launches[i].getPageName() + HTML );
         final Document indexHtml = parseHtml( indexFile );
         final List anchors = indexHtml.getElementsByTag( "a" );
         for( int j = 0; j < anchors.size() && logErrorsToConsole(); j++ ){
            final String test = anchors.get( j ).attr( "href" );
            final File testFile = new File( this.reportsDir, test );
            final Document testHtml = parseHtml( testFile );
            final List errors = testHtml.getElementsByClass( "error" );
            for( int k = 0; k < errors.size() && logErrorsToConsole(); k++ ){
               final Element error = errors.get( k );
               final Elements fitLabel = error.getElementsByClass( "fit_label" );
               if( !fitLabel.isEmpty() ){
                  logFitNesseError( test, fitLabel.text() );
               }
               final Elements fitStacktrace = error.getElementsByClass( "fit_stacktrace" );
               if( !fitStacktrace.isEmpty() ){
                  logFitNesseError( test, fitStacktrace.text() );
               }
            }
            final List details = testHtml.getElementsByClass( "exception-detail" );
            for( int k = 0; k < details.size() && logErrorsToConsole(); k++ ){
               final Element detail = details.get( k );
               if( detail.hasText() ){
                  logFitNesseError( test, StringUtils.substringAfter( detail.text(), SlimServer.EXCEPTION_TAG ) );
               }
            }
         }
      }
   }

   private boolean logErrorsToConsole() {
      return( this.countErrorsToConsole < this.maxErrorsToConsole);
   }

   private void logFitNesseError( final String testName, final String errorText ) {
      if( logErrorsToConsole() ){
         getLog().error( String.format( ERR_MSG, StringUtils.substringBeforeLast( testName, HTML ), errorText ) );
         this.countErrorsToConsole++;
      }
   }

   private Document parseHtml( final File file ) throws MojoExecutionException {
      try{
         final Document html = Jsoup.parse( file, ReaderFactory.UTF_8 );
         return html;
      }catch( final IOException e ){
         throw new MojoExecutionException( "IOException: " + file, e );
      }finally{
         // JSoup closes the stream for us
      }
   }

   /**
    * @see org.apache.maven.plugin.failsafe.VerifyMojo
    */
   private RunResult readSummary() throws MojoExecutionException {
      FileInputStream fileInputStream = null;
      BufferedInputStream bufferedInputStream = null;
      try{
         fileInputStream = new FileInputStream( this.summaryFile );
         bufferedInputStream = new BufferedInputStream( fileInputStream );
         return RunResult.fromInputStream( bufferedInputStream, ReaderFactory.UTF_8 );
      }catch( Exception e ){
         throw new MojoExecutionException( e.getMessage(), e );
      }finally{
         IOUtil.close( bufferedInputStream );
         IOUtil.close( fileInputStream );
      }
   }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy