KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > google > inject > util > ReferenceMapTest


1 /**
2  * Copyright (C) 2006 Google Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

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 JavaDoc;
26 import java.util.Iterator JavaDoc;
27 import java.util.concurrent.ConcurrentMap JavaDoc;
28
29 /**
30  * Tests for {@link ReferenceMap}.
31  *
32  * @author crazybob@google.com (Bob Lee)
33  * @author mbostock@google.com (Mike Bostock)
34  */

35 @SuppressWarnings JavaDoc({"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 JavaDoc(), new Object JavaDoc());
45     assertCleanup(map, CleanupMode.GC);
46   }
47
48   public void testKeyCleanupWithWeakValue() {
49     ReferenceMap map = new ReferenceMap(STRONG, WEAK);
50     map.put(new Object JavaDoc(), new Object JavaDoc());
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 JavaDoc delegate = map.delegate;
85         Iterator JavaDoc keyIterator = delegate.keySet().iterator();
86         Reference JavaDoc reference = ((Reference JavaDoc) keyIterator.next());
87         reference.enqueue();
88         break;
89       }
90       case ENQUEUE_VALUE: {
91         ConcurrentMap JavaDoc delegate = map.delegate;
92         Iterator JavaDoc valueIterator = delegate.values().iterator();
93         Reference JavaDoc reference = ((Reference JavaDoc) valueIterator.next());
94         reference.enqueue();
95         break;
96       }
97     }
98
99     // wait up to 5s
100
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 JavaDoc e) { /* ignore */ }
110     }
111     fail();
112   }
113 }
114
Popular Tags