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

import java.util.Vector;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.tools.schemaframework.PopulationManager;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.relational.EmployeeSystem;
import org.eclipse.persistence.testing.models.events.AboutToInsertMultiTableObject;
import org.eclipse.persistence.testing.models.events.EventHookSystem;
import org.eclipse.persistence.testing.models.events.AboutToInsertSingleTableObject;
import org.eclipse.persistence.testing.tests.events.MultipleTableAboutToInsertTest;
import org.eclipse.persistence.testing.tests.events.SingleTableAboutToInsertTest;
import org.eclipse.persistence.testing.tests.unitofwork.UOWSystem;

public class SimultaneousTestsModel extends TestModel {
    protected Session originalSession;

    /**
     * Return the JUnit suite to allow JUnit runner to find it.
     * Unfortunately JUnit only allows suite methods to be static,
     * so it is not possible to generically do this.
     */
    public static junit.framework.TestSuite suite() {
        return new SimultaneousTestsModel();
    }

    public SimultaneousTestsModel() {
        setDescription("This model runs MultithreadTestCases.");
    }

    @Override
    public void addRequiredSystems() {
        addRequiredSystem(new EmployeeSystem());
        addRequiredSystem(new EventHookSystem());
        addRequiredSystem(new UOWSystem());
    }

    @Override
    public void addTests() {
        addTest(new ConcurrencyTest());
        addTest(new AppendLockTest());
        addTest(new UpdateCacheKeyPropertiesTest());
        addTest(getReadEmployeeTestSuite());
        addTest(getAboutToUpdateEventTestSuite());
        addTest(getDescriptorQueryManagerAddQueryTest());
        addTest(getQueryCacheMultithreadedTest());
        addTest(new ConcurrentDecryptionTest());
        addTest(new ConcurrentReadOneToOneInheritanceTest());
        addTest(new ConcurrentReadFetchJoinTest());
        addTest(new ConcurrentReadFetchJoinWithUOWLocksTest());
        // int nAddDescriptorsTests, long timeToSleepBetweenAddingDescriptors
        addTest(AddDescriptorsMultithreadedTest.AddDescriptorsTest.createMultithreadedTest(3, 0));
        // int numberOfSequencePreallocationThreads, long timeToStopTests
        addTest(AddDescriptorsMultithreadedTest.SequencePreallocationTest.createMultithreadedTest(10, 10000));
        // int numberOfAddDescriptorsThreads, long timeToSleepBetweenAddingDescriptors, int numberOfSequencePreallocationThreads
        addTest(AddDescriptorsMultithreadedTest.SequencePreallocationTest.createMultithreadedTestWithAddDescriptors(1, 100, 10));
        // int numberOfInsertThreads, long timeToStopTests
        addTest(AddDescriptorsMultithreadedTest.InsertTest.createMultithreadedTest(10, 10000));
        // int numberOfAddDescriptorsThreads, long timeToSleepBetweenAddingDescriptors, int numberOfInsertThreads
        addTest(AddDescriptorsMultithreadedTest.InsertTest.createMultithreadedTestWithAddDescriptors(1, 100, 10));
        addTest(new ConcurrentQueryCacheQueryResultsTest());
    }

    public static TestSuite getReadEmployeeTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("Employee Multithread Test Suite");
        suite.setDescription("This suite tests the reading of all the objects of each class in the employee demo.");

        Vector tests = new Vector();
        Class employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
        Class largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
        Class smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
        PopulationManager manager = PopulationManager.getDefaultManager();

