001/** 002 * Powerunit - A JDK1.8 test framework 003 * Copyright (C) 2014 Mathieu Boretti. 004 * 005 * This file is part of Powerunit 006 * 007 * Powerunit is free software: you can redistribute it and/or modify 008 * it under the terms of the GNU General Public License as published by 009 * the Free Software Foundation, either version 3 of the License, or 010 * (at your option) any later version. 011 * 012 * Powerunit is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 015 * GNU General Public License for more details. 016 * 017 * You should have received a copy of the GNU General Public License 018 * along with Powerunit. If not, see <http://www.gnu.org/licenses/>. 019 */ 020package ch.powerunit.surefire; 021 022import java.lang.reflect.InvocationTargetException; 023import java.util.Iterator; 024import java.util.Properties; 025 026import org.apache.maven.surefire.providerapi.AbstractProvider; 027import org.apache.maven.surefire.providerapi.ProviderParameters; 028import org.apache.maven.surefire.report.ConsoleLogger; 029import org.apache.maven.surefire.report.ReporterException; 030import org.apache.maven.surefire.report.ReporterFactory; 031import org.apache.maven.surefire.report.RunListener; 032import org.apache.maven.surefire.suite.RunResult; 033import org.apache.maven.surefire.testset.TestSetFailedException; 034import org.apache.maven.surefire.util.RunOrderCalculator; 035import org.apache.maven.surefire.util.ScanResult; 036import org.apache.maven.surefire.util.TestsToRun; 037 038import ch.powerunit.TestResultListener; 039import ch.powerunit.impl.DefaultPowerUnitRunnerImpl; 040 041/** 042 * @author borettim 043 * 044 */ 045public class PowerUnitProvider<T> extends AbstractProvider { 046 047 private final ClassLoader testClassLoader; 048 049 private final ProviderParameters providerParameters; 050 051 private final RunOrderCalculator runOrderCalculator; 052 053 private final ScanResult scanResult; 054 055 private final Properties parameters; 056 057 public PowerUnitProvider(ProviderParameters providerParameters) { 058 this.providerParameters = providerParameters; 059 this.testClassLoader = providerParameters.getTestClassLoader(); 060 this.scanResult = providerParameters.getScanResult(); 061 this.runOrderCalculator = providerParameters.getRunOrderCalculator(); 062 this.parameters = providerParameters.getProviderProperties(); 063 } 064 065 /* 066 * (non-Javadoc) 067 * 068 * @see org.apache.maven.surefire.providerapi.SurefireProvider#getSuites() 069 */ 070 @SuppressWarnings("rawtypes") 071 @Override 072 public Iterator<Class> getSuites() { 073 TestsToRun scanned = scanResult 074 .applyFilter(new PowerUnitProviderScannerFilter(parameters), 075 testClassLoader); 076 return runOrderCalculator.orderTestClasses(scanned).iterator(); 077 } 078 079 /* 080 * (non-Javadoc) 081 * 082 * @see 083 * org.apache.maven.surefire.providerapi.SurefireProvider#invoke(java.lang 084 * .Object) 085 */ 086 @Override 087 public RunResult invoke(Object forkTestSet) throws TestSetFailedException, 088 ReporterException, InvocationTargetException { 089 if (forkTestSet == null) { 090 RunResult r = RunResult.noTestsRun(); 091 @SuppressWarnings("rawtypes") 092 Iterator<Class> i = getSuites(); 093 while (i.hasNext()) { 094 r = r.aggregate(invoke(i.next())); 095 } 096 return r; 097 } 098 ReporterFactory reporterFactory = providerParameters 099 .getReporterFactory(); 100 101 ConsoleLogger consoleLogger = providerParameters.getConsoleLogger(); 102 RunListener rl = reporterFactory.createReporter(); 103 104 if (!(forkTestSet instanceof Class)) { 105 throw new TestSetFailedException( 106 "Unexpected error. Received parameter is not a class"); 107 } 108 @SuppressWarnings("unchecked") 109 Class<T> underTest = (Class<T>) forkTestSet; 110 TestResultListener<T> listener = new PowerUnitProviderListener<>( 111 consoleLogger, rl, underTest); 112 113 DefaultPowerUnitRunnerImpl<T> runner = new DefaultPowerUnitRunnerImpl<>( 114 underTest); 115 runner.addListener(listener); 116 runner.run(); 117 return reporterFactory.close(); 118 119 } 120}