blob: 3b6c1edfb511754137b2b2151d85c40c7ef14e68 [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.ignite.testframework;
import javax.cache.CacheException;
import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.internal.util.typedef.X;
import org.apache.ignite.transactions.TransactionConcurrency;
import org.apache.ignite.transactions.TransactionIsolation;
import org.apache.ignite.transactions.TransactionSerializationException;
import org.junit.Assume;
import static org.apache.ignite.IgniteSystemProperties.IGNITE_FORCE_MVCC_MODE_IN_TESTS;
import static org.junit.Assert.fail;
/**
* Provides checks for features supported when FORCE_MVCC mode is on.
*/
public class MvccFeatureChecker {
/** */
private static final boolean FORCE_MVCC =
IgniteSystemProperties.getBoolean(IGNITE_FORCE_MVCC_MODE_IN_TESTS, false);
/** */
public enum Feature {
/** */
CACHE_STORE,
/** */
NEAR_CACHE,
/** */
ENTRY_LOCK,
/** */
CACHE_EVENTS,
/** */
EVICTION,
/** */
EXPIRATION,
/** */
METRICS,
/** */
INTERCEPTOR
}
/**
* Fails if feature is not supported.
*
* @param f feature.
* @throws AssertionError If failed.
* @deprecated Use {@link #skipIfNotSupported(Feature)} instead.
*/
@Deprecated
public static void failIfNotSupported(Feature f) {
if (!forcedMvcc())
return;
String reason = unsupportedReason(f);
if (reason != null)
fail(reason);
}
/**
* Skips test if feature is not supported.
*
* @param f feature.
*/
public static void skipIfNotSupported(Feature f) {
if (!forcedMvcc())
return;
String reason = unsupportedReason(f);
Assume.assumeTrue(reason, reason == null);
}
/**
* @return {@code True} if Mvcc mode is forced.
*/
public static boolean forcedMvcc() {
return FORCE_MVCC;
}
/**
* Check if feature is supported.
*
* @param f Feature.
* @return {@code True} if feature is supported, {@code False} otherwise.
*/
public static boolean isSupported(Feature f) {
return unsupportedReason(f) == null;
}
/**
* Check if Tx mode is supported.
*
* @param conc Transaction concurrency.
* @param iso Transaction isolation.
* @return {@code True} if feature is supported, {@code False} otherwise.
*/
public static boolean isSupported(TransactionConcurrency conc, TransactionIsolation iso) {
return conc == TransactionConcurrency.PESSIMISTIC &&
iso == TransactionIsolation.REPEATABLE_READ;
}
/**
* Checks if given exception was caused by MVCC write conflict.
*
* @param e Exception.
*/
public static void assertMvccWriteConflict(Exception e) {
assert e != null;
if (e instanceof CacheException && e.getCause() instanceof TransactionSerializationException)
return;
fail("Unexpected exception: " + X.getFullStackTrace(e));
}
/**
* Fails if feature is not supported in Mvcc mode.
*
* @param feature Mvcc feature.
* @throws AssertionError If failed.
*/
private static String unsupportedReason(Feature feature) {
switch (feature) {
case NEAR_CACHE:
return "https://issues.apache.org/jira/browse/IGNITE-7187";
case CACHE_STORE:
return "https://issues.apache.org/jira/browse/IGNITE-8582";
case ENTRY_LOCK:
return "https://issues.apache.org/jira/browse/IGNITE-9324";
case CACHE_EVENTS:
return "https://issues.apache.org/jira/browse/IGNITE-9321";
case EVICTION:
return "https://issues.apache.org/jira/browse/IGNITE-7956";
case EXPIRATION:
return "https://issues.apache.org/jira/browse/IGNITE-7311";
case METRICS:
return "https://issues.apache.org/jira/browse/IGNITE-9224";
case INTERCEPTOR:
return "https://issues.apache.org/jira/browse/IGNITE-9323";
}
return null;
}
}