| 1 32 package net.sf.retrotranslator.runtime.impl; 33 34 import java.util.*; 35 import java.util.concurrent.*; 36 import junit.framework.TestCase; 37 38 41 public class WeakIdentityTableTestCase extends TestCase { 42 43 private static class StringWeakIdentityTable extends WeakIdentityTable<String , String > { 44 protected String initialValue() { 45 return new String (); 46 } 47 } 48 49 public void testSequential() throws Exception { 50 StringWeakIdentityTable table = new StringWeakIdentityTable(); 51 String k1 = new String ("k"); 52 assertNull(table.lookup(k1)); 53 assertEquals(0, table.size()); 54 String v1 = table.obtain(k1); 55 assertNotNull(v1); 56 assertEquals(1, table.size()); 57 assertSame(v1, table.lookup(k1)); 58 assertSame(v1, table.obtain(k1)); 59 assertEquals(1, table.size()); 60 String v1x = ""; 61 table.putIfAbsent(k1, v1x); 62 assertEquals(1, table.size()); 63 assertSame(v1, table.lookup(k1)); 64 assertNotSame(v1, v1x); 65 66 String k2 = new String ("k"); 67 assertNull(table.lookup(k2)); 68 assertEquals(1, table.size()); 69 String v2 = ""; 70 table.putIfAbsent(k2, v2); 71 assertEquals(2, table.size()); 72 assertSame(v2, table.lookup(k2)); 73 assertSame(v2, table.obtain(k2)); 74 assertEquals(2, table.size()); 75 76 System.gc(); 77 assertSame(v1, table.lookup(k1)); 78 assertSame(v2, table.lookup(k2)); 79 assertNotSame(v1, v2); 80 k1 = null; 81 gc(table, 1); 82 assertEquals(1, table.size()); 83 assertSame(v2, table.lookup(k2)); 84 k2 = null; 85 gc(table, 0); 86 assertEquals(0, table.size()); 87 } 88 89 public void testParallel() throws Exception { 90 final StringWeakIdentityTable table = new StringWeakIdentityTable(); 91 ExecutorService service = Executors.newCachedThreadPool(); 92 List<Future> list = new ArrayList<Future>(); 93 final int iterations = 1000; 94 final CyclicBarrier barrier = new CyclicBarrier(20); 95 for (int i = 0; i < barrier.getParties(); i++) { 96 list.add(service.submit(new Callable() { 97 public Object call() throws Exception { 98 barrier.await(); 99 for (int j = 0; j < iterations; j++) { 100 String k = new String ("k"); 101 assertNull(table.lookup(k)); 102 String v = table.obtain(k); 103 assertNotNull(v); 104 table.putIfAbsent(k, new String ("x")); 105 assertSame(v, table.lookup(k)); 106 assertSame(v, table.obtain(k)); 107 String k2 = new String ("k2"); 108 String v2 = "v2"; 109 table.putIfAbsent(k2, v2); 110 assertSame(v2, table.lookup(k2)); 111 } 112 return null; 113 } 114 })); 115 } 116 for (Future future : list) { 117 future.get(); 118 } 119 gc(table, 0); 120 int size = table.size(); 121 assertTrue("Table must be empty but contains " + size + " entries.", size < 10); 122 } 123 124 private void gc(WeakIdentityTable table, int size) throws InterruptedException { 125 for (int i = 0; table.size() > size && i < 10; i++) { 126 System.gc(); 127 Thread.sleep(100); 128 } 129 } 130 131 } | Popular Tags |