blob: 0ce90dee8f881c89941ecc1fd0f1e9e37fc09bee [file] [log] [blame]
/*
* 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.testing.models.employee.domain.Employee;
import org.eclipse.persistence.testing.models.employee.domain.LargeProject;
import org.eclipse.persistence.testing.models.employee.domain.SmallProject;
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<Employee> employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
Class<LargeProject> largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
Class<SmallProject> 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;
}
}