        tests.add(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
        tests.add(new ReadObjectTest(manager.getObject(employeeClass, "0002")));
        tests.add(new ReadObjectTest(manager.getObject(employeeClass, "0003")));
        tests.add(new ReadObjectTest(manager.getObject(employeeClass, "0004")));
        tests.add(new ReadObjectTest(manager.getObject(employeeClass, "0005")));

        org.eclipse.persistence.testing.models.employee.domain.Project project = (org.eclipse.persistence.testing.models.employee.domain.Project)manager.getObject(largeProjectClass, "0001");
        ReadObjectTest test = new ReadObjectTest(project);
        test.setQuery(new org.eclipse.persistence.queries.ReadObjectQuery(org.eclipse.persistence.testing.models.employee.domain.Project.class, new org.eclipse.persistence.expressions.ExpressionBuilder().get("id").equal(project.getId())));
        tests.add(test);

        tests.add(new ReadObjectTest(manager.getObject(smallProjectClass, "0001")));
        tests.add(new ReadObjectTest(manager.getObject(smallProjectClass, "0002")));
        tests.add(new ReadObjectTest(manager.getObject(smallProjectClass, "0003")));

        tests.add(new ReadObjectTest(manager.getObject(largeProjectClass, "0001")));
        tests.add(new ReadObjectTest(manager.getObject(largeProjectClass, "0002")));
        tests.add(new ReadObjectTest(manager.getObject(largeProjectClass, "0003")));

        tests.add(new ReadAllTest(org.eclipse.persistence.testing.models.employee.domain.Employee.class, 12));
        tests.add(new ReadAllTest(org.eclipse.persistence.testing.models.employee.domain.Project.class, 15));
        tests.add(new ReadAllTest(org.eclipse.persistence.testing.models.employee.domain.LargeProject.class, 5));
        tests.add(new ReadAllTest(org.eclipse.persistence.testing.models.employee.domain.SmallProject.class, 10));

        suite.addTest(new MultithreadTestCase(tests));

        return suite;
    }

    /**
     *  CR#3237
     *  Multithreaded tests for changing Database rows in AboutToInsertEvent
     */
    public static TestSuite getAboutToUpdateEventTestSuite() {
        TestSuite suite = new TestSuite();
        suite.setName("About to Update Multithread Test Suite");
        suite.setDescription("This suite tests use of aboutToUpdateEvents to change what is going to the database.");

        Vector tests = new Vector();

        tests.add(new SingleTableAboutToInsertTest(new AboutToInsertSingleTableObject(), true));
        tests.add(new MultipleTableAboutToInsertTest(new AboutToInsertMultiTableObject(), true));
        tests.add(new SingleTableAboutToInsertTest(new AboutToInsertSingleTableObject(), true));
        tests.add(new MultipleTableAboutToInsertTest(new AboutToInsertMultiTableObject(), true));
        tests.add(new SingleTableAboutToInsertTest(new AboutToInsertSingleTableObject(), true));
        tests.add(new MultipleTableAboutToInsertTest(new AboutToInsertMultiTableObject(), true));
        tests.add(new SingleTableAboutToInsertTest(new AboutToInsertSingleTableObject(), true));
        tests.add(new MultipleTableAboutToInsertTest(new AboutToInsertMultiTableObject(), true));
        tests.add(new SingleTableAboutToInsertTest(new AboutToInsertSingleTableObject(), true));
        tests.add(new MultipleTableAboutToInsertTest(new AboutToInsertMultiTableObject(), true));
        tests.add(new SingleTableAboutToInsertTest(new AboutToInsertSingleTableObject(), true));
        tests.add(new MultipleTableAboutToInsertTest(new AboutToInsertMultiTableObject(), true));
        MultithreadTestCase test = new MultithreadTestCase(tests);

        // Using a sequence connection pool gives us closer to real multithreaded operation since it
        // moves the sequence number acquisition outside of the transaction in our tests
        test.useSequenceConnectionPool();
        suite.addTest(test);

        return suite;
    }

    public static TestSuite getDescriptorQueryManagerAddQueryTest() {
        TestSuite suite = new TestSuite();
        suite.setName("DescriptorQueryManagerAddQueryTest");
        suite.setDescription("This suite tests use of descriptorQueryManager.addQuery() when called simultaneously with multiple threads..");
        suite.addTest(new DescriptorQueryManagerMultithreadedTest());

        return suite;
    }

    public static TestSuite getQueryCacheMultithreadedTest() {
        TestSuite suite = new TestSuite();
        suite.setName("QueryCacheMultithreadedTest");
        suite.setDescription("This suite runs queries with cached results many times in different threads.");
        suite.addTest(new QueryCacheMultithreadedTest());

        return suite;
    }
}
