blob: 922472a031435caa2cfe9401e60753d5dcdbf624 [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.identitymaps.cacheinvalidation;
import java.util.*;
import org.eclipse.persistence.internal.identitymaps.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.descriptors.invalidation.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
/**
* Test the API Associated with Cache Expiry to ensure it works.
*/
public class CacheExpiryAPITest extends CacheExpiryTest {
protected String isValidSuccess = null;
protected boolean invalidateObjectSuccess = true;
protected boolean invalidateCollectionSuccess = true;
protected boolean invalidateClassSuccess = true;
protected long remainingTime = 0;
public CacheExpiryAPITest() {
setDescription("Test the specific API for Cache Expiry on the IdentityMapAccessor.");
}
@Override
public void setup() {
super.setup();
getSession().getDescriptor(Employee.class).setCacheInvalidationPolicy(new TimeToLiveCacheInvalidationPolicy(10000));
getSession().readAllObjects(Employee.class);
}
@Override
public void test() {
// validate the IdentitityMapAccessor isValid method against the CacheKey.isValidMethod()
Employee employee = (Employee)getSession().readObject(Employee.class);
boolean validEmployee = getAbstractSession().getIdentityMapAccessor().isValid(employee);
if (getValidityFromIdentityMapManager(employee) != validEmployee) {
isValidSuccess = "identityMapAccessor().isValid() did not return true for a valid object.";
return;
}
((TimeToLiveCacheInvalidationPolicy)getSession().getDescriptor(Employee.class).getCacheInvalidationPolicy()).setTimeToLive(-1);
validEmployee = getAbstractSession().getIdentityMapAccessor().isValid(employee);
if (getValidityFromIdentityMapManager(employee) != validEmployee) {
isValidSuccess = "identityMapAccessor().isValid() did not return false for an invalid object.";
return;
}
getSession().getIdentityMapAccessor().initializeIdentityMaps();
getSession().readAllObjects(Employee.class);
// validate the IdentitityMapAccessor invalidateObject method
employee = (Employee)getSession().readObject(Employee.class);
getAbstractSession().getIdentityMapAccessor().invalidateObject(employee);
if (getAbstractSession().getIdentityMapAccessor().isValid(employee)) {
invalidateObjectSuccess = false;
return;
}
// validate the IdentitityMapAccessor invalidateObjects method
ExpressionBuilder employees = new ExpressionBuilder();
Expression exp = employees.get("lastName").equal("Smith");
Vector smiths = getSession().readAllObjects(Employee.class, exp);
getAbstractSession().getIdentityMapAccessor().invalidateObjects(smiths);
Enumeration smithEnum = smiths.elements();
while (smithEnum.hasMoreElements()) {
employee = (Employee)smithEnum.nextElement();
if (getAbstractSession().getIdentityMapAccessor().isValid(employee)) {
invalidateCollectionSuccess = false;
return;
}
}
// validate the IdentitityMapAccessor invalidateClass method
Vector allEmployees = getSession().readAllObjects(Employee.class);
getAbstractSession().getIdentityMapAccessor().invalidateClass(Employee.class);
Enumeration empEnum = allEmployees.elements();
while (empEnum.hasMoreElements()) {
employee = (Employee)empEnum.nextElement();
if (getAbstractSession().getIdentityMapAccessor().isValid(employee)) {
invalidateClassSuccess = false;
return;
}
}
// validate the IdentitityMapAccessor remainingValidTime method. Since we cannot be exactly sure
// about the timing, we will check if the two method calls occur within one second of one another
// this should be a small enough time to be meaningful and large enough to allow method calls to
// occur.
getAbstractSession().getDescriptor(Employee.class).setCacheInvalidationPolicy(new TimeToLiveCacheInvalidationPolicy(100000));
getAbstractSession().getIdentityMapAccessor().initializeIdentityMaps();
employee = (Employee)getAbstractSession().readObject(Employee.class);
remainingTime = getAbstractSession().getIdentityMapAccessor().getRemainingValidTime(employee);
}
@Override
public void verify() {
if (isValidSuccess != null) {
throw new TestErrorException("IsValid() Failed. " + isValidSuccess);
}
if (!invalidateObjectSuccess) {
throw new TestErrorException("Invalidate Object API call did not correctly invalidate objects.");
}
if (!invalidateCollectionSuccess) {
throw new TestErrorException("Invalidate Objects API call did not correctly invalidate objects.");
}
if (!invalidateClassSuccess) {
throw new TestErrorException("Invalidate Class API call did not correctly invalidate objects.");
}
if (remainingTime > 101000 || remainingTime < 99000) {
throw new TestErrorException("Get Remaining Life API call did not return a reasonable value. Please check to see that the" +
" the system is not so overloaded that the time between 2 lines of java is greater than 1 second.");
}
}
public boolean getValidityFromIdentityMapManager(Object object) {
CacheKey key = getAbstractSession().getIdentityMapAccessorInstance().getCacheKeyForObject(object);
return !getAbstractSession().getDescriptor(object).getCacheInvalidationPolicy().isInvalidated(key,
System.currentTimeMillis());
}
}