blob: 0df94540f870514794d10f07114911aa0c757578 [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.readonly;
import java.util.*;
import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
import org.eclipse.persistence.sessions.*;
import org.eclipse.persistence.testing.models.readonly.Country;
import org.eclipse.persistence.testing.models.readonly.Address;
import org.eclipse.persistence.testing.models.readonly.Promoter;
import org.eclipse.persistence.testing.framework.*;
/**
* <p>
* <b>Purpose</b>: Test the public API with regards to manipulation of the sets of the
* read-only classes in a UnitOfWork and the default set in Project.
* <p>
* <b>Responsibilities</b>:
* <ul>
* <li> Test the accessors for the manipulation of the read-only class set in instances
* <li> of UnitOfWork.
* <li> Test the accessors for the manipulation of the default read-only class in an
* <li> instance of Project.
* </ul>
*/
public class ReadOnlyClassAccessingTestCase extends TestCase {
public ReadOnlyClassAccessingTestCase() {
super();
}
/**
* Compares a Hashtable and a vector for equality.
*/
protected boolean areEqual(Set ht, Vector v1) {
if (v1.size() != ht.size()) {
return false;
}
for (Enumeration enumtr = v1.elements(); enumtr.hasMoreElements();) {
if (!ht.contains(enumtr.nextElement())) {
return false;
}
}
return true;
}
/**
* Compares two vectors for equality.
*/
protected boolean areEqual(Vector v1, Vector v2) {
if (v1.size() != v2.size()) {
return false;
}
for (Enumeration enumtr = v1.elements(); enumtr.hasMoreElements();) {
if (!v2.contains(enumtr.nextElement())) {
return false;
}
}
for (Enumeration enumtr = v2.elements(); enumtr.hasMoreElements();) {
if (!v1.contains(enumtr.nextElement())) {
return false;
}
}
return true;
}
@Override
public void reset() {
getSession().getProject().setDefaultReadOnlyClasses(new Vector());
}
@Override
protected void setup() {
getSession().getProject().setDefaultReadOnlyClasses(new Vector());
}
@Override
protected void test() {
// Test acquiring a unit of work.
UnitOfWork uow1 = getSession().acquireUnitOfWork();
if (!uow1.getReadOnlyClasses().isEmpty()) {
throw new TestErrorException(" When acquiring a UnitOfWork from a Session, the read-only classes where not empty as expected.");
}
uow1.release();
// Test acquiring a unit of work with a vector of read-only classes.
Vector classes = new Vector();
classes.addElement(Promoter.class);
classes.addElement(Country.class);
UnitOfWork uow2 = getSession().acquireUnitOfWork();
uow2.removeAllReadOnlyClasses();
uow2.addReadOnlyClasses(classes);
if (!areEqual(uow2.getReadOnlyClasses(), classes)) {
throw new TestErrorException("When acquiring a UnitOfWork from a Session, the read-only classes specified did not get set in the UnitOfWork;");
}
// Test the testing of read-only classes
for (Enumeration enumtr = classes.elements(); enumtr.hasMoreElements();) {
if (!uow2.isClassReadOnly((Class)enumtr.nextElement())) {
throw new TestErrorException("Testing whether a class is read-only or not has failed.");
}
}
if (uow2.isClassReadOnly(Vector.class)) {
throw new TestErrorException("Testing whether a class is read-only or not has failed.");
}
// Test the add and remove of read-only classes.
uow2.removeReadOnlyClass(Promoter.class);
if (uow2.isClassReadOnly(Promoter.class)) {
throw new TestErrorException("The method removeReadOnlyClass(Class) failed.");
}
uow2.addReadOnlyClass(Promoter.class);
if (!uow2.isClassReadOnly(Promoter.class)) {
throw new TestErrorException("The method addReadOnlyClass(Class) failed.");
}
// Test the removeAll.
uow2.removeAllReadOnlyClasses();
if ((uow2.isClassReadOnly(Country.class)) || (!uow2.getReadOnlyClasses().isEmpty())) {
throw new TestErrorException("Did not remove all the read-only classes from a UnitOfWork properly");
}
// Check that we cannot make changes to the read-only set after registering an object.
try {
uow2.registerObject(new Address());
uow2.removeAllReadOnlyClasses();
uow2.addReadOnlyClasses(classes);
if (areEqual(uow2.getReadOnlyClasses(), classes)) {
throw new TestErrorException("Shouldn't be able to change the readOnlyClasses of a UnitOfWork after an object was registered.");
}
} catch (org.eclipse.persistence.exceptions.ValidationException ex) {
getSession().logMessage("Caught validation exeception...OK");
} finally {
uow2.release();
}
// Check that the default read-only classes work.
Vector someClasses = new Vector();
someClasses.addElement(Country.class);
someClasses.addElement(Address.class);
getSession().getProject().setDefaultReadOnlyClasses(someClasses);
UnitOfWork uow3 = getSession().acquireUnitOfWork();
if (!areEqual(uow3.getReadOnlyClasses(), someClasses)) {
throw new TestErrorException("The default read-only classes were not set properly when a UnitOfWork was aquired");
}
// Nested units of work should not be able to reduce the set of read-only classes.
UnitOfWork uow4 = uow3.acquireUnitOfWork();
try {
uow4.removeAllReadOnlyClasses();
} catch (org.eclipse.persistence.exceptions.ValidationException ex) {
getSession().logMessage("Check the nested units of work read-only classes. OK");
} finally {
uow3.release();
uow4.release();
}
// You should be able to get the default set of read-only classes from nested UnitOfWork objects.
UnitOfWork uow5 = getSession().acquireUnitOfWork();
UnitOfWork uow6 = uow5.acquireUnitOfWork();
if (!areEqual(((UnitOfWorkImpl)uow5).getDefaultReadOnlyClasses(), ((UnitOfWorkImpl)uow6).getDefaultReadOnlyClasses()))
throw new TestErrorException("Nested UnitOfWorks did not return consistent default read-only classes.");
uow5.release();
uow6.release();
}
/**
* Compares two vectors for equality.
*/
protected boolean vectorsEqual(Vector v1, Vector v2) {
if (v1.size() != v2.size()) {
return false;
}
for (Enumeration enumtr = v1.elements(); enumtr.hasMoreElements();) {
if (!v2.contains(enumtr.nextElement())) {
return false;
}
}
for (Enumeration enumtr = v2.elements(); enumtr.hasMoreElements();) {
if (!v1.contains(enumtr.nextElement())) {
return false;
}
}
return true;
}
}