KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > retrotranslator > runtime > impl > WeakIdentityTableTestCase


1 /***
2  * Retrotranslator: a Java bytecode transformer that translates Java classes
3  * compiled with JDK 5.0 into classes that can be run on JVM 1.4.
4  *
5  * Copyright (c) 2005 - 2007 Taras Puchko
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in the
15  * documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the copyright holders nor the names of its
17  * contributors may be used to endorse or promote products derived from
18  * this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30  * THE POSSIBILITY OF SUCH DAMAGE.
31  */

32 package net.sf.retrotranslator.runtime.impl;
33
34 import java.util.*;
35 import java.util.concurrent.*;
36 import junit.framework.TestCase;
37
38 /**
39  * @author Taras Puchko
40  */

41 public class WeakIdentityTableTestCase extends TestCase {
42
43     private static class StringWeakIdentityTable extends WeakIdentityTable<String JavaDoc, String JavaDoc> {
44         protected String JavaDoc initialValue() {
45             return new String JavaDoc();
46         }
47     }
48
49     public void testSequential() throws Exception JavaDoc {
50         StringWeakIdentityTable table = new StringWeakIdentityTable();
51         String JavaDoc k1 = new String JavaDoc("k");
52         assertNull(table.lookup(k1));
53         assertEquals(0, table.size());
54         String JavaDoc 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 JavaDoc v1x = "";
61         table.putIfAbsent(k1, v1x);
62         assertEquals(1, table.size());
63         assertSame(v1, table.lookup(k1));
64         assertNotSame(v1, v1x);
65
66         String JavaDoc k2 = new String JavaDoc("k");
67         assertNull(table.lookup(k2));
68         assertEquals(1, table.size());
69         String JavaDoc 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 JavaDoc {
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 JavaDoc call() throws Exception JavaDoc {
98                     barrier.await();
99                     for (int j = 0; j < iterations; j++) {
100                         String JavaDoc k = new String JavaDoc("k");
101                         assertNull(table.lookup(k));
102                         String JavaDoc v = table.obtain(k);
103                         assertNotNull(v);
104                         table.putIfAbsent(k, new String JavaDoc("x"));
105                         assertSame(v, table.lookup(k));
106                         assertSame(v, table.obtain(k));
107                         String JavaDoc k2 = new String JavaDoc("k2");
108                         String JavaDoc 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 JavaDoc {
125         for (int i = 0; table.size() > size && i < 10; i++) {
126             System.gc();
127             Thread.sleep(100);
128         }
129     }
130
131 }
Popular Tags