1 16 17 package com.google.inject.util; 18 19 import static com.google.inject.util.ReferenceType.SOFT; 20 import static com.google.inject.util.ReferenceType.STRONG; 21 import static com.google.inject.util.ReferenceType.WEAK; 22 23 import junit.framework.TestCase; 24 25 import java.lang.ref.Reference ; 26 import java.util.Iterator ; 27 import java.util.concurrent.ConcurrentMap ; 28 29 35 @SuppressWarnings ({"unchecked"}) 36 public class ReferenceMapTest extends TestCase { 37 38 private enum CleanupMode { 39 ENQUEUE_KEY, ENQUEUE_VALUE, GC; 40 } 41 42 public void testValueCleanupWithWeakKey() { 43 ReferenceMap map = new ReferenceMap(WEAK, STRONG); 44 map.put(new Object (), new Object ()); 45 assertCleanup(map, CleanupMode.GC); 46 } 47 48 public void testKeyCleanupWithWeakValue() { 49 ReferenceMap map = new ReferenceMap(STRONG, WEAK); 50 map.put(new Object (), new Object ()); 51 assertCleanup(map, CleanupMode.GC); 52 } 53 54 public void testInternedValueCleanupWithWeakKey() { 55 ReferenceMap map = new ReferenceMap(WEAK, STRONG); 56 map.put(5, "foo"); 57 assertCleanup(map, CleanupMode.ENQUEUE_KEY); 58 } 59 60 public void testInternedValueCleanupWithSoftKey() { 61 ReferenceMap map = new ReferenceMap(SOFT, STRONG); 62 map.put(5, "foo"); 63 assertCleanup(map, CleanupMode.ENQUEUE_KEY); 64 } 65 66 public void testInternedKeyCleanupWithWeakValue() { 67 ReferenceMap map = new ReferenceMap(STRONG, WEAK); 68 map.put(5, "foo"); 69 assertCleanup(map, CleanupMode.ENQUEUE_VALUE); 70 } 71 72 public void testInternedKeyCleanupWithSoftValue() { 73 ReferenceMap map = new ReferenceMap(STRONG, SOFT); 74 map.put(5, "foo"); 75 assertCleanup(map, CleanupMode.ENQUEUE_VALUE); 76 } 77 78 private static void assertCleanup(ReferenceMap<?, ?> map, 79 CleanupMode mode) { 80 assertEquals(1, map.delegate.size()); 81 82 switch (mode) { 83 case ENQUEUE_KEY: { 84 ConcurrentMap delegate = map.delegate; 85 Iterator keyIterator = delegate.keySet().iterator(); 86 Reference reference = ((Reference ) keyIterator.next()); 87 reference.enqueue(); 88 break; 89 } 90 case ENQUEUE_VALUE: { 91 ConcurrentMap delegate = map.delegate; 92 Iterator valueIterator = delegate.values().iterator(); 93 Reference reference = ((Reference ) valueIterator.next()); 94 reference.enqueue(); 95 break; 96 } 97 } 98 99 for (int i = 0; i < 500; i++) { 101 if (mode == CleanupMode.GC) { 102 System.gc(); 103 } 104 if (map.size() == 0) { 105 return; 106 } 107 try { 108 Thread.sleep(10); 109 } catch (InterruptedException e) { } 110 } 111 fail(); 112 } 113 } 114 | Popular Tags |