/* * Copyright (C) 2003-2011 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.services.portletcache; import java.util.HashMap; import java.util.Locale; import javax.portlet.PortletMode; import javax.portlet.WindowState; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.test.BasicTestCase; /** * Created by The eXo Platform SAS Author : eXoPlatform * henri.gomez@exoplatform.com Jan 19, 2011 */ public class TestPortletFutureCache extends BasicTestCase { private static final Log LOG = ExoLogger.getLogger(TestPortletFutureCache.class.getName()); /** The Portlet Future Cache */ private PortletFutureCache portletFutureCache; private WindowKey windowKey1; private MarkupFragment fragment1; private WindowKey windowKey2; private MarkupFragment fragment2; private WindowKey windowKey3; private MarkupFragment fragment3; /* * (non-Javadoc) * * @see org.exoplatform.services.wcm.core.BaseWCMTestCase#setUp() */ public void setUp() throws Exception { super.setUp(); } private void injectContents(long content1Duration, long content2Duration, long content3Duration) { windowKey1 = new WindowKey("wid1", WindowState.NORMAL, PortletMode.VIEW, Locale.FRENCH, new HashMap<String, String[]>(), new HashMap<String, String[]>()); fragment1 = new MarkupFragment(System.currentTimeMillis() + content1Duration, new byte[10]); // New // Fragment, // to // be // kept // FRAGMENT_DURATION portletFutureCache.put(windowKey1, fragment1); if (content2Duration != -1) { windowKey2 = new WindowKey("wid2", WindowState.NORMAL, PortletMode.VIEW, Locale.FRENCH, new HashMap<String, String[]>(), new HashMap<String, String[]>()); fragment2 = new MarkupFragment(System.currentTimeMillis() + content2Duration, new byte[10]); // New // Fragment, // to // be // kept // FRAGMENT_DURATION portletFutureCache.put(windowKey2, fragment2); } if (content3Duration != -1) { windowKey3 = new WindowKey("wid3", WindowState.NORMAL, PortletMode.VIEW, Locale.FRENCH, new HashMap<String, String[]>(), new HashMap<String, String[]>()); fragment3 = new MarkupFragment(System.currentTimeMillis() + content3Duration, new byte[10]); // New // Fragment, // to // be // kept // FRAGMENT_DURATION portletFutureCache.put(windowKey3, fragment3); } } /** * Test Cache with size limits * * @throws Exception * the exception */ public void testCacheFixedSize() throws Exception { MarkupFragment nfragment; portletFutureCache = new PortletFutureCache(LOG, 1, 2); portletFutureCache.start(); // 900ms, 1100ms, 2100ms retentions for objects injectContents(900, 1100, 2100); // CacheSize should be 2 assertEquals(2, portletFutureCache.getCacheSize()); // Should get back fragment1 nfragment = portletFutureCache.get(windowKey1); assertSame(fragment1, nfragment); // Should get back fragment2 nfragment = portletFutureCache.get(windowKey2); assertSame(fragment2, nfragment); // Should get back fragment3 nfragment = portletFutureCache.get(windowKey3); assertNull(nfragment); portletFutureCache.stop(); } /** * Test Cache when cleaned * * @throws Exception * the exception */ public void testCacheCleared() throws Exception { MarkupFragment nfragment; portletFutureCache = new PortletFutureCache(LOG, 1); portletFutureCache.start(); // 900ms, 1100ms, 2100ms retentions for objects injectContents(900, 1100, 2100); // CacheSize should be 3 assertEquals(3, portletFutureCache.getCacheSize()); // Should get back fragment1 nfragment = portletFutureCache.get(windowKey1); assertSame(fragment1, nfragment); // Should get back fragment2 nfragment = portletFutureCache.get(windowKey2); assertSame(fragment2, nfragment); // Should get back fragment3 nfragment = portletFutureCache.get(windowKey3); assertSame(fragment3, nfragment); portletFutureCache.clearCache(); // CacheSize should be 0 assertEquals(0, portletFutureCache.getCacheSize()); // Should not get back fragment1 nfragment = portletFutureCache.get(windowKey1); assertNull( nfragment); // Should not get back fragment2 nfragment = portletFutureCache.get(windowKey2); assertNull(nfragment); // Should not get back fragment3 nfragment = portletFutureCache.get(windowKey3); assertNull(nfragment); portletFutureCache.stop(); } /** * Test Cache Evictions during time * * @throws Exception * the exception */ public void testCacheEvictions() throws Exception { MarkupFragment nfragment; int cacheSize; portletFutureCache = new PortletFutureCache(LOG, 1); portletFutureCache.start(); // 750ms, 1250ms, 2500ms retentions for objects injectContents(750, 1250, 2500); // CacheSize should be 3 assertEquals(3, portletFutureCache.getCacheSize()); // Should get back fragment1 nfragment = portletFutureCache.get(windowKey1); assertSame(fragment1, nfragment); // Should get back fragment2 nfragment = portletFutureCache.get(windowKey2); assertSame(fragment2, nfragment); // Should get back fragment3 nfragment = portletFutureCache.get(windowKey3); assertSame(fragment3, nfragment); // CacheSize should be 3 assertEquals(3, portletFutureCache.getCacheSize()); Thread.sleep(1050); // Sleep 1050ms -> time for first cleanup pass // CacheSize should be 2 (2100 + 1100) cacheSize = portletFutureCache.getCacheSize(); System.out.println("After first eviction pass, cacheSize=" + cacheSize); assertEquals(2, cacheSize); // fragment1 shouldn't exist anymore nfragment = portletFutureCache.get(windowKey1); assertNull( nfragment); // Should get back fragment2 nfragment = portletFutureCache.get(windowKey2); assertSame(fragment2, nfragment); // Should get back fragment3 nfragment = portletFutureCache.get(windowKey3); assertSame(fragment3, nfragment); // CacheSize should be 2 (2100 + 1100) cacheSize = portletFutureCache.getCacheSize(); System.out.println("After first eviction pass and gets, cacheSize=" + cacheSize); assertEquals(2, cacheSize); Thread.sleep(1050); // Sleep 1050ms -> time for second cleanup pass // CacheSize should be 1 (2100) cacheSize = portletFutureCache.getCacheSize(); System.out.println("After second eviction pass, cacheSize=" + cacheSize); assertEquals(1, cacheSize); // fragment1 shouldn't exist anymore nfragment = portletFutureCache.get(windowKey1); assertNull( nfragment); // fragment2 shouldn't exist anymore nfragment = portletFutureCache.get(windowKey2); assertNull(nfragment); // Should get back fragment3 nfragment = portletFutureCache.get(windowKey3); assertSame(fragment3, nfragment); // CacheSize should be 1 (2100) cacheSize = portletFutureCache.getCacheSize(); System.out.println("After second eviction pass and gets, cacheSize=" + cacheSize); assertEquals(1, cacheSize); Thread.sleep(1050); // Sleep 1050ms -> time for third cleanup pass // CacheSize should be 0, no more entries in cache cacheSize = portletFutureCache.getCacheSize(); System.out.println("After third eviction pass, cacheSize=" + cacheSize); assertEquals(0, cacheSize); portletFutureCache.stop(); } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ public void tearDown() throws Exception { super.tearDown(); } }