/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.security.auth; import org.junit.Test; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; public class LRUAuthenticationCacheTest extends BaseAuthenticationCacheTest{ @Test public void testLRUCache() { LRUCache<String, String> cache = new LRUCache<String, String> (3); cache.put("key1","value1"); cache.put("key2","value2"); cache.put("key3","value3"); cache.put("key4","value4"); assertEquals("value2",cache.get("key2")); assertEquals("value3",cache.get("key3")); assertEquals("value4",cache.get("key4")); assertNull(cache.get("key1")); } @Test public void testAuthenticationKey() { AuthenticationCacheKey key11 = new AuthenticationCacheKey("f1","k1"); assertTrue(key11.equals(key11)); assertTrue(key11.hashCode()!=0); AuthenticationCacheKey key12 = new AuthenticationCacheKey("f1","k2"); assertFalse(key11.equals(key12)); assertFalse(key11.hashCode()==key12.hashCode()); AuthenticationCacheKey key21 = new AuthenticationCacheKey("f2","k1"); assertFalse(key11.equals(key21)); assertFalse(key11.hashCode()==key21.hashCode()); AuthenticationCacheKey key22 = new AuthenticationCacheKey("f12","k2"); assertFalse(key11.equals(key22)); assertFalse(key11.hashCode()==key22.hashCode()); } @Test public void testAuthenticationEntry() { UsernamePasswordAuthenticationToken t1 = new UsernamePasswordAuthenticationToken("user1", "password1"); AuthenticationCacheEntry entry1 = new AuthenticationCacheEntry(t1,10,10); assertTrue(entry1.hashCode()!=0); assertEquals(t1.hashCode(),entry1.hashCode()); assertTrue(entry1.equals(entry1)); AuthenticationCacheEntry entry1_1 = new AuthenticationCacheEntry(t1,20,20); assertEquals(t1.hashCode(),entry1_1.hashCode()); assertTrue(entry1.equals(entry1_1)); UsernamePasswordAuthenticationToken t2 = new UsernamePasswordAuthenticationToken("user2", "password2"); AuthenticationCacheEntry entry2 = new AuthenticationCacheEntry(t2,5,10); //assertFalse(entry2.hashCode()==entry1.hashCode()); assertFalse(entry2.equals(entry1)); long currentTime=entry2.getCreated(); // check live time entry2.setLastAccessed(currentTime+6000); assertFalse(entry2.hasExpired(currentTime+10*1000)); assertTrue(entry2.hasExpired(currentTime+10*1000+1)); // check idle time entry2.setLastAccessed(currentTime+2000); assertFalse(entry2.hasExpired(currentTime+7000)); assertTrue(entry2.hasExpired(currentTime+70001)); } protected void fillCache(AuthenticationCache cache) { UsernamePasswordAuthenticationToken t1 = new UsernamePasswordAuthenticationToken("user1", "password1"); UsernamePasswordAuthenticationToken t2 = new UsernamePasswordAuthenticationToken("user2", "password2"); UsernamePasswordAuthenticationToken t3 = new UsernamePasswordAuthenticationToken("user3", "password3"); UsernamePasswordAuthenticationToken t4 = new UsernamePasswordAuthenticationToken("user4", "password4"); cache.put("filtera", "key1",t1); cache.put("filtera", "key2",t2); cache.put("filterb", "key3",t3); cache.put("filterb", "key4",t4); } protected void waitForMilliSecs( long milliSecs) { try { Thread.sleep(milliSecs); } catch (InterruptedException e) { e.printStackTrace(); } } @Test public void testLRUAuthenticationCache() { // test max entries LRUAuthenticationCacheImpl cache = new LRUAuthenticationCacheImpl(5,10,3); fillCache(cache); UsernamePasswordAuthenticationToken token; assertNull(cache.get("filtera","key1")); assertNotNull(token=(UsernamePasswordAuthenticationToken) cache.get("filtera","key2")); assertEquals("user2",token.getPrincipal()); assertNotNull(token=(UsernamePasswordAuthenticationToken)cache.get("filterb","key3")); assertEquals("user3",token.getPrincipal()); assertNotNull(token=(UsernamePasswordAuthenticationToken)cache.get("filterb","key4")); assertEquals("user4",token.getPrincipal()); // test remove all cache = new LRUAuthenticationCacheImpl(5,10,4); fillCache(cache); cache.removeAll(); assertNull(cache.get("filtera","key1")); assertNull(cache.get("filtera","key2")); assertNull(cache.get("filterb","key3")); assertNull(cache.get("filterb","key4")); // test remove filter cache = new LRUAuthenticationCacheImpl(5,10,4); fillCache(cache); cache.removeAll("filtera"); assertNull(cache.get("filtera","key1")); assertNull(cache.get("filtera","key2")); assertNotNull(cache.get("filterb","key3")); assertNotNull(cache.get("filterb","key4")); // test remove one entry cache = new LRUAuthenticationCacheImpl(5,10,4); fillCache(cache); cache.remove("filtera","key1"); assertNull(cache.get("filtera","key1")); assertNotNull(cache.get("filtera","key2")); assertNotNull(cache.get("filterb","key3")); assertNotNull(cache.get("filterb","key4")); // test remove non existing cache = new LRUAuthenticationCacheImpl(5,10,4); fillCache(cache); cache.removeAll("filterz"); cache.remove("filterz","key999"); assertNotNull(cache.get("filtera","key1")); assertNotNull(cache.get("filtera","key2")); assertNotNull(cache.get("filterb","key3")); assertNotNull(cache.get("filterb","key4")); // test default live time cache = new LRUAuthenticationCacheImpl(5,0,4); fillCache(cache); waitForMilliSecs(10); assertNull(cache.get("filtera","key1")); assertNull(cache.get("filtera","key2")); assertNull(cache.get("filterb","key3")); assertNull(cache.get("filterb","key4")); // test default idle time cache = new LRUAuthenticationCacheImpl(0,10,4); fillCache(cache); waitForMilliSecs(10); assertNull(cache.get("filtera","key1")); assertNull(cache.get("filtera","key2")); assertNull(cache.get("filterb","key3")); assertNull(cache.get("filterb","key4")); cache = new LRUAuthenticationCacheImpl(1,10,4); fillCache(cache); waitForMilliSecs(1); assertNotNull(cache.get("filtera","key1")); assertNotNull(cache.get("filtera","key2")); assertNotNull(cache.get("filterb","key3")); assertNotNull(cache.get("filterb","key4")); waitForMilliSecs(1500); assertNull(cache.get("filtera","key1")); assertNull(cache.get("filtera","key2")); assertNull(cache.get("filterb","key3")); assertNull(cache.get("filterb","key4")); } @Override protected AuthenticationCache createAuthenticationCache() { return new LRUAuthenticationCacheImpl(TIME_IDLE, TIME_LIVE, MAX_ENTRIES); } }