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}