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.Map; 024 025import org.apache.maven.surefire.providerapi.AbstractProvider; 026import org.apache.maven.surefire.providerapi.ProviderParameters; 027import org.apache.maven.surefire.report.ConsoleStream; 028import org.apache.maven.surefire.report.ReporterException; 029import org.apache.maven.surefire.report.ReporterFactory; 030import org.apache.maven.surefire.report.RunListener; 031import org.apache.maven.surefire.suite.RunResult; 032import org.apache.maven.surefire.testset.TestSetFailedException; 033import org.apache.maven.surefire.util.RunOrderCalculator; 034import org.apache.maven.surefire.util.ScanResult; 035import org.apache.maven.surefire.util.TestsToRun; 036 037import ch.powerunit.TestResultListener; 038import ch.powerunit.impl.DefaultPowerUnitRunnerImpl; 039 040/** 041 * @author borettim 042 * 043 */ 044public class PowerUnitProvider<T> extends AbstractProvider { 045 046 private final ClassLoader testClassLoader; 047 048 private final ProviderParameters providerParameters; 049 050 private final RunOrderCalculator runOrderCalculator; 051 052 private final ScanResult scanResult; 053 054 private final Map<String, String> parameters; 055 056 public PowerUnitProvider(ProviderParameters providerParameters) { 057 this.providerParameters = providerParameters; 058 this.testClassLoader = providerParameters.getTestClassLoader(); 059 this.scanResult = providerParameters.getScanResult(); 060 this.runOrderCalculator = providerParameters.getRunOrderCalculator(); 061 this.parameters = providerParameters.getProviderProperties(); 062 } 063 064 /* 065 * (non-Javadoc) 066 * 067 * @see org.apache.maven.surefire.providerapi.SurefireProvider#getSuites() 068 */ 069 @SuppressWarnings("rawtypes") 070 @Override 071 public Iterable<Class<?>> getSuites() { 072 TestsToRun scanned = scanResult.applyFilter(new PowerUnitProviderScannerFilter(parameters), testClassLoader); 073 return runOrderCalculator.orderTestClasses(scanned); 074 } 075 076 /* 077 * (non-Javadoc) 078 * 079 * @see 080 * org.apache.maven.surefire.providerapi.SurefireProvider#invoke(java.lang 081 * .Object) 082 */ 083 @Override 084 public RunResult invoke(Object forkTestSet) 085 throws TestSetFailedException, ReporterException, InvocationTargetException { 086 if (forkTestSet == null) { 087 RunResult r = RunResult.noTestsRun(); 088 @SuppressWarnings("rawtypes") 089 Iterable<Class<?>> i = getSuites(); 090 for (Class<?> c : i) { 091 r = r.aggregate(invoke(c)); 092 } 093 return r; 094 } 095 ReporterFactory reporterFactory = providerParameters.getReporterFactory(); 096 097 ConsoleStream consoleLogger = providerParameters.getConsoleLogger(); 098 RunListener rl = reporterFactory.createReporter(); 099 100 if (!(forkTestSet instanceof Class)) { 101 throw new TestSetFailedException("Unexpected error. Received parameter is not a class"); 102 } 103 @SuppressWarnings("unchecked") 104 Class<T> underTest = (Class<T>) forkTestSet; 105 TestResultListener<T> listener = new PowerUnitProviderListener<>(consoleLogger, rl, underTest); 106 107 DefaultPowerUnitRunnerImpl<T> runner = new DefaultPowerUnitRunnerImpl<>(underTest); 108 runner.addListener(listener); 109 runner.run(); 110 return reporterFactory.close(); 111 112 } 113}