/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.framework.cache.standard;
import java.util.Set;
import junit.framework.TestCase;
public class StandardCacheTest
extends TestCase
{
private StandardCache cache;
public void testGetMaxSize()
{
cache = new StandardCache( 3 );
cache.put( createCacheEntry( "A", "1", Long.MAX_VALUE ) );
assertEquals( 3, cache.getMaxEntries() );
}
public void testMaxSizeEnsured()
{
cache = new StandardCache( 3 );
cache.put( createCacheEntry( "A", "1", Long.MAX_VALUE ) );
cache.put( createCacheEntry( "B", "2", Long.MAX_VALUE ) );
cache.put( createCacheEntry( "C", "3", Long.MAX_VALUE ) );
assertEquals( 3, cache.numberOfEntries() );
cache.put( createCacheEntry( "D", "4", Long.MAX_VALUE ) );
assertEquals( 3, cache.numberOfEntries() );
}
public void testEvictionWhenMaxSizeIsReached()
{
cache = new StandardCache( 3 );
cache.put( createCacheEntry( "A", "1", Long.MAX_VALUE ) );
cache.put( createCacheEntry( "B", "2", Long.MAX_VALUE ) );
cache.put( createCacheEntry( "C", "3", Long.MAX_VALUE ) );
assertEquals( 3, cache.numberOfEntries() );
cache.put( createCacheEntry( "D", "4", Long.MAX_VALUE ) );
Set<String> set = cache.getKeys();
assertEquals( 3, set.size() );
assertTrue( set.contains( "C" ) );
assertTrue( set.contains( "B" ) );
assertTrue( set.contains( "D" ) );
assertEquals( 3, cache.numberOfEntries() );
//make sure B stays in cache, before adding yet another one.
//B should now be 'last used'
// SRS - new concurrentlinkedhashmap is not strictly LRU
// does not reorder before 64 operations
for ( int i = 0; i < 70; i++ )
{
cache.get( "B" );
}
cache.put( createCacheEntry( "E", "4", Long.MAX_VALUE ) );
assertEquals( 3, cache.numberOfEntries() );
set = cache.getKeys();
assertEquals( 3, set.size() );
assertTrue( set.contains( "B" ) );
assertTrue( set.contains( "D" ) );
assertTrue( set.contains( "E" ) );
}
// /**
// * Tests that entry order is updated when element is accessed. A read entry is expected to be me moved to the end
// * of the "list".
// */
// public void testAccessOrder()
// {
// cache = new StandardCache(3);
// cache.put(createCacheEntry("A", "1", Long.MAX_VALUE));
// cache.put(createCacheEntry("B", "2", Long.MAX_VALUE));
// cache.put(createCacheEntry("C", "3", Long.MAX_VALUE));
// assertEquals(3, cache.numberOfEntries());
//
// // make entry with key A move to the last position of cache
// cache.get("A");
//
// // add new cache entry
// cache.put(createCacheEntry("D", "4", Long.MAX_VALUE));
//
// // B should not longer be in cache at this time
// assertNull(cache.get("B"));
//
// // verify order
// Iterator<String> it = cache.getKeys().iterator();
// assertEquals("C", it.next());
// assertEquals("A", it.next());
// assertEquals("D", it.next());
// // verify size
// assertEquals(3, cache.numberOfEntries());
// }
public void testRemoveAll()
{
cache = new StandardCache( 100 );
cache.put( createCacheEntry( "A", "1", Long.MAX_VALUE ) );
cache.put( createCacheEntry( "B", "2", Long.MAX_VALUE ) );
cache.put( createCacheEntry( "C", "3", Long.MAX_VALUE ) );
assertEquals( 3, cache.numberOfEntries() );
cache.removeAll();
assertEquals( 0, cache.numberOfEntries() );
}
public void testRemove()
{
cache = new StandardCache( 100 );
cache.put( createCacheEntry( "A", "1", Long.MAX_VALUE ) );
cache.put( createCacheEntry( "B", "2", Long.MAX_VALUE ) );
cache.put( createCacheEntry( "C", "3", Long.MAX_VALUE ) );
assertEquals( 3, cache.numberOfEntries() );
cache.remove( "B" );
assertEquals( 2, cache.numberOfEntries() );
}
public void testRemoveGroup()
{
cache = new StandardCache( 100 );
cache.put( createCacheEntry( "group1:A", "1", Long.MAX_VALUE ) );
cache.put( createCacheEntry( "group1:B", "2", Long.MAX_VALUE ) );
cache.put( createCacheEntry( "group2:A", "101", Long.MAX_VALUE ) );
cache.put( createCacheEntry( "group2:B", "201", Long.MAX_VALUE ) );
assertEquals( 4, cache.numberOfEntries() );
cache.removeGroup( "group2" );
assertEquals( 2, cache.numberOfEntries() );
}
public void testTimeToLive()
{
cache = new StandardCache( 100 );
cache.put( createCacheEntry( "group1:A", "1", 200 ) );
try
{
Thread.sleep( 250 );
}
catch ( InterruptedException e )
{
fail( "Exception while running test: " + e.getMessage() );
}
assertNull( "Expected no cache entry", cache.get( "group1:A" ) );
}
@SuppressWarnings({"unchecked"})
private CacheEntry createCacheEntry( String key, Object value, long timeToLive )
{
return new CacheEntry( key, value, timeToLive );
}
}