/*
 * 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.framework;

import java.util.*;

/**
 * Performance test interface used for sharing behavoir and
 * result with EJB and core.
 */
public interface PerformanceComparisonTest extends TestEntity {
    /** Number of times to repeat the test run (to compute average/stddv) */
    int REPEATS = 5;

    /** Default total time to run each test run (default is 2s). */
    int DEFAULT_TEST_TIME = 10000;

    /** Default for allowable % difference between tests and baseline test. */
    double DEFAULT_ALLOWABLE_DECREASE = -5;

    /**
     * Return the count of the iterations.
     * This is maintained by the test to allow concurrent tests to manage the count.
     */
    int getIterations();

    /**
     * Increment the iteration count.
     * This is maintained by the test to allow concurrent tests to manage the count.
     */
    void incrementIterations();

    /**
     * Reset the iteration count.
     * This is maintained by the test to allow concurrent tests to manage the count.
     */
    void resetIterations();

    /**
     * Allows any test specific setup before starting the test run.
     */
    void startTest();

    /**
     * Allows any test specific setup before starting the test run.
     */
    void endTest();

    /**
     * Return the total time (ms) to run each of the test runs.
     * This is used to compute the number of test iterations to use,
     * the tests are then still timed based on that number of iterations.
     */
    long getTestRunTime();

    /**
     * Set the total time (ms) to run each of the test runs.
     * This is used to compute the number of test iterations to use,
     * the tests are then still timed based on that number of iterations.
     */
    void setTestRunTime(long testRunTime);

    /**
     * Return the allowable percentage difference for test compared to the baseline.
     */
    double getAllowableDecrease();

    /**
     * Set the allowable percentage difference for test compared to the baseline.
     */
    void setAllowableDecrease(double allowableDecrease);

    /**
     * Return the performance tests to compare the base-line with.
     */
    List getTests();

    /**
     * Add a performance tests to compare the base-line with.
     */
    void addTest(TestCase test);

}
