/** * */ package net.objectlab.kit.collections; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; /** * @author Benoit Xhenseval * */ public class ReadOnlyExpiringHashMapTest implements MapLoader<String, Integer>, TimeProvider { private int reloadCount; private long time; @Before public void reset() { reloadCount = 0; time = System.currentTimeMillis(); } @Test public void basicConstructorNoReload() { final ReadOnlyExpiringHashMapBuilder<String, Integer> builder = new ReadOnlyExpiringHashMapBuilder<>(this); builder.expiryTimeoutMilliseconds(1000); builder.loadOnFirstAccess(true); builder.reloadOnExpiry(false); builder.reloadWhenExpired(false); builder.timeProvider(this); builder.id("Greetings"); final ReadOnlyExpiringMap<String, Integer> ims = new ReadOnlyExpiringHashMap<>(builder); assertEquals("Should not call load until called", 0, reloadCount); assertFalse(ims.isEmpty()); assertEquals(2, ims.size()); assertEquals(1, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertTrue("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertEquals(Integer.valueOf(2), ims.get("Yo")); time += 101; // simulate 101 ms // second call assertFalse(ims.isEmpty()); assertEquals(2, ims.size()); assertEquals(1, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertTrue("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertEquals(Integer.valueOf(2), ims.get("Yo")); time += 901; // simulate 901 ms // should be gone assertTrue(ims.isEmpty()); assertEquals(0, ims.size()); assertEquals(1, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertFalse("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertNull(ims.get("Yo")); } @Test public void basicConstructorWithReloadWhenCalled() { final ReadOnlyExpiringHashMapBuilder<String, Integer> builder = new ReadOnlyExpiringHashMapBuilder<>(this); builder.expiryTimeoutMilliseconds(1000); builder.loadOnFirstAccess(true); builder.reloadOnExpiry(false); builder.reloadWhenExpired(true); builder.timeProvider(this); builder.id("Greetings"); final ReadOnlyExpiringMap<String, Integer> ims = new ReadOnlyExpiringHashMap<>(builder); assertEquals("Should not call load until called", 0, reloadCount); assertFalse(ims.isEmpty()); assertEquals(2, ims.size()); assertEquals(1, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertTrue("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertEquals(Integer.valueOf(2), ims.get("Yo")); time += 101; // simulate 101 ms // second call assertFalse(ims.isEmpty()); assertEquals(2, ims.size()); assertEquals(1, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertTrue("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertEquals(Integer.valueOf(2), ims.get("Yo")); time += 901; // simulate 901 ms assertEquals("2) Should not call load until called", 1, reloadCount); // should be gone assertFalse(ims.isEmpty()); assertEquals(2, ims.size()); assertEquals(2, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertTrue("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertEquals(Integer.valueOf(2), ims.get("Yo")); } @Test public void basicConstructorWithImmediateLoadAndWhenExpired() { final ReadOnlyExpiringHashMapBuilder<String, Integer> builder = new ReadOnlyExpiringHashMapBuilder<>(this); builder.expiryTimeoutMilliseconds(1000); builder.loadOnFirstAccess(false); builder.reloadOnExpiry(false); builder.reloadWhenExpired(true); builder.timeProvider(this); builder.id("Greetings"); final ReadOnlyExpiringMap<String, Integer> ims = new ReadOnlyExpiringHashMap<>(builder); assertEquals("Should not call load until called", 1, reloadCount); assertFalse(ims.isEmpty()); assertEquals(2, ims.size()); assertEquals(1, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertTrue("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertEquals(Integer.valueOf(2), ims.get("Yo")); time += 101; // simulate 101 ms // second call assertFalse(ims.isEmpty()); assertEquals(2, ims.size()); assertEquals(1, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertTrue("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertEquals(Integer.valueOf(2), ims.get("Yo")); time += 901; // simulate 901 ms assertEquals("2) Should not call load until called", 1, reloadCount); // should be gone assertFalse(ims.isEmpty()); assertEquals(2, ims.size()); assertEquals(2, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertTrue("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertEquals(Integer.valueOf(2), ims.get("Yo")); } @Test public void basicConstructorWithReloadOnExpiry() { final ReadOnlyExpiringHashMapBuilder<String, Integer> builder = new ReadOnlyExpiringHashMapBuilder<>(this); builder.expiryTimeoutMilliseconds(1000); builder.loadOnFirstAccess(false); builder.reloadOnExpiry(true); builder.reloadWhenExpired(false); builder.timeProvider(this); builder.id("Greetings"); final ReadOnlyExpiringMap<String, Integer> ims = new ReadOnlyExpiringHashMap<>(builder); assertEquals("Should not call load until called", 1, reloadCount); assertFalse(ims.isEmpty()); assertEquals(2, ims.size()); assertEquals(1, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertTrue("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertEquals(Integer.valueOf(2), ims.get("Yo")); time += 101; // simulate 101 ms // second call assertFalse(ims.isEmpty()); assertEquals(2, ims.size()); assertEquals(1, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertTrue("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertEquals(Integer.valueOf(2), ims.get("Yo")); time += 901; // simulate 901 ms try { Thread.sleep(2001); } catch (final InterruptedException e) { } assertEquals("2) Should not call load until called", 2, reloadCount); // should be gone assertFalse(ims.isEmpty()); assertEquals(2, ims.size()); assertEquals(2, reloadCount); assertFalse("diff key", ims.containsKey("Hi")); assertTrue("Correct key", ims.containsKey("Hello")); assertNull("diff key", ims.get("Hi")); assertEquals(Integer.valueOf(2), ims.get("Yo")); } @Override public void load(final MapBuilder<String, Integer> builder) { assertEquals("Greetings", builder.getId()); builder.put("Hello", 1); builder.put("Yo", 2); reloadCount++; } @Override public long getCurrentTimeMillis() { return time; } }