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.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import static org.arquillian.cube.requirement.Requirements.checkRequirement; public class RequirementRule implements TestRule { private static final Logger log = Logger.getLogger(RequirementRule.class.getName()); @Override public Statement apply(Statement base, Description description) { Statement result = base; try { //Check if Requires is used directly. checkRequirement(description.getAnnotation(Requires.class), null); for (Annotation annotation : description.getAnnotations()) { //Check if Requires is annotating an other annotation checkRequirement(annotation.annotationType().getAnnotation(Requires.class), annotation); } } catch (UnsatisfiedRequirementException e) { log.log(Level.WARNING, String.format("Unsatisfied assumption in test class %s. Requirement problem: %s.", description.getTestClass().getName(), e.getMessage())); return new UnsatisfiedRequirement(e.getMessage()); } return result; } }