| /* |
| * 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 org.eclipse.persistence.queries.*; |
| import org.eclipse.persistence.descriptors.invalidation.*; |
| import org.eclipse.persistence.internal.sessions.AbstractSession; |
| import org.eclipse.persistence.testing.framework.*; |
| import org.eclipse.persistence.testing.models.employee.domain.*; |
| |
| /** |
| * Test ReadObject Query with Cache Expiry. |
| * This test will work for both expiring employees and non-expiring employees. |
| */ |
| public class CacheExpiryReadObjectQueryTest extends CacheExpiryTest { |
| |
| protected boolean shouldExpire = false; |
| protected Employee employee = null; |
| protected String firstName = null; |
| protected Employee queriedEmployee = null; |
| protected ReadObjectQuery query = null; |
| |
| public CacheExpiryReadObjectQueryTest(Employee employee, ReadObjectQuery query, boolean shouldExpire) { |
| setDescription("Test Cache Expiry a read Object Query."); |
| this.employee = employee; |
| this.shouldExpire = shouldExpire; |
| this.query = query; |
| } |
| |
| @Override |
| public void setup() { |
| super.setup(); |
| // Use cache expiry which will last the during of this test. |
| getSession().getDescriptor(Employee.class).setCacheInvalidationPolicy(new TimeToLiveCacheInvalidationPolicy(100000)); |
| } |
| |
| @Override |
| public void test() { |
| // read an employee and then mutate the first name in the cache. |
| Employee readEmployee = (Employee)getSession().readObject(employee); |
| firstName = readEmployee.getFirstName(); |
| Employee mutatedEmployee = (Employee)((AbstractSession)getSession()).getIdentityMapAccessorInstance().getFromIdentityMap(employee); |
| mutatedEmployee.setFirstName(firstName + "-mutated"); |
| |
| // invalidate the employee in the cache if neccessary |
| if (shouldExpire) { |
| getAbstractSession().getIdentityMapAccessor().invalidateObject(mutatedEmployee); |
| } |
| |
| // Reread the employee. If the employee expired, we will get an employee with the original |
| // name. Otherwise we will get an employee with the mutated name. |
| queriedEmployee = (Employee)getSession().executeQuery(query); |
| } |
| |
| @Override |
| public void verify() { |
| if (shouldExpire && !firstName.equals(queriedEmployee.getFirstName())) { |
| throw new TestErrorException("Expiring Read Object Query did not properly expire. Please ensure this system is not running " + |
| "with a heavy load prior to filing a bug since the cache expiry tests rely to a certain degree on timing."); |
| |
| } else if (!shouldExpire && firstName.equals(queriedEmployee.getFirstName())) { |
| throw new TestErrorException("Non-Expiring Read Object Query did not properly cache results. Please ensure this system is not running " + |
| "with a heavy load prior to filing a bug since the cache expiry tests rely to a certain degree on timing."); |
| |
| } |
| |
| } |
| } |