/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.cache.test.util;
import com.liferay.portal.cache.TransactionalPortalCache;
import com.liferay.portal.kernel.cache.PortalCache;
import com.liferay.portal.kernel.cache.PortalCacheHelperUtil;
import com.liferay.portal.kernel.cache.transactional.TransactionalPortalCacheHelper;
import com.liferay.portal.kernel.configuration.Filter;
import com.liferay.portal.kernel.dao.orm.EntityCache;
import com.liferay.portal.kernel.dao.orm.FinderCache;
import com.liferay.portal.kernel.test.ReflectionTestUtil;
import com.liferay.portal.kernel.test.rule.CodeCoverageAssertor;
import com.liferay.portal.kernel.transaction.Propagation;
import com.liferay.portal.kernel.transaction.TransactionAttribute;
import com.liferay.portal.kernel.transaction.TransactionAttribute.Builder;
import com.liferay.portal.kernel.transaction.TransactionLifecycleListener;
import com.liferay.portal.kernel.transaction.TransactionStatus;
import com.liferay.portal.kernel.util.Props;
import com.liferay.portal.kernel.util.PropsKeys;
import com.liferay.portal.kernel.util.PropsUtil;
import com.liferay.portal.kernel.util.ProxyUtil;
import com.liferay.registry.BasicRegistryImpl;
import com.liferay.registry.Registry;
import com.liferay.registry.RegistryUtil;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Test;
/**
* @author Shuyang Zhou
*/
public class TransactionalPortalCacheTest {
@ClassRule
public static final CodeCoverageAssertor codeCoverageAssertor =
new CodeCoverageAssertor() {
@Override
public void appendAssertClasses(List<Class<?>> assertClasses) {
assertClasses.add(TransactionalPortalCache.class);
Class<TransactionalPortalCacheHelper> clazz =
TransactionalPortalCacheHelper.class;
assertClasses.add(clazz);
Collections.addAll(assertClasses, clazz.getDeclaredClasses());
TransactionLifecycleListener transactionLifecycleListener =
TransactionalPortalCacheHelper.
TRANSACTION_LIFECYCLE_LISTENER;
assertClasses.add(transactionLifecycleListener.getClass());
}
};
@BeforeClass
public static void setUpClass() {
RegistryUtil.setRegistry(new BasicRegistryImpl());
Registry registry = RegistryUtil.getRegistry();
registry.registerService(
EntityCache.class,
(EntityCache)ProxyUtil.newProxyInstance(
EntityCache.class.getClassLoader(),
new Class<?>[] {EntityCache.class},
new InvocationHandler() {
@Override
public Object invoke(
Object proxy, Method method, Object[] args) {
return null;
}
}));
registry.registerService(
FinderCache.class,
(FinderCache)ProxyUtil.newProxyInstance(
FinderCache.class.getClassLoader(),
new Class<?>[] {FinderCache.class},
new InvocationHandler() {
@Override
public Object invoke(
Object proxy, Method method, Object[] args) {
return null;
}
}));
}
@Before
public void setUp() {
_portalCache = new TestPortalCache<>(_PORTAL_CACHE_NAME);
_transactionalPortalCache = new TransactionalPortalCache<>(
_portalCache);
_portalCache.put(_KEY_1, _VALUE_1);
_testCacheListener = new TestPortalCacheListener<>();
_portalCache.registerPortalCacheListener(_testCacheListener);
_testCacheReplicator = new TestPortalCacheReplicator<>();
_portalCache.registerPortalCacheListener(_testCacheReplicator);
ReflectionTestUtil.setFieldValue(
TransactionalPortalCacheHelper.class, "_transactionalCacheEnabled",
null);
}
@Test
public void testConstructor() {
new TransactionalPortalCacheHelper();
}
@Test
public void testNoneTransactionalCache1() {
_setEnableTransactionalCache(false);
Assert.assertFalse(TransactionalPortalCacheHelper.isEnabled());
doTestNoneTransactionalCache();
}
@Test
public void testNoneTransactionalCache2() {
_setEnableTransactionalCache(true);
doTestNoneTransactionalCache();
}
@Test
public void testTransactionalCacheWithoutTTL() {
_setEnableTransactionalCache(true);
doTestTransactionalCache(false);
}
@Test
public void testTransactionalCacheWithParameterValidation() {
_setEnableTransactionalCache(true);
TransactionalPortalCacheHelper.begin();
// Get
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
// Get with null key
try {
_transactionalPortalCache.get(null);
Assert.fail();
}
catch (NullPointerException npe) {
Assert.assertEquals("Key is null", npe.getMessage());
}
// Put
_transactionalPortalCache.put(_KEY_1, _VALUE_2);
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
// Put with null key
try {
_transactionalPortalCache.put(null, _VALUE_1);
Assert.fail();
}
catch (NullPointerException npe) {
Assert.assertEquals("Key is null", npe.getMessage());
}
// Put with null value
try {
_transactionalPortalCache.put(_KEY_1, null);
Assert.fail();
}
catch (NullPointerException npe) {
Assert.assertEquals("Value is null", npe.getMessage());
}
// Put with negative ttl
try {
_transactionalPortalCache.put(_KEY_1, _VALUE_1, -1);
Assert.fail();
}
catch (IllegalArgumentException iae) {
Assert.assertEquals("Time to live is negative", iae.getMessage());
}
// Remove
_transactionalPortalCache.remove(_KEY_1);
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
// Remove with null key
try {
_transactionalPortalCache.remove(null);
Assert.fail();
}
catch (NullPointerException npe) {
Assert.assertEquals("Key is null", npe.getMessage());
}
TransactionalPortalCacheHelper.commit();
}
@Test
public void testTransactionLifecycleListenerDisabled() {
_setEnableTransactionalCache(false);
TransactionLifecycleListener transactionLifecycleListener =
TransactionalPortalCacheHelper.TRANSACTION_LIFECYCLE_LISTENER;
transactionLifecycleListener.created(null, null);
transactionLifecycleListener.committed(null, null);
transactionLifecycleListener.rollbacked(null, null, null);
}
@Test
public void testTransactionLifecycleListenerEnabledWithBarrier() {
doTestTransactionLifecycleListenerEnabledWithBarrier(
Propagation.NOT_SUPPORTED);
doTestTransactionLifecycleListenerEnabledWithBarrier(Propagation.NEVER);
doTestTransactionLifecycleListenerEnabledWithBarrier(
Propagation.NESTED);
}
@Test
public void testTransactionLifecycleListenerEnabledWithExistTransaction() {
_setEnableTransactionalCache(true);
Assert.assertEquals(0, getTransactionStackSize());
TransactionLifecycleListener transactionLifecycleListener =
TransactionalPortalCacheHelper.TRANSACTION_LIFECYCLE_LISTENER;
Builder builder = new Builder();
TransactionAttribute transactionAttribute = builder.build();
TransactionStatus transactionStatus = new TestTrasactionStatus(
false, false, false);
transactionLifecycleListener.created(
transactionAttribute, transactionStatus);
Assert.assertEquals(0, getTransactionStackSize());
transactionLifecycleListener.committed(
transactionAttribute, transactionStatus);
Assert.assertEquals(0, getTransactionStackSize());
transactionLifecycleListener.created(
transactionAttribute, transactionStatus);
Assert.assertEquals(0, getTransactionStackSize());
transactionLifecycleListener.rollbacked(
transactionAttribute, transactionStatus, null);
Assert.assertEquals(0, getTransactionStackSize());
}
@Test
public void testTransactionLifecycleListenerEnabledWithoutBarrier() {
doTestTransactionLifecycleListenerEnabledWithoutBarrier(
Propagation.REQUIRED);
doTestTransactionLifecycleListenerEnabledWithoutBarrier(
Propagation.SUPPORTS);
doTestTransactionLifecycleListenerEnabledWithoutBarrier(
Propagation.MANDATORY);
doTestTransactionLifecycleListenerEnabledWithoutBarrier(
Propagation.REQUIRES_NEW);
}
protected void doTestNoneTransactionalCache() {
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
// Put 1
_transactionalPortalCache.put(_KEY_2, _VALUE_2);
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(1);
_testCacheListener.assertPut(_KEY_2, _VALUE_2);
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(1);
_testCacheReplicator.assertPut(_KEY_2, _VALUE_2);
_testCacheReplicator.reset();
// Put 2
_transactionalPortalCache.put(_KEY_1, _VALUE_2, 10);
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(1);
_testCacheListener.assertUpdated(_KEY_1, _VALUE_2, 10);
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(1);
_testCacheReplicator.assertUpdated(_KEY_1, _VALUE_2, 10);
_testCacheReplicator.reset();
// Put 3
try {
_transactionalPortalCache.put(_KEY_1, _VALUE_2, -1);
Assert.fail();
}
catch (IllegalArgumentException iae) {
Assert.assertEquals("Time to live is negative", iae.getMessage());
}
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(0);
_testCacheReplicator.assertActionsCount(0);
// Put 4
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_1, _VALUE_1);
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(1);
_testCacheListener.assertUpdated(_KEY_1, _VALUE_1);
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(0);
// Put 5
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_1, _VALUE_2, 10);
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(1);
_testCacheListener.assertUpdated(_KEY_1, _VALUE_2, 10);
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(0);
// Remove 1
_transactionalPortalCache.remove(_KEY_1);
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_2));
Assert.assertNull(_portalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(1);
_testCacheListener.assertRemoved(_KEY_1, _VALUE_2);
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(1);
_testCacheReplicator.assertRemoved(_KEY_1, _VALUE_2);
_testCacheReplicator.reset();
// Remove 2
PortalCacheHelperUtil.removeWithoutReplicator(
_transactionalPortalCache, _KEY_2);
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertNull(_portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(1);
_testCacheListener.assertRemoved(_KEY_2, _VALUE_2);
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(0);
// Remove all 1
_transactionalPortalCache.put(_KEY_1, _VALUE_1);
_transactionalPortalCache.put(_KEY_2, _VALUE_2);
_transactionalPortalCache.removeAll();
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertNull(_portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(3);
_testCacheListener.assertPut(_KEY_1, _VALUE_1);
_testCacheListener.assertPut(_KEY_2, _VALUE_2);
_testCacheListener.assertRemoveAll();
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(3);
_testCacheReplicator.assertPut(_KEY_1, _VALUE_1);
_testCacheReplicator.assertPut(_KEY_2, _VALUE_2);
_testCacheReplicator.assertRemoveAll();
_testCacheReplicator.reset();
// Remove all 2
_transactionalPortalCache.put(_KEY_1, _VALUE_1);
_transactionalPortalCache.put(_KEY_2, _VALUE_2);
PortalCacheHelperUtil.removeAllWithoutReplicator(
_transactionalPortalCache);
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertNull(_portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(3);
_testCacheListener.assertPut(_KEY_1, _VALUE_1);
_testCacheListener.assertPut(_KEY_2, _VALUE_2);
_testCacheListener.assertRemoveAll();
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(2);
_testCacheReplicator.assertPut(_KEY_1, _VALUE_1);
_testCacheReplicator.assertPut(_KEY_2, _VALUE_2);
_testCacheReplicator.reset();
}
protected void doTestTransactionalCache(boolean ttl) {
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
// Rollback
TransactionalPortalCacheHelper.begin();
_transactionalPortalCache.removeAll();
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
if (ttl) {
_transactionalPortalCache.put(_KEY_2, _VALUE_2, 10);
}
else {
_transactionalPortalCache.put(_KEY_2, _VALUE_2);
}
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_transactionalPortalCache.remove(_KEY_2);
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
if (ttl) {
_transactionalPortalCache.put(_KEY_1, _VALUE_1, 10);
}
else {
_transactionalPortalCache.put(_KEY_1, _VALUE_1);
}
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_transactionalPortalCache.removeAll();
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_1, _VALUE_1);
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_1, _VALUE_2, 10);
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(0);
_testCacheReplicator.assertActionsCount(0);
TransactionalPortalCacheHelper.rollback();
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(0);
_testCacheReplicator.assertActionsCount(0);
// Commit 1
TransactionalPortalCacheHelper.begin();
if (ttl) {
_transactionalPortalCache.put(_KEY_2, _VALUE_2, 10);
}
else {
_transactionalPortalCache.put(_KEY_2, _VALUE_2);
}
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
if (ttl) {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_1, _VALUE_2, 10);
}
else {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_1, _VALUE_2);
}
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
if (ttl) {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_2, _VALUE_1, 10);
}
else {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_2, _VALUE_1);
}
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_transactionalPortalCache.removeAll();
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(0);
_testCacheReplicator.assertActionsCount(0);
TransactionalPortalCacheHelper.commit();
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertNull(_portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(1);
_testCacheListener.assertRemoveAll();
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(1);
_testCacheReplicator.assertRemoveAll();
_testCacheReplicator.reset();
// Commit 2
TransactionalPortalCacheHelper.begin();
if (ttl) {
_transactionalPortalCache.put(_KEY_1, _VALUE_1, 10);
}
else {
_transactionalPortalCache.put(_KEY_1, _VALUE_1);
}
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertNull(_portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
if (ttl) {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_1, _VALUE_2, 10);
}
else {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_1, _VALUE_2);
}
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertNull(_portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(0);
_testCacheReplicator.assertActionsCount(0);
TransactionalPortalCacheHelper.commit();
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(1);
if (ttl) {
_testCacheListener.assertPut(_KEY_1, _VALUE_2, 10);
}
else {
_testCacheListener.assertPut(_KEY_1, _VALUE_2);
}
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(1);
if (ttl) {
_testCacheReplicator.assertPut(_KEY_1, _VALUE_2, 10);
}
else {
_testCacheReplicator.assertPut(_KEY_1, _VALUE_2);
}
_testCacheReplicator.reset();
// Commit 3
TransactionalPortalCacheHelper.begin();
_transactionalPortalCache.remove(_KEY_1);
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
if (ttl) {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_2, _VALUE_2, 10);
}
else {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_2, _VALUE_2);
}
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
if (ttl) {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_2, _VALUE_1, 10);
}
else {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_2, _VALUE_1);
}
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_2, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(0);
_testCacheReplicator.assertActionsCount(0);
TransactionalPortalCacheHelper.commit();
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_2));
Assert.assertNull(_portalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(2);
_testCacheListener.assertRemoved(_KEY_1, _VALUE_2);
if (ttl) {
_testCacheListener.assertPut(_KEY_2, _VALUE_1, 10);
}
else {
_testCacheListener.assertPut(_KEY_2, _VALUE_1);
}
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(1);
_testCacheReplicator.assertRemoved(_KEY_1, _VALUE_2);
_testCacheReplicator.reset();
// Commit 4
TransactionalPortalCacheHelper.begin();
PortalCacheHelperUtil.removeWithoutReplicator(
_transactionalPortalCache, _KEY_2);
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertNull(_portalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(0);
_testCacheReplicator.assertActionsCount(0);
TransactionalPortalCacheHelper.commit();
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertNull(_portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(1);
_testCacheListener.assertRemoved(_KEY_2, _VALUE_1);
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(0);
// Commit 5
_transactionalPortalCache.put(_KEY_1, _VALUE_1);
Assert.assertEquals(_VALUE_1, _transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(1);
_testCacheListener.assertPut(_KEY_1, _VALUE_1);
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(1);
_testCacheReplicator.assertPut(_KEY_1, _VALUE_1);
_testCacheReplicator.reset();
TransactionalPortalCacheHelper.begin();
PortalCacheHelperUtil.removeAllWithoutReplicator(
_transactionalPortalCache);
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
if (ttl) {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_2, _VALUE_2, 10);
}
else {
PortalCacheHelperUtil.putWithoutReplicator(
_transactionalPortalCache, _KEY_2, _VALUE_2);
}
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertEquals(_VALUE_2, _transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
PortalCacheHelperUtil.removeAllWithoutReplicator(
_transactionalPortalCache);
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertEquals(_VALUE_1, _portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(0);
_testCacheReplicator.assertActionsCount(0);
TransactionalPortalCacheHelper.commit();
Assert.assertNull(_transactionalPortalCache.get(_KEY_1));
Assert.assertNull(_transactionalPortalCache.get(_KEY_2));
Assert.assertNull(_portalCache.get(_KEY_1));
Assert.assertNull(_portalCache.get(_KEY_2));
_testCacheListener.assertActionsCount(1);
_testCacheListener.assertRemoveAll();
_testCacheListener.reset();
_testCacheReplicator.assertActionsCount(0);
}
protected void doTestTransactionLifecycleListenerEnabledWithBarrier(
Propagation propagation) {
_setEnableTransactionalCache(true);
Assert.assertEquals(0, getTransactionStackSize());
TransactionLifecycleListener transactionLifecycleListener =
TransactionalPortalCacheHelper.TRANSACTION_LIFECYCLE_LISTENER;
// Start parent transaction
Builder parentBuilder = new Builder();
TransactionAttribute parentTransactionAttribute = parentBuilder.build();
TransactionStatus parentTransactionStatus = new TestTrasactionStatus(
true, false, false);
transactionLifecycleListener.created(
parentTransactionAttribute, parentTransactionStatus);
Assert.assertEquals(1, getTransactionStackSize());
// Start child transaction with barrier
Builder childBuilder = new Builder();
childBuilder.setPropagation(propagation);
TransactionAttribute childTransactionAttribute = childBuilder.build();
TransactionStatus childTransactionStatus = new TestTrasactionStatus(
true, false, false);
transactionLifecycleListener.created(
childTransactionAttribute, childTransactionStatus);
Assert.assertEquals(0, getTransactionStackSize());
// Start grandchild transaction
Builder grandchildBuilder = new Builder();
TransactionAttribute grandchildTransactionAttribute =
grandchildBuilder.build();
TransactionStatus grandchildTransactionStatus =
new TestTrasactionStatus(true, false, false);
transactionLifecycleListener.created(
grandchildTransactionAttribute, grandchildTransactionStatus);
Assert.assertEquals(1, getTransactionStackSize());
// Commit grandchild transaction
transactionLifecycleListener.committed(
grandchildTransactionAttribute, grandchildTransactionStatus);
Assert.assertEquals(0, getTransactionStackSize());
// Start grandchild transaction again
transactionLifecycleListener.created(
grandchildTransactionAttribute, grandchildTransactionStatus);
Assert.assertEquals(1, getTransactionStackSize());
// Rollback grandchild transaction
transactionLifecycleListener.rollbacked(
grandchildTransactionAttribute, grandchildTransactionStatus, null);
Assert.assertEquals(0, getTransactionStackSize());
// Commit child transaction
transactionLifecycleListener.committed(
childTransactionAttribute, childTransactionStatus);
Assert.assertEquals(1, getTransactionStackSize());
// Start child transaction with barrier with barrier again
transactionLifecycleListener.created(
childTransactionAttribute, childTransactionStatus);
Assert.assertEquals(0, getTransactionStackSize());
// Rollback child transaction
transactionLifecycleListener.rollbacked(
childTransactionAttribute, childTransactionStatus, null);
Assert.assertEquals(1, getTransactionStackSize());
// Commit parent transaction
transactionLifecycleListener.committed(
parentTransactionAttribute, parentTransactionStatus);
Assert.assertEquals(0, getTransactionStackSize());
}
protected void doTestTransactionLifecycleListenerEnabledWithoutBarrier(
Propagation propagation) {
_setEnableTransactionalCache(true);
Assert.assertEquals(0, getTransactionStackSize());
TransactionLifecycleListener transactionLifecycleListener =
TransactionalPortalCacheHelper.TRANSACTION_LIFECYCLE_LISTENER;
// Start parent transaction
Builder parentBuilder = new Builder();
TransactionAttribute parentTransactionAttribute = parentBuilder.build();
TransactionStatus parentTransactionStatus = new TestTrasactionStatus(
true, false, false);
transactionLifecycleListener.created(
parentTransactionAttribute, parentTransactionStatus);
Assert.assertEquals(1, getTransactionStackSize());
// Start child transaction
Builder childBuilder = new Builder();
childBuilder.setPropagation(propagation);
TransactionAttribute childTransactionAttribute = parentBuilder.build();
TransactionStatus childTransactionStatus = new TestTrasactionStatus(
true, false, false);
transactionLifecycleListener.created(
childTransactionAttribute, childTransactionStatus);
Assert.assertEquals(2, getTransactionStackSize());
// Commit child transaction
transactionLifecycleListener.committed(
childTransactionAttribute, childTransactionStatus);
Assert.assertEquals(1, getTransactionStackSize());
// Start child transaction again
transactionLifecycleListener.created(
childTransactionAttribute, childTransactionStatus);
Assert.assertEquals(2, getTransactionStackSize());
// Rollback child transaction
transactionLifecycleListener.rollbacked(
childTransactionAttribute, childTransactionStatus, null);
Assert.assertEquals(1, getTransactionStackSize());
// Commit parent transaction
transactionLifecycleListener.committed(
parentTransactionAttribute, parentTransactionStatus);
Assert.assertEquals(0, getTransactionStackSize());
// Start parent transaction again
transactionLifecycleListener.created(
parentTransactionAttribute, parentTransactionStatus);
Assert.assertEquals(1, getTransactionStackSize());
// Rollback parent transaction
transactionLifecycleListener.rollbacked(
parentTransactionAttribute, parentTransactionStatus, null);
Assert.assertEquals(0, getTransactionStackSize());
}
protected int getTransactionStackSize() {
ThreadLocal<List<?>> portalCacheMapsThreadLocal =
ReflectionTestUtil.getFieldValue(
TransactionalPortalCacheHelper.class,
"_portalCacheMapsThreadLocal");
List<?> portalCacheMaps = portalCacheMapsThreadLocal.get();
return portalCacheMaps.size();
}
private void _setEnableTransactionalCache(boolean enabled) {
TestProps testProps = new TestProps();
testProps.setProperty(
PropsKeys.TRANSACTIONAL_CACHE_ENABLED, Boolean.toString(enabled));
PropsUtil.setProps(testProps);
}
private static final String _KEY_1 = "KEY_1";
private static final String _KEY_2 = "KEY_2";
private static final String _PORTAL_CACHE_NAME = "PORTAL_CACHE_NAME";
private static final String _VALUE_1 = "VALUE_1";
private static final String _VALUE_2 = "VALUE_2";
private PortalCache<String, String> _portalCache;
private TestPortalCacheListener<String, String> _testCacheListener;
private TestPortalCacheReplicator<String, String> _testCacheReplicator;
private TransactionalPortalCache<String, String> _transactionalPortalCache;
private static class TestProps implements Props {
@Override
public boolean contains(String key) {
return _properties.containsKey(key);
}
@Override
public String get(String key) {
return _properties.get(key);
}
@Override
public String get(String key, Filter filter) {
throw new UnsupportedOperationException();
}
@Override
public String[] getArray(String key) {
throw new UnsupportedOperationException();
}
@Override
public String[] getArray(String key, Filter filter) {
throw new UnsupportedOperationException();
}
@Override
public Properties getProperties() {
throw new UnsupportedOperationException();
}
@Override
public Properties getProperties(String prefix, boolean removePrefix) {
throw new UnsupportedOperationException();
}
public void setProperty(String key, String value) {
_properties.put(key, value);
}
private final Map<String, String> _properties = new HashMap<>();
}
private static class TestTrasactionStatus implements TransactionStatus {
@Override
public boolean isCompleted() {
return _completed;
}
@Override
public boolean isNewTransaction() {
return _newTransaction;
}
@Override
public boolean isRollbackOnly() {
return _rollbackOnly;
}
private TestTrasactionStatus(
boolean newTransaction, boolean rollbackOnly, boolean completed) {
_newTransaction = newTransaction;
_rollbackOnly = rollbackOnly;
_completed = completed;
}
private final boolean _completed;
private final boolean _newTransaction;
private final boolean _rollbackOnly;
}
}