blob: 3d182e2064ef391fbaf03eba1da4e3ddc3115b2f [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.unitofwork;
import org.eclipse.persistence.sessions.SessionEventListener;
import org.eclipse.persistence.sessions.UnitOfWork;
import org.eclipse.persistence.testing.framework.TestErrorException;
import org.eclipse.persistence.testing.framework.TestWarningException;
import org.eclipse.persistence.testing.framework.TransactionalTestCase;
import org.eclipse.persistence.testing.models.employee.domain.Employee;
public class NoValidationWithInitIdentityMaps extends TransactionalTestCase {
protected String existenceCheck;
protected Employee objectToBeWritten;
// On some platforms (Sybase, Symfoware) if conn1 updates a row but hasn't yet committed
// the transaction then reading the row through conn2 may hang.
// To avoid this problem the listener would decrement transaction isolation level,
// then reading through conn2 no longer hangs, however may result (results on Sybase)
// in reading of uncommitted data.
SessionEventListener listener;
public NoValidationWithInitIdentityMaps() {
setDescription("Test using no validation.");
}
@Override
public void setup() {
if(getSession().isClientSession()) {
listener = checkTransactionIsolation();
}
super.setup();
existenceCheck = getSession().getDescriptor(Employee.class).getQueryManager().getExistenceCheck();
if (getSession() instanceof org.eclipse.persistence.sessions.remote.RemoteSession) {
throw new TestWarningException("This test uses functionality that does not work over remote sessions.");
}
}
@Override
public void reset() {
super.reset();
getSession().getDescriptor(Employee.class).setExistenceChecking(this.existenceCheck);
if(listener != null) {
getAbstractSession().getParent().getEventManager().removeListener(listener);
listener = null;
}
}
@Override
public void test() {
testNoneCheckDatabaseNewObject();
testNoneAssumeNonExistenceNewObject();
testNoneCheckDatabase();
testNoneAssumeExistence();
testNoneAssumeNonExistence();
}
public void testNoneCheckDatabaseNewObject() {
Employee employeeFromCache = new Employee();
//initialize Identity map to verify toplink will perform an existence check
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
getSession().getDescriptor(Employee.class).setExistenceChecking("Check database");
UnitOfWork uow = getSession().acquireUnitOfWork();
Employee newObject = (Employee)uow.newInstance(Employee.class);
this.objectToBeWritten = newObject;
uow.dontPerformValidation();
newObject.setManager(employeeFromCache);
uow.commit();
}
public void testNoneAssumeNonExistenceNewObject() {
Employee employeeFromCache = new Employee();
//initialize Identity map to verify toplink will perform an existence check
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
getSession().getDescriptor(Employee.class).setExistenceChecking("Assume non-existence");
UnitOfWork uow = getSession().acquireUnitOfWork();
Employee newObject = (Employee)uow.newInstance(Employee.class);
this.objectToBeWritten = newObject;
uow.dontPerformValidation();
newObject.setManager(employeeFromCache);
uow.commit();
}
public void testNoneCheckDatabase() {
Employee employeeFromCache = (Employee)getSession().readObject(Employee.class);
//initialize Identity map to verify toplink will perform an existence check
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
getSession().getDescriptor(Employee.class).setExistenceChecking("Check database");
UnitOfWork uow = getSession().acquireUnitOfWork();
Employee newObject = (Employee)uow.newInstance(Employee.class);
this.objectToBeWritten = newObject;
uow.dontPerformValidation();
newObject.setManager(employeeFromCache);
uow.commit();
}
public void testNoneAssumeExistence() {
Employee employeeFromCache = (Employee)getSession().readObject(Employee.class);
//initialize Identity map to verify toplink will perform an existence check
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
getSession().getDescriptor(Employee.class).setExistenceChecking("Assume existence");
UnitOfWork uow = getSession().acquireUnitOfWork();
Employee newObject = (Employee)uow.newInstance(Employee.class);
this.objectToBeWritten = newObject;
uow.dontPerformValidation();
newObject.setManager(employeeFromCache);
uow.commit();
}
public void testNoneAssumeNonExistence() {
Employee employeeFromCache = (Employee)getSession().readObject(Employee.class);
//initialize Identity map to verify toplink will perform an existence check
getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
getSession().getDescriptor(Employee.class).setExistenceChecking("Assume non-existence");
UnitOfWork uow = getSession().acquireUnitOfWork();
Employee newObject = (Employee)uow.newInstance(Employee.class);
this.objectToBeWritten = newObject;
uow.dontPerformValidation();
// newObject.setManager(employeeFromCache);
uow.commit();
}
@Override
public void verify() {
getSession().getIdentityMapAccessor().initializeIdentityMaps();
Object objectFromDatabase = getSession().readObject(objectToBeWritten);
if (!(compareObjects(this.objectToBeWritten, objectFromDatabase))) {
throw new TestErrorException("The object inserted into the database, '" + objectFromDatabase +
"' does not match the original, '" + this.objectToBeWritten + ".");
}
}
}