/** * 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.ehcache.internal; import com.liferay.portal.cache.test.util.TestPortalCacheListener; import com.liferay.portal.cache.test.util.TestPortalCacheManager; import com.liferay.portal.cache.test.util.TestPortalCacheReplicator; import com.liferay.portal.kernel.cache.PortalCacheHelperUtil; import com.liferay.portal.kernel.cache.PortalCacheListener; import com.liferay.portal.kernel.cache.PortalCacheListenerScope; import com.liferay.portal.kernel.cache.PortalCacheManager; import com.liferay.portal.kernel.test.rule.CodeCoverageAssertor; import java.util.List; import java.util.Map; import java.util.Set; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Ehcache; import net.sf.ehcache.Element; import net.sf.ehcache.config.CacheConfiguration; import net.sf.ehcache.config.Configuration; import net.sf.ehcache.event.CacheEventListener; import net.sf.ehcache.event.RegisteredEventListeners; import org.junit.After; import org.junit.AfterClass; 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 EhcachePortalCacheTest { @ClassRule public static final CodeCoverageAssertor codeCoverageAssertor = CodeCoverageAssertor.INSTANCE; @BeforeClass public static void setUpClass() { Configuration configuration = new Configuration(); CacheConfiguration cacheConfiguration = new CacheConfiguration(); cacheConfiguration.setMaxEntriesLocalHeap(100); configuration.addDefaultCache(cacheConfiguration); _cacheManager = CacheManager.newInstance(configuration); } @AfterClass public static void tearDownClass() { _cacheManager.shutdown(); } @Before public void setUp() { _cacheManager.addCache(_PORTAL_CACHE_NAME); _ehcache = _cacheManager.getCache(_PORTAL_CACHE_NAME); PortalCacheManager<String, String> portalCacheManager = TestPortalCacheManager.createTestPortalCacheManager( _PORTAL_CACHE_NAME); _ehcachePortalCache = new EhcachePortalCache<>( portalCacheManager, _ehcache); _ehcachePortalCache.put(_KEY_1, _VALUE_1); _defaultPortalCacheListener = new TestPortalCacheListener<>(); _ehcachePortalCache.registerPortalCacheListener( _defaultPortalCacheListener); _defaultPortalCacheReplicator = new TestPortalCacheReplicator<>(); _ehcachePortalCache.registerPortalCacheListener( _defaultPortalCacheReplicator); } @After public void tearDown() { _cacheManager.removeAllCaches(); } @Test public void testCacheListener() { // Register 1 TestPortalCacheListener<String, String> localPortalCacheListener = new TestPortalCacheListener<>(); _ehcachePortalCache.registerPortalCacheListener( localPortalCacheListener, PortalCacheListenerScope.LOCAL); _ehcachePortalCache.put(_KEY_2, _VALUE_2); localPortalCacheListener.assertActionsCount(1); localPortalCacheListener.assertPut(_KEY_2, _VALUE_2); localPortalCacheListener.reset(); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertPut(_KEY_2, _VALUE_2); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(1); _defaultPortalCacheReplicator.assertPut(_KEY_2, _VALUE_2); _defaultPortalCacheReplicator.reset(); // Register 2 TestPortalCacheListener<String, String> remotePortalCacheListener = new TestPortalCacheListener<>(); _ehcachePortalCache.registerPortalCacheListener( remotePortalCacheListener, PortalCacheListenerScope.REMOTE); _ehcachePortalCache.put(_KEY_2, _VALUE_1); localPortalCacheListener.assertActionsCount(1); localPortalCacheListener.assertUpdated(_KEY_2, _VALUE_1); localPortalCacheListener.reset(); remotePortalCacheListener.assertActionsCount(0); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertUpdated(_KEY_2, _VALUE_1); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(1); _defaultPortalCacheReplicator.assertUpdated(_KEY_2, _VALUE_1); _defaultPortalCacheReplicator.reset(); // Register 3 _ehcachePortalCache.registerPortalCacheListener( remotePortalCacheListener, PortalCacheListenerScope.ALL); _ehcachePortalCache.put(_KEY_2, _VALUE_2); localPortalCacheListener.assertActionsCount(1); localPortalCacheListener.assertUpdated(_KEY_2, _VALUE_2); localPortalCacheListener.reset(); remotePortalCacheListener.assertActionsCount(0); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertUpdated(_KEY_2, _VALUE_2); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(1); _defaultPortalCacheReplicator.assertUpdated(_KEY_2, _VALUE_2); _defaultPortalCacheReplicator.reset(); // Unregister 1 _ehcachePortalCache.unregisterPortalCacheListener( localPortalCacheListener); _ehcachePortalCache.put(_KEY_1, _VALUE_2); localPortalCacheListener.assertActionsCount(0); remotePortalCacheListener.assertActionsCount(0); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertUpdated(_KEY_1, _VALUE_2); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(1); _defaultPortalCacheReplicator.assertUpdated(_KEY_1, _VALUE_2); _defaultPortalCacheReplicator.reset(); // Unregister 2 _ehcachePortalCache.unregisterPortalCacheListener( new TestPortalCacheListener<String, String>()); _ehcachePortalCache.put(_KEY_1, _VALUE_1); localPortalCacheListener.assertActionsCount(0); remotePortalCacheListener.assertActionsCount(0); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertUpdated(_KEY_1, _VALUE_1); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(1); _defaultPortalCacheReplicator.assertUpdated(_KEY_1, _VALUE_1); _defaultPortalCacheReplicator.reset(); // Unregister 3 _ehcachePortalCache.unregisterPortalCacheListeners(); _ehcachePortalCache.put(_KEY_1, _VALUE_2); localPortalCacheListener.assertActionsCount(0); remotePortalCacheListener.assertActionsCount(0); _defaultPortalCacheListener.assertActionsCount(0); _defaultPortalCacheReplicator.assertActionsCount(0); } @Test public void testGetEhcache() { Assert.assertSame(_ehcache, _ehcachePortalCache.getEhcache()); } @Test public void testGetKeys() { Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); List<String> keys = _ehcachePortalCache.getKeys(); Assert.assertEquals(keys.toString(), 1, keys.size()); Assert.assertTrue(keys.contains(_KEY_1)); } @Test public void testGetName() { Assert.assertEquals( _PORTAL_CACHE_NAME, _ehcachePortalCache.getPortalCacheName()); } @Test public void testPut() { Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); // Put 1 _ehcachePortalCache.put(_KEY_2, _VALUE_2); Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_1)); Assert.assertEquals(_VALUE_2, _ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertPut(_KEY_2, _VALUE_2); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(1); _defaultPortalCacheReplicator.assertPut(_KEY_2, _VALUE_2); _defaultPortalCacheReplicator.reset(); // Put 2 _ehcachePortalCache.put(_KEY_1, _VALUE_2); Assert.assertEquals(_VALUE_2, _ehcachePortalCache.get(_KEY_1)); Assert.assertEquals(_VALUE_2, _ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertUpdated(_KEY_1, _VALUE_2); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(1); _defaultPortalCacheReplicator.assertUpdated(_KEY_1, _VALUE_2); _defaultPortalCacheReplicator.reset(); // Put 3 PortalCacheHelperUtil.putWithoutReplicator( _ehcachePortalCache, _KEY_2, _VALUE_1); Assert.assertEquals(_VALUE_2, _ehcachePortalCache.get(_KEY_1)); Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertUpdated(_KEY_2, _VALUE_1); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(0); // Put 4 Assert.assertEquals( _VALUE_1, _ehcachePortalCache.putIfAbsent(_KEY_2, _VALUE_2)); Assert.assertEquals(_VALUE_2, _ehcachePortalCache.get(_KEY_1)); Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(0); _defaultPortalCacheReplicator.assertActionsCount(0); // Put 5 _ehcachePortalCache.remove(_KEY_1); Assert.assertNull(_ehcachePortalCache.putIfAbsent(_KEY_1, _VALUE_1)); Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_1)); Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(2); _defaultPortalCacheListener.assertRemoved(_KEY_1, _VALUE_2); _defaultPortalCacheListener.assertPut(_KEY_1, _VALUE_1); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(2); _defaultPortalCacheReplicator.assertRemoved(_KEY_1, _VALUE_2); _defaultPortalCacheReplicator.assertPut(_KEY_1, _VALUE_1); _defaultPortalCacheReplicator.reset(); } @Test public void testReconfigEhcache() { Assert.assertSame(_ehcache, _ehcachePortalCache.ehcache); Map<PortalCacheListener<String, String>, PortalCacheListenerScope> oldPortalCacheListeners = _ehcachePortalCache.getPortalCacheListeners(); _cacheManager.addCache(_NEW_PORTAL_CACHE_NAME); Ehcache ehcache2 = _cacheManager.getCache(_NEW_PORTAL_CACHE_NAME); _ehcachePortalCache.reconfigEhcache(ehcache2); Assert.assertSame(ehcache2, _ehcachePortalCache.ehcache); Assert.assertEquals( oldPortalCacheListeners, _ehcachePortalCache.getPortalCacheListeners()); RegisteredEventListeners registeredEventListeners = _ehcache.getCacheEventNotificationService(); Set<CacheEventListener> cacheEventListeners = registeredEventListeners.getCacheEventListeners(); Assert.assertTrue(cacheEventListeners.isEmpty()); registeredEventListeners = ehcache2.getCacheEventNotificationService(); cacheEventListeners = registeredEventListeners.getCacheEventListeners(); Assert.assertFalse(cacheEventListeners.isEmpty()); } @Test public void testRemove() { Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); // Remove 1 Assert.assertTrue(_ehcachePortalCache.remove(_KEY_1, _VALUE_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertRemoved(_KEY_1, _VALUE_1); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(1); _defaultPortalCacheReplicator.assertRemoved(_KEY_1, _VALUE_1); _defaultPortalCacheReplicator.reset(); // Remove 2 _ehcachePortalCache.put(_KEY_1, _VALUE_1); _ehcachePortalCache.put(_KEY_2, _VALUE_2); _ehcachePortalCache.remove(_KEY_2); Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(3); _defaultPortalCacheListener.assertPut(_KEY_1, _VALUE_1); _defaultPortalCacheListener.assertPut(_KEY_2, _VALUE_2); _defaultPortalCacheListener.assertRemoved(_KEY_2, _VALUE_2); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(3); _defaultPortalCacheReplicator.assertPut(_KEY_1, _VALUE_1); _defaultPortalCacheReplicator.assertPut(_KEY_2, _VALUE_2); _defaultPortalCacheReplicator.assertRemoved(_KEY_2, _VALUE_2); _defaultPortalCacheReplicator.reset(); // Remove 3 PortalCacheHelperUtil.removeWithoutReplicator( _ehcachePortalCache, _KEY_1); Assert.assertNull(_ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertRemoved(_KEY_1, _VALUE_1); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(0); // Remove 4 _ehcachePortalCache.put(_KEY_1, _VALUE_1); _ehcachePortalCache.put(_KEY_2, _VALUE_2); _ehcachePortalCache.removeAll(); Assert.assertNull(_ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(3); _defaultPortalCacheListener.assertPut(_KEY_1, _VALUE_1); _defaultPortalCacheListener.assertPut(_KEY_2, _VALUE_2); _defaultPortalCacheListener.assertRemoveAll(); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(3); _defaultPortalCacheReplicator.assertPut(_KEY_1, _VALUE_1); _defaultPortalCacheReplicator.assertPut(_KEY_2, _VALUE_2); _defaultPortalCacheReplicator.assertRemoveAll(); _defaultPortalCacheReplicator.reset(); // Remove 5 _ehcachePortalCache.put(_KEY_1, _VALUE_1); _ehcachePortalCache.put(_KEY_2, _VALUE_2); PortalCacheHelperUtil.removeAllWithoutReplicator(_ehcachePortalCache); Assert.assertNull(_ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(3); _defaultPortalCacheListener.assertPut(_KEY_1, _VALUE_1); _defaultPortalCacheListener.assertPut(_KEY_2, _VALUE_2); _defaultPortalCacheListener.assertRemoveAll(); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(2); _defaultPortalCacheReplicator.assertPut(_KEY_1, _VALUE_1); _defaultPortalCacheReplicator.assertPut(_KEY_2, _VALUE_2); _defaultPortalCacheReplicator.reset(); } @Test public void testReplace() { Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); // Replace 1 Assert.assertEquals( _VALUE_1, _ehcachePortalCache.replace(_KEY_1, _VALUE_2)); Assert.assertEquals(_VALUE_2, _ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertUpdated(_KEY_1, _VALUE_2); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(1); _defaultPortalCacheReplicator.assertUpdated(_KEY_1, _VALUE_2); _defaultPortalCacheReplicator.reset(); // Replace 2 Assert.assertNull(_ehcachePortalCache.replace(_KEY_2, _VALUE_2)); Assert.assertEquals(_VALUE_2, _ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(0); _defaultPortalCacheReplicator.assertActionsCount(0); // Replace 3 Assert.assertTrue( _ehcachePortalCache.replace(_KEY_1, _VALUE_2, _VALUE_1)); Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(1); _defaultPortalCacheListener.assertUpdated(_KEY_1, _VALUE_1); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertActionsCount(1); _defaultPortalCacheReplicator.assertUpdated(_KEY_1, _VALUE_1); _defaultPortalCacheReplicator.reset(); // Replace 4 Assert.assertFalse( _ehcachePortalCache.replace(_KEY_1, _VALUE_2, _VALUE_1)); Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); _defaultPortalCacheListener.assertActionsCount(0); _defaultPortalCacheReplicator.assertActionsCount(0); } @Test public void testTimeToLive() { Assert.assertEquals(_VALUE_1, _ehcachePortalCache.get(_KEY_1)); Assert.assertNull(_ehcachePortalCache.get(_KEY_2)); int timeToLive = 600; Ehcache ehcache = _ehcachePortalCache.ehcache; // Put _ehcachePortalCache.put(_KEY_2, _VALUE_2, timeToLive); Element element = ehcache.get(_KEY_2); Assert.assertEquals(_KEY_2, element.getObjectKey()); Assert.assertEquals(_VALUE_2, element.getObjectValue()); Assert.assertEquals(timeToLive, element.getTimeToLive()); _defaultPortalCacheListener.assertPut(_KEY_2, _VALUE_2, timeToLive); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertPut(_KEY_2, _VALUE_2, timeToLive); _defaultPortalCacheReplicator.reset(); // Put if absent ehcache.removeElement(element); _ehcachePortalCache.putIfAbsent(_KEY_2, _VALUE_2, timeToLive); element = ehcache.get(_KEY_2); Assert.assertEquals(_KEY_2, element.getObjectKey()); Assert.assertEquals(_VALUE_2, element.getObjectValue()); Assert.assertEquals(timeToLive, element.getTimeToLive()); _defaultPortalCacheListener.assertPut(_KEY_2, _VALUE_2, timeToLive); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertPut(_KEY_2, _VALUE_2, timeToLive); _defaultPortalCacheReplicator.reset(); // Replace 1 ehcache.removeElement(element); _ehcachePortalCache.replace(_KEY_1, _VALUE_2, timeToLive); element = ehcache.get(_KEY_1); Assert.assertEquals(_KEY_1, element.getObjectKey()); Assert.assertEquals(_VALUE_2, element.getObjectValue()); Assert.assertEquals(timeToLive, element.getTimeToLive()); _defaultPortalCacheListener.assertUpdated(_KEY_1, _VALUE_2, timeToLive); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertUpdated( _KEY_1, _VALUE_2, timeToLive); _defaultPortalCacheReplicator.reset(); // Replace 2 ehcache.removeElement(element); _ehcachePortalCache.put(_KEY_1, _VALUE_1); _ehcachePortalCache.replace(_KEY_1, _VALUE_1, _VALUE_2, timeToLive); element = ehcache.get(_KEY_1); Assert.assertEquals(_KEY_1, element.getObjectKey()); Assert.assertEquals(_VALUE_2, element.getObjectValue()); Assert.assertEquals(timeToLive, element.getTimeToLive()); _defaultPortalCacheListener.assertPut(_KEY_1, _VALUE_1); _defaultPortalCacheListener.assertUpdated(_KEY_1, _VALUE_2, timeToLive); _defaultPortalCacheListener.reset(); _defaultPortalCacheReplicator.assertPut(_KEY_1, _VALUE_1); _defaultPortalCacheReplicator.assertUpdated( _KEY_1, _VALUE_2, timeToLive); _defaultPortalCacheReplicator.reset(); } private static final String _KEY_1 = "KEY_1"; private static final String _KEY_2 = "KEY_2"; private static final String _KEY_3 = "KEY_3"; private static final String _NEW_PORTAL_CACHE_NAME = "NEW_PORTAL_CACHE_NAME"; private static final String _PORTAL_CACHE_MANAGER_NAME = "PORTAL_CACHE_MANAGER_NAME"; 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 static final String _VALUE_3 = "VALUE_3"; private static CacheManager _cacheManager; private TestPortalCacheListener<String, String> _defaultPortalCacheListener; private TestPortalCacheReplicator<String, String> _defaultPortalCacheReplicator; private Ehcache _ehcache; private EhcachePortalCache<String, String> _ehcachePortalCache; }