package org.arquillian.cube.requirement;
import java.lang.annotation.Annotation;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.arquillian.cube.spi.requirement.Requires;
import org.arquillian.cube.spi.requirement.UnsatisfiedRequirementException;
import org.jboss.arquillian.junit.Arquillian;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.model.InitializationError;
import static org.arquillian.cube.requirement.Requirements.checkRequirement;
public class ArquillianConditionalRunner extends Arquillian {
private static final Logger log = Logger.getLogger(ArquillianConditionalRunner.class.getName());
public ArquillianConditionalRunner(Class<?> testClass) throws InitializationError {
super(testClass);
}
@Override
public void run(RunNotifier notifier) {
Class testClass = getTestClass().getJavaClass();
try {
checkRequirements(testClass);
super.run(notifier);
} catch (UnsatisfiedRequirementException e) {
log.log(Level.WARNING,
String.format("Unsatisfied assumption in test class %s. Requirement problem: %s.", testClass.getName(),
e.getMessage()));
notifier.fireTestAssumptionFailed(new Failure(getDescription(), e));
}
}
private void checkRequirements(Class<?> testClass) throws UnsatisfiedRequirementException {
//Check if Requires is used directly.
checkRequirement(testClass.getAnnotation(Requires.class), null);
for (Annotation annotation : testClass.getAnnotations()) {
//Check if Requires is annotating an other annotation
checkRequirement(annotation.annotationType().getAnnotation(Requires.class), annotation);
}
}
}