| /* |
| * 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; |
| } |
| } |
| |
| } |