blob: 4718be260c2be82fca2aabcb9aca401747033982 [file] [log] [blame]
/*
* 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.
*/
package org.apache.geode.test.junit.rules;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.junit.AssumptionViolatedException;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import org.apache.geode.test.junit.IgnoreCondition;
import org.apache.geode.test.junit.IgnoreUntil;
import org.apache.geode.test.junit.support.IgnoreConditionEvaluationException;
/**
* The IgnoreUntilRule class...
*
* @see org.junit.rules.TestRule
* @see org.junit.runner.Description
* @see org.junit.runners.model.Statement
* @see org.apache.geode.test.junit.IgnoreUntil
* @see org.apache.geode.test.junit.IgnoreCondition
*/
@SuppressWarnings({"serial", "unused"})
public class IgnoreUntilRule implements TestRule, Serializable {
protected static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd";
protected static final String DEFAULT_MESSAGE = "Ignoring test case (%1$s) of test class (%2$s)!";
protected static final DateFormat DATE_FORMAT = new SimpleDateFormat(DATE_FORMAT_PATTERN);
@Override
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
IgnoreUntilRule.this.evaluate(base, description);
}
};
}
public final void evaluate(Statement statement, Description description) throws Throwable {
throwOnIgnoreTest(statement, description).evaluate();
}
protected Statement throwOnIgnoreTest(Statement statement, Description description) {
if (isTest(description)) {
boolean ignoreTest = false;
String message = "";
IgnoreUntil testCaseAnnotation = description.getAnnotation(IgnoreUntil.class);
if (testCaseAnnotation != null) {
ignoreTest = evaluate(testCaseAnnotation, description);
message = testCaseAnnotation.value();
} else if (description.getTestClass().isAnnotationPresent(IgnoreUntil.class)) {
IgnoreUntil testClassAnnotation =
description.getTestClass().getAnnotation(IgnoreUntil.class);
ignoreTest = evaluate(testClassAnnotation, description);
message = testClassAnnotation.value();
}
if (ignoreTest) {
throw new AssumptionViolatedException(format(message, description));
}
}
return statement;
}
protected boolean isTest(final Description description) {
return (description.isSuite() || description.isTest());
}
protected String format(String message, Description description) {
message = (!message.isEmpty() ? message : DEFAULT_MESSAGE);
return String.format(message, description.getMethodName(), description.getClassName());
}
protected boolean evaluate(IgnoreUntil conditionalIgnoreAnnotation, Description description) {
return (evaluateCondition(conditionalIgnoreAnnotation.condition(), description)
|| evaluateUntil(conditionalIgnoreAnnotation.until()));
}
protected boolean evaluateCondition(Class<? extends IgnoreCondition> ignoreConditionType,
Description description) {
try {
return ignoreConditionType.newInstance().evaluate(description);
} catch (Exception e) {
throw new IgnoreConditionEvaluationException(
String.format("failed to evaluate IgnoreCondition: %1$s", ignoreConditionType.getName()),
e);
}
}
protected boolean evaluateUntil(String timestamp) {
try {
return DATE_FORMAT.parse(timestamp).after(Calendar.getInstance().getTime());
} catch (ParseException e) {
return false;
}
}
}