blob: 4e04aad24c120415c5dd7a80aaef0571d81b5fbd [file] [log] [blame]
package org.apache.maven.surefire.api.provider;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.lang.reflect.InvocationTargetException;
import org.apache.maven.surefire.api.report.ReporterException;
import org.apache.maven.surefire.api.suite.RunResult;
import org.apache.maven.surefire.api.testset.TestSetFailedException;
/**
* Interface to be implemented by all Surefire providers.
* <br>
* NOTE: This class is part of the proposed public api for surefire providers for 2.7. It may
* still be subject to changes, even for minor revisions.
* <br>
* The api covers this interface and all the types reachable from it. And nothing else.
* <br>
* <br>
* Called in one of three ways:
* Forkmode = never: getSuites is not called, invoke is called with null parameter
* Forkmode = once: getSuites is not called, invoke is called with null parameter
* Forkmode anything else: getSuites is called, invoke is called on new provider instance for each item in getSuites
* response.
*
* @author Kristian Rosenvold
*/
public interface SurefireProvider
{
/**
* Determines the number of forks.
* <br>
* Called when forkmode is different from "never" or "always", allows the provider to define
* how to behave for the fork.
*
* @return An iterator that will trigger one fork per item
*/
Iterable<Class<?>> getSuites();
/**
* Runs a forked test
*
* @param forkTestSet An item from the iterator in #getSuites. Will be null for forkmode never or always.
* When this is non-null, the forked process will run only that test
* and probably not scan the classpath
* @return A result of the invocation
* @throws ReporterException
* When reporting fails
* @throws TestSetFailedException
* When testset fails
* @throws InvocationTargetException fails in {@code ProviderFactory}
*/
@SuppressWarnings( "checkstyle:redundantthrows" )
RunResult invoke( Object forkTestSet )
throws TestSetFailedException, ReporterException, InvocationTargetException;
/**
* Makes an attempt at cancelling the current run, giving the provider a chance to notify
* reporting that the remaining tests have been cancelled due to timeout.
* <br>
* If the provider thinks it can terminate properly it is the responsibility of
* the invoke method to return a RunResult with a booter code of failure.
* <br>
* It is up to the provider to find out how to implement this method properly.
* A provider may also choose to not do anything at all in this method,
* which means surefire will kill the forked process soon afterwards anyway.
* <br>
* Will be called on a different thread than the one calling invoke.
*/
// Todo: Need to think a lot closer about how/if this works and if there is a use case for it.
// Killing a process is slightly non-deterministic
// And it
void cancel();
}