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}