blob: 22cf40cb3cfaf1445c12a807814741b675e32d0f [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.descriptors.invalidation.*;
import org.eclipse.persistence.tools.schemaframework.PopulationManager;
import org.eclipse.persistence.queries.*;
import org.eclipse.persistence.expressions.*;
import org.eclipse.persistence.testing.framework.*;
import org.eclipse.persistence.testing.models.employee.domain.*;
public class CacheExpiryTestSuite extends TestSuite {
public CacheExpiryTestSuite() {
setDescription("Test the cache expiry feature.");
}
@Override
public void addTests() {
addTest(new CacheExpiryAPITest());
TimeToLiveCacheInvalidationPolicy ttlPolicy = new TimeToLiveCacheInvalidationPolicy(0);
AutoVerifyTestCase test = new CacheExpiryPolicyTest(ttlPolicy, true);
test.setDescription("Ensure Objects expire with TIME_TO_LIVE_EXPIRY.");
test.setName("TIME_TO_LIVE_EXPIRY(0s) - Expire");
addTest(test);
ttlPolicy = new TimeToLiveCacheInvalidationPolicy(100000);
test = new CacheExpiryPolicyTest(ttlPolicy, false);
test.setDescription("Ensure Objects survive with TIME_TO_LIVE_EXPIRY.");
test.setName("TIME_TO_LIVE_EXPIRY(100s) - Live");
addTest(test);
ttlPolicy = new TimeToLiveCacheInvalidationPolicy(-100000);
test = new CacheExpiryPolicyTest(ttlPolicy, true);
test.setDescription("Ensure Objects expire with TIME_TO_LIVE_EXPIRY.");
test.setName("TIME_TO_LIVE_EXPIRY(-100s) - Expire");
addTest(test);
Calendar calendar = new GregorianCalendar();
calendar.add(GregorianCalendar.MILLISECOND, -1);
DailyCacheInvalidationPolicy dPolicy =
new DailyCacheInvalidationPolicy(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND));
test = new CacheExpiryPolicyTest(dPolicy, true);
test.setDescription("Ensure Objects expire with DAILY_EXPIRY.");
test.setName("DAILY - Expire");
addTest(test);
calendar = new GregorianCalendar();
dPolicy =
new DailyCacheInvalidationPolicy(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND),
calendar.get(Calendar.MILLISECOND));
test = new CacheExpiryPolicyTest(dPolicy, true);
test.setDescription("Ensure Objects expire with DAILY_EXPIRY.");
test.setName("DAILY_EXPIRY - Expire");
addTest(test);
calendar = new GregorianCalendar();
calendar.add(GregorianCalendar.HOUR_OF_DAY, 1);
dPolicy =
new DailyCacheInvalidationPolicy(calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND),
calendar.get(Calendar.MILLISECOND));
test = new CacheExpiryPolicyTest(dPolicy, false);
test.setDescription("Ensure Objects survive with DAILY_EXPIRY.");
test.setName("DAILY_EXPIRY - Live");
addTest(test);
test = new CacheExpiryPolicyTest(new NoExpiryCacheInvalidationPolicy(), false);
test.setDescription("Ensure Objects survive with NO_EXPIRY.");
test.setName("NO_EXPIRY - Live");
addTest(test);
long oneDay = 1000 * 60 * 60 * 24; // milliseconds in a day
long minusOneDay = -1 * oneDay;
test = new DailyCacheExpiryTest(oneDay + 1000, 0, false);
test.setDescription("Ensure cache expiry works correctly when expiry is greater than one day away.");
test.setName("Daily Expiry (+ One Day)");
addTest(test);
test = new DailyCacheExpiryTest(minusOneDay - 100, minusOneDay - 1000, true);
test.setDescription("Ensure cache expiry works correctly when expiry is greater than one day ago.");
test.setName("Daily Expiry (- One Day)");
addTest(test);
test = new DailyCacheExpiryTest(0, (3 * minusOneDay) - 1000, true);
test.setDescription("Ensure cache expiry works correctly when expiry is many days.");
test.setName("Daily Expiry (- 3 Days)");
addTest(test);
test = new DailyCacheExpiryTest(3 * oneDay, 0, false);
test.setDescription("Ensure cache expiry works correctly when expiry is many days.");
test.setName("Daily Expiry (+ 3 Days)");
addTest(test);
addTest(new NoExpiryInvalidationTest());
PopulationManager manager = PopulationManager.getDefaultManager();
Employee employeeToRead = (Employee)manager.getObject(Employee.class, "0001");
ReadObjectQuery query = new ReadObjectQuery(employeeToRead);
query.checkCacheThenDatabase();
test = new CacheExpiryReadObjectQueryTest(employeeToRead, query, true);
test.setDescription("Verify Read Object Query with expiry and a query object.");
test.setName("ReadObjectQuery (query object) Expiry Test");
addTest(test);
query = new ReadObjectQuery(employeeToRead);
query.checkCacheThenDatabase();
test = new CacheExpiryReadObjectQueryTest(employeeToRead, query, false);
test.setDescription("Verify Read Object Query which does not expire.");
test.setName("ReadObjectQuery No Expiry Test");
addTest(test);
query = new ReadObjectQuery(Employee.class);
query.checkCacheThenDatabase();
test = new CacheExpiryReadObjectQueryTest(employeeToRead, query, false);
test.setDescription("Verify Read Object Query which does not expire and queries with no selection criteria.");
test.setName("ReadObjectQuery (no criteria) No Expiry Test");
addTest(test);
ExpressionBuilder exactPKBuilder = new ExpressionBuilder();
Expression exactPK = exactPKBuilder.get("id").equal(employeeToRead.getId());
query = new ReadObjectQuery(Employee.class, exactPK);
query.checkCacheThenDatabase();
test = new CacheExpiryReadObjectQueryTest(employeeToRead, query, false);
test.setDescription("Verify Read Object Query which does not expire and queries by primary key.");
test.setName("ReadObjectQuery (exact primary key) No Expiry Test");
addTest(test);
ExpressionBuilder inExactPKBuilder = new ExpressionBuilder();
Expression inExactPK = inExactPKBuilder.get("firstName").equal(employeeToRead.getFirstName());
inExactPK = inExactPK.and(inExactPKBuilder.get("lastName").equal(employeeToRead.getLastName()));
inExactPK = inExactPK.and(inExactPKBuilder.get("id").equal(employeeToRead.getId()));
query = new ReadObjectQuery(Employee.class, inExactPK);
query.checkCacheThenDatabase();
test = new CacheExpiryReadObjectQueryTest(employeeToRead, query, false);
test.setDescription("Verify Read Object Query which does not expire and queries by in exact primary key.");
test.setName("ReadObjectQuery (in-exact primary key) No Expiry Test");
addTest(test);
test = new CacheExpiryReadAllQueryTest(true);
test.setDescription("Verify Read All Query which does expires.");
test.setName("ReadAllQuery Expiry Test");
addTest(test);
test = new CacheExpiryReadAllQueryTest(false);
test.setDescription("Verify Read All Query which does not expire.");
test.setName("ReadAllQuery No Expiry Test");
addTest(test);
addTest(new ReadAllQueryCheckCacheOnlyExpiryTest());
addTest(new ReadObjectCheckCacheOnlyExpiryTest());
addTest(new RefreshQueryCacheExpiryTest());
addTest(new RefreshIfNewerVersionTest());
test = new UpdateQueryChangeExpiryTest(false);
test.setDescription("Verify expiry time does not get updated when Updates are not set to update expiry.");
test.setName("Update - do not update expiry test.");
addTest(test);
test = new UpdateQueryChangeExpiryTest(true);
test.setDescription("Verify expiry time gets updated when updates are set to update expiry.");
test.setName("Update - update expiry test.");
addTest(test);
addTest(new ReadAllQueryConformExpiryTest());
addTest(new ReadObjectQueryConformExpiryTest());
addTest(new CacheExpiryValueholderTest());
addTest(new UnitOfWorkExpiredObjectTest());
addTest(new CacheExpiryUnitOfWorkReadTest());
addTest(new UnitOfWorkCreateObjectReadTimeTest());
addTest(new SessionCreateObjectReadTimeTest());
/*
* 312503: JPA 2.0 CacheImpl behaviour change when recurse flag=false
* We only invalidate the subtree from the class parameter down when the recurse flag=false
* Previously only the class itself was invalidated
* The behaviour when the recurse flag is true is unaffected - the entire rooted (above) tree is still invalidated
*/
// invalidate the entire rooted tree
addTest(new InvalidateClassRecurseOptionTest(true));
// invalidate the subtree
addTest(new InvalidateClassRecurseOptionTest(false));
addTest(new InvalidateAllExternalChangeTest());
addTest(new InvalidateAllTest());
addTest(new PrimaryKeyQueryInUOWTest());
// EL bug 276362 - Re-Validate CacheKey before refreshing object graph
addTest(new UnitOfWorkRefreshAfterInvalidationTest());
// EL bug 336486
addTest(new CacheInvalidationPolicyCloneTest(NoExpiryCacheInvalidationPolicy.class));
addTest(new CacheInvalidationPolicyCloneTest(DailyCacheInvalidationPolicy.class));
addTest(new CacheInvalidationPolicyCloneTest(TimeToLiveCacheInvalidationPolicy.class));
}
}