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