blob: 78572a523c62352e56d9d8271ba5637891a0129c [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.weaving;
import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.List;
import org.eclipse.persistence.descriptors.changetracking.ChangeTracker;
import org.eclipse.persistence.internal.descriptors.PersistenceEntity;
import org.eclipse.persistence.internal.weaving.*;
import org.eclipse.persistence.queries.FetchGroup;
import org.eclipse.persistence.queries.FetchGroupTracker;
import org.eclipse.persistence.queries.ReadAllQuery;
import org.eclipse.persistence.queries.ReadObjectQuery;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.performance.*;
import org.eclipse.persistence.tools.schemaframework.PopulationManager;
/**
* This model tests reading/writing using weaved performance employee model.
*/
public class EmployeeWeavingTestModel extends TestModel {
public EmployeeWeavingTestModel() {
setDescription("This model tests reading/writing using weaved performance employee model.");
}
@Override
public void addRequiredSystems() {
addRequiredSystem(new EmployeeSystem());
}
@Override
public void addTests() {
addTest(getWeaverTestSuite());
addTest(getReadObjectTestSuite());
addTest(getUpdateTestSuite());
addTest(getInsertTestSuite());
addTest(getReadAllTestSuite());
addTest(getFetchGroupsTestSuite());
}
public TestSuite getInsertTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("EmployeeWeavedInsertTestSuite");
suite.setDescription("This suite tests the insertion of each object in the employee weaved performance model.");
EmployeePopulator system = new EmployeePopulator();
suite.addTest(new UnitOfWorkBasicInsertObjectTest(system.basicEmployeeExample1()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(system.basicEmployeeExample2()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(system.basicEmployeeExample3()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(system.basicEmployeeExample4()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(system.basicEmployeeExample5()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(system.basicSmallProjectExample1()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(system.basicSmallProjectExample2()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(system.basicSmallProjectExample3()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(system.basicLargeProjectExample1()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(system.basicLargeProjectExample2()));
suite.addTest(new UnitOfWorkBasicInsertObjectTest(system.basicLargeProjectExample3()));
return suite;
}
public TestSuite getReadAllTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("EmployeeWeavedReadAllTestSuite");
suite.setDescription("This suite tests the reading of all the objects of each class in the employee weaved performance model.");
suite.addTest(new ReadAllTest(Employee.class, 12));
suite.addTest(new ReadAllTest(Project.class, 15));
suite.addTest(new ReadAllTest(LargeProject.class, 5));
suite.addTest(new ReadAllTest(SmallProject.class, 10));
return suite;
}
public TestSuite getReadObjectTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("EmployeeWeavedReadObjectTestSuite");
suite.setDescription("This suite test the reading of each object in the employee weaved performance model.");
Class<Employee> employeeClass = Employee.class;
Class<LargeProject> largeProjectClass = LargeProject.class;
Class<SmallProject> smallProjectClass = SmallProject.class;
PopulationManager manager = PopulationManager.getDefaultManager();
suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0002")));
suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0003")));
suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0004")));
suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0005")));
suite.addTest(new ReadObjectTest(manager.getObject(smallProjectClass, "0001")));
suite.addTest(new ReadObjectTest(manager.getObject(smallProjectClass, "0002")));
suite.addTest(new ReadObjectTest(manager.getObject(smallProjectClass, "0003")));
suite.addTest(new ReadObjectTest(manager.getObject(largeProjectClass, "0001")));
suite.addTest(new ReadObjectTest(manager.getObject(largeProjectClass, "0002")));
suite.addTest(new ReadObjectTest(manager.getObject(largeProjectClass, "0003")));
return suite;
}
public TestSuite getUpdateTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("EmployeeWeavedUpdateTestSuite");
suite.setDescription("This suite tests the updating of each object in the employee demo.");
Class<Employee> employeeClass = Employee.class;
Class<LargeProject> largeProjectClass = LargeProject.class;
Class<SmallProject> smallProjectClass = SmallProject.class;
PopulationManager manager = PopulationManager.getDefaultManager();
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(employeeClass, "0001")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(employeeClass, "0002")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(employeeClass, "0003")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(employeeClass, "0004")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(employeeClass, "0005")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(smallProjectClass, "0001")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(smallProjectClass, "0002")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(smallProjectClass, "0003")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(largeProjectClass, "0001")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(largeProjectClass, "0002")));
suite.addTest(new UnitOfWorkBasicUpdateObjectTest(manager.getObject(largeProjectClass, "0003")));
return suite;
}
public TestSuite getWeaverTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("WeaverTestSuite");
suite.setDescription("This suite tests that the weaver ran on the class files correctly.");
suite.addTest(buildWeaverTest());
return suite;
}
public TestSuite getFetchGroupsTestSuite() {
TestSuite suite = new TestSuite();
suite.setName("FetchGroupsTestSuite");
suite.setDescription("This suite tests weaving of fetch groups.");
suite.addTest(buildFetchGroupReadObjectTest());
suite.addTest(buildFetchGroupReadAllTest());
suite.addTest(buildFetchGroupReadObjectUOWTest());
suite.addTest(buildFetchGroupReadObjectUOWTransactionTest());
suite.addTest(buildFetchGroupUpdateObjectUOWTest());
suite.addTest(buildFetchGroupUpdateNonFetchedObjectUOWTest());
return suite;
}
public TestCase buildWeaverTest() {
TestCase test = new TestCase() {
@Override
public void test() {
testWeaving(new Employee(), true);
testWeaving(new SmallProject(), true);
testWeaving(new LargeProject(), true);
testWeaving(new EmploymentPeriod(), false);
testWeaving(new PhoneNumber(), true);
testWeaving(new Address(), false);
if ((new EmployeeSystem()) instanceof PersistenceWeaved) {
throwError("EmployeeSystem should not be weaved.");
}
}
public void testWeaving(Object object, boolean indirection) {
if (!(object instanceof PersistenceWeaved)) {
throwError("Object not weaved:" + object);
}
if ((object instanceof PersistenceWeavedLazy) != indirection) {
throwError("Object not weaved for indirection:" + object);
}
if (!(object instanceof ChangeTracker)) {
throwError("Object not weaved for ChangeTracker:" + object);
}
// Aggregate descriptors are stored on the mapping, nor weaved for PersistenceEntity.
if (object instanceof EmploymentPeriod) {
if (!getSession().getDescriptor(Employee.class).getMappingForAttributeName("period").getReferenceDescriptor().getObjectChangePolicy().isAttributeChangeTrackingPolicy()) {
throwError("Descriptor not set to use change tracking:" + object);
}
} else {
if (!getSession().getDescriptor(object).getObjectChangePolicy().isAttributeChangeTrackingPolicy()) {
throwError("Descriptor not set to use change tracking:" + object);
}
if (!(object instanceof PersistenceEntity)) {
throwError("Object not weaved for PersistenceEntity:" + object);
}
if (!(object instanceof FetchGroupTracker)) {
throwError("Object not weaved for FetchGroupTracker:" + object);
}
}
}
};
test.setName("WeaverTeest");
return test;
}
/**
* Test a basic fetch group read.
*/
public TestCase buildFetchGroupReadObjectTest() {
TestCase test = new TestCase() {
@Override
public void test() throws Exception {
Employee fetched = (Employee)getSession().readObject(Employee.class);
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
ReadObjectQuery query = new ReadObjectQuery(fetched);
FetchGroup fetchGroup = new FetchGroup();
fetchGroup.addAttribute("firstName");
fetchGroup.addAttribute("lastName");
query.setFetchGroup(fetchGroup);
Employee partial = (Employee)getSession().executeQuery(query);
verfiyFetchGroup(this, partial, fetched);
}
};
test.setName("FetchGroupReadObjectTest");
return test;
}
/**
* Test a fetch group read in a unit of work.
*/
public TestCase buildFetchGroupReadObjectUOWTest() {
TestCase test = new TestCase() {
@Override
public void test() throws Exception {
Employee fetched = (Employee)getSession().readObject(Employee.class);
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
ReadObjectQuery query = new ReadObjectQuery(fetched);
FetchGroup fetchGroup = new FetchGroup();
fetchGroup.addAttribute("firstName");
fetchGroup.addAttribute("lastName");
query.setFetchGroup(fetchGroup);
Employee partial = (Employee)getSession().acquireUnitOfWork().executeQuery(query);
verfiyFetchGroup(this, partial, fetched);
}
};
test.setName("FetchGroupReadObjectUOWTest");
return test;
}
/**
* Test a fetch group update in a unit of work.
*/
public TestCase buildFetchGroupUpdateObjectUOWTest() {
TestCase test = new TransactionalTestCase() {
@Override
public void test() throws Exception {
Employee fetched = (Employee)getSession().readObject(Employee.class);
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
ReadObjectQuery query = new ReadObjectQuery(fetched);
FetchGroup fetchGroup = new FetchGroup();
fetchGroup.addAttribute("firstName");
fetchGroup.addAttribute("lastName");
query.setFetchGroup(fetchGroup);
UnitOfWork uow = getSession().acquireUnitOfWork();
Employee partial = (Employee)uow.executeQuery(query);
partial.setFirstName("partial");
uow.commit();
fetched = (Employee)getSession().readObject(partial);
if (!fetched.getFirstName().equals("partial")) {
throwError("Partial update not merged.");
}
}
};
test.setName("FetchGroupUpdateObjectUOWTest");
return test;
}
/**
* Test a fetch group update in a unit of work.
*/
public TestCase buildFetchGroupUpdateNonFetchedObjectUOWTest() {
TestCase test = new TransactionalTestCase() {
@Override
public void test() throws Exception {
Employee fetched = (Employee)getSession().readObject(Employee.class);
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
ReadObjectQuery query = new ReadObjectQuery(fetched);
FetchGroup fetchGroup = new FetchGroup();
fetchGroup.addAttribute("firstName");
fetchGroup.addAttribute("lastName");
fetchGroup.addAttribute("address");
query.setFetchGroup(fetchGroup);
UnitOfWork uow = getSession().acquireUnitOfWork();
Employee partial = (Employee)uow.executeQuery(query);
partial.setSalary(1234);
uow.commit();
fetched = (Employee)getSession().readObject(partial);
if (fetched.getSalary() != 1234) {
throwError("Partial update not merged.");
}
}
};
test.setName("FetchGroupUpdateNonFetchedObjectUOWTest");
return test;
}
/**
* Test a fetch group read in a unit of work early transaction.
*/
public TestCase buildFetchGroupReadObjectUOWTransactionTest() {
TestCase test = new TestCase() {
@Override
public void test() throws Exception {
Employee fetched = (Employee)getSession().readObject(Employee.class);
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
ReadObjectQuery query = new ReadObjectQuery(fetched);
FetchGroup fetchGroup = new FetchGroup();
fetchGroup.addAttribute("firstName");
fetchGroup.addAttribute("lastName");
fetchGroup.addAttribute("manager");
query.setFetchGroup(fetchGroup);
UnitOfWork uow = getSession().acquireUnitOfWork();
uow.beginEarlyTransaction();
try {
Employee partial = (Employee)uow.executeQuery(query);
verfiyFetchGroup(this, partial, fetched);
} finally {
uow.release();
}
}
};
test.setName("FetchGroupReadObjectUOWTransactionTest");
return test;
}
/**
* Test a basic fetch group read.
*/
public TestCase buildFetchGroupReadAllTest() {
TestCase test = new TestCase() {
@Override
public void test() throws Exception {
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
ReadAllQuery query = new ReadAllQuery(Employee.class);
FetchGroup fetchGroup = new FetchGroup();
fetchGroup.addAttribute("firstName");
fetchGroup.addAttribute("lastName");
fetchGroup.addAttribute("period");
query.setFetchGroup(fetchGroup);
List result = (List)getSession().executeQuery(query);
for (Iterator iterator = result.iterator(); iterator.hasNext(); ) {
Employee partial = (Employee)iterator.next();
partial.getFirstName();
partial.getAddress().getCity();
}
}
};
test.setName("FetchGroupReadAllTest");
return test;
}
/**
* Helper verify method used to verify partially fetch objects (first/lastName).
*/
public void verfiyFetchGroup(TestCase test, Employee partial, Employee fetched) throws Exception {
Field firstNameField = Employee.class.getDeclaredField("firstName");
firstNameField.setAccessible(true);
if (!(fetched.getFirstName().equals(firstNameField.get(partial)))) {
test.throwError("FirstName not fetch correctly.");
}
Field salaryField = Employee.class.getDeclaredField("salary");
salaryField.setAccessible(true);
if (((Number)salaryField.get(partial)).longValue() != 0) {
test.throwError("Salary should not be fetched.");
}
if (!(partial.getFirstName().equals(fetched.getFirstName()))) {
test.throwError("FirstName not fetch correctly.");
}
if (!(partial.getLastName().equals(fetched.getLastName()))) {
test.throwError("LastName not fetch correctly.");
}
if (partial.getSalary() != fetched.getSalary()) {
test.throwError("Salary not fetch correctly.");
}
if (!partial.getAddress().getCity().equals(fetched.getAddress().getCity())) {
test.throwError("Address not fetch correctly.");
}
}
}