/*
 * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
//     Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.optimization.queryandsqlcounting.querycache;

import java.util.*;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.descriptors.invalidation.*;

/**
 * Test the invalidation of query cache results
 * This test is configurable to use three types of invalidation and whether those types
 * of invalidation should cause the results to become invalid
 */
public class QueryCacheInvalidationTest extends NamedQueryQueryCacheTest {
    protected int invalidationPolicyType = 0;
    protected boolean expiringTest = false;
    protected int sleepTime = 0;
    public static final int NO_INVALIDATION = 0;
    public static final int TIME_TO_LIVE_INVALIDATION = 1;
    public static final int DAILY_INVALIDATION = 2;

    public QueryCacheInvalidationTest(int invalidationPolicyType, boolean expiringTest) {
        setName("QueryCacheInvalidationTest invalidationType: " + invalidationPolicyType + " expiring: " + expiringTest);
        setDescription("Test the various cache invalidation polcies on the query cache.");
        this.invalidationPolicyType = invalidationPolicyType;
        this.expiringTest = expiringTest;
    }

    /**
     * This method will build a cache invalidation policy for the query being run depending
     * on the invalidation and expiringTest settings of the query.
     */
    protected CacheInvalidationPolicy getInvalidationPolicy() {
        CacheInvalidationPolicy invalidationPolicy = null;
        if (invalidationPolicyType == NO_INVALIDATION) {
            invalidationPolicy = new NoExpiryCacheInvalidationPolicy();
        } else if (invalidationPolicyType == TIME_TO_LIVE_INVALIDATION) {
            if (expiringTest) {
                invalidationPolicy = new TimeToLiveCacheInvalidationPolicy(0);
                expectedSQLCount = 1;
                sleepTime = 100;
            } else {
                invalidationPolicy = new TimeToLiveCacheInvalidationPolicy(1000000);
            }
        } else {
            if (expiringTest) {
                expectedSQLCount = 1;
                GregorianCalendar calendar = new GregorianCalendar();
                calendar.setTime(new Date(System.currentTimeMillis() + 1000));
                invalidationPolicy = new DailyCacheInvalidationPolicy(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));
                sleepTime = 1500;
            } else {
                GregorianCalendar calendar = new GregorianCalendar();
                calendar.setTime(new Date(System.currentTimeMillis() + 1000000));
                invalidationPolicy = new DailyCacheInvalidationPolicy(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));

            }
        }
        return invalidationPolicy;
    }

    @Override
    public ReadQuery getQueryForTest() {
        ReadQuery testQuery = super.getQueryForTest();
        testQuery.setQueryResultsCachePolicy(new QueryResultsCachePolicy(getInvalidationPolicy()));
        return testQuery;
    }

    @Override
    public void test() {
        try {
            Thread.sleep(sleepTime);// sleep will allow cache to expire
        } catch (Exception exception) {
        }
        super.test();
    }
}
