package com.ctriposs.bigmap; import static org.junit.Assert.*; import java.io.File; import java.io.IOException; import org.junit.After; import org.junit.Test; import com.ctriposs.bigmap.utils.FileUtil; public class PurgeTest { private static String testDir = TestUtil.TEST_BASE_DIR + "bigmap/unit/purge_test"; private BigConcurrentHashMapImpl map; @Test public void scheduledPurgeTest() throws IOException, InterruptedException { BigConfig config = new BigConfig().setPurgeIntervalInMs(1000L); map = new BigConcurrentHashMapImpl(testDir, "scheduledPurgeTest", config); // 1 second expiration assertTrue(map.isEmpty()); map.put("1".getBytes(), "A".getBytes(), 500); map.put("2".getBytes(), "B".getBytes(), 600); map.put("3".getBytes(), "C".getBytes(), 1200); map.put("4".getBytes(), "D".getBytes(), 2500); map.put("5".getBytes(), "E".getBytes(), 2500); map.put("6".getBytes(), "F".getBytes()); // no expiration assertFalse(map.isEmpty()); assertEquals(6, map.size()); Thread.sleep(2200); // 1, 2, 3 expired assertTrue(map.purgeCount.get() > 1); assertFalse(map.isEmpty()); assertEquals(3, map.size()); // 4, 5, 6 left assertEquals("E", new String(map.get("5".getBytes()))); // 5 reset last access time Thread.sleep(2000); // 4 expired assertTrue(map.purgeCount.get() > 2); assertFalse(map.isEmpty()); assertEquals(2, map.size()); // 5, 6 left Thread.sleep(2000); // 5 expired assertTrue(map.purgeCount.get() > 3); assertFalse(map.isEmpty()); assertEquals(1, map.size()); // 6 left assertEquals("F", new String(map.get("6".getBytes()))); map.remove("6".getBytes()); assertTrue(map.isEmpty()); assertEquals(0, map.size()); // 6 left for(int i = 0; i < 20000; i++) { map.put(("key" + i).getBytes() , ("value" + i).getBytes(), 500); } Thread.sleep(2000); assertTrue(map.isEmpty()); assertEquals(0, map.size()); // no left } @Test public void purgeTriggerByGetTest() throws IOException, InterruptedException { BigConfig config = new BigConfig().setPurgeIntervalInMs(3000L); map = new BigConcurrentHashMapImpl(testDir, "purgeTriggerByGetTest", config); // 3 second expiration assertTrue(map.isEmpty()); map.put("1".getBytes(), "A".getBytes(), 500); map.put("2".getBytes(), "B".getBytes(), 600); map.put("3".getBytes(), "C".getBytes(), 1200); map.put("4".getBytes(), "D".getBytes(), 2500); map.put("5".getBytes(), "E".getBytes(), 2500); assertFalse(map.isEmpty()); assertEquals(5, map.size()); Thread.sleep(1000); assertNull(map.get("1".getBytes())); // purge trigger by get assertNull(map.get("2".getBytes())); // purge trigger by get assertTrue(map.purgeCount.get() == 0); Thread.sleep(1000); assertNull(map.get("3".getBytes())); // purge trigger by get assertTrue(map.purgeCount.get() == 0); Thread.sleep(1500); // scheduled purge assertTrue(map.purgeCount.get() == 1); assertTrue(map.isEmpty()); assertEquals(0, map.size()); // no left } @Test public void purgeTriggerByRemoveTest() throws IOException, InterruptedException { BigConfig config = new BigConfig().setPurgeIntervalInMs(3000L); map = new BigConcurrentHashMapImpl(testDir, "purgeTriggerByRemoveTest", config); // 3 second expiration assertTrue(map.isEmpty()); map.put("1".getBytes(), "A".getBytes(), 500); map.put("2".getBytes(), "B".getBytes(), 600); map.put("3".getBytes(), "C".getBytes(), 1200); map.put("4".getBytes(), "D".getBytes(), 2500); map.put("5".getBytes(), "E".getBytes(), 2500); assertFalse(map.isEmpty()); assertEquals(5, map.size()); Thread.sleep(1000); assertNull(map.remove("1".getBytes())); // purge trigger by remove assertNull(map.remove("2".getBytes())); // purge trigger by remove assertTrue(map.purgeCount.get() == 0); Thread.sleep(1000); assertNull(map.remove("3".getBytes())); // purge trigger by remove assertNotNull(map.remove("4".getBytes())); // purge trigger by remove assertTrue(map.purgeCount.get() == 0); Thread.sleep(1500); // scheduled purge assertTrue(map.purgeCount.get() == 1); assertTrue(map.isEmpty()); assertEquals(0, map.size()); // no left } @After public void clear() throws IOException { if (map != null) { map.close(); } FileUtil.deleteDirectory(new File(testDir)); } }