You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by je...@apache.org on 2011/03/30 03:23:21 UTC
svn commit: r1086818 -
/harmony/enhanced/java/branches/java6/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/WeakHashMapTest.java
Author: jessewilson
Date: Wed Mar 30 01:23:20 2011
New Revision: 1086818
URL: http://svn.apache.org/viewvc?rev=1086818&view=rev
Log:
Be more scientific about inducing GCs
Modified:
harmony/enhanced/java/branches/java6/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/WeakHashMapTest.java
Modified: harmony/enhanced/java/branches/java6/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/WeakHashMapTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/java/branches/java6/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/WeakHashMapTest.java?rev=1086818&r1=1086817&r2=1086818&view=diff
==============================================================================
--- harmony/enhanced/java/branches/java6/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/WeakHashMapTest.java (original)
+++ harmony/enhanced/java/branches/java6/classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/util/WeakHashMapTest.java Wed Mar 30 01:23:20 2011
@@ -17,6 +17,8 @@
package org.apache.harmony.luni.tests.java.util;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
import java.util.AbstractMap;
import java.util.Arrays;
import java.util.Collection;
@@ -25,7 +27,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
-
import tests.support.Support_MapTest2;
public class WeakHashMapTest extends junit.framework.TestCase {
@@ -43,7 +44,7 @@ public class WeakHashMapTest extends jun
Object[] valueArray = new Object[100];
WeakHashMap whm;
-
+
Object[] KEY_ARRAY;
Object[] VALUE_ARRAY;
@@ -99,7 +100,7 @@ public class WeakHashMapTest extends jun
empty.put("something", "here");
assertTrue("cannot get element", empty.get("something") == "here");
}
-
+
/**
* @tests java.util.WeakHashMap#WeakHashMap(java.util.Map)
*/
@@ -192,18 +193,7 @@ public class WeakHashMapTest extends jun
// Dereference a single key, then try to
// force a collection of the weak ref'd obj
KEY_ARRAY[50] = null;
- int count = 0;
- do {
- System.gc();
- System.gc();
- Runtime.getRuntime().runFinalization();
- count++;
- } while (count <= 5 && entrySet.size() == 100);
-
- if ((count == 5) && (entrySet.size() == 100)) {
- // We failed (or entrySet broken), so further tests not valid.
- return;
- }
+ enqueueWeakReferences();
assertEquals("Assert 4: Incorrect number of entries after gc", 99,
entrySet.size());
@@ -243,7 +233,7 @@ public class WeakHashMapTest extends jun
assertTrue("Assert 8: iterator not empty", !entrySet.iterator()
.hasNext());
}
-
+
/**
* @tests java.util.WeakHashMap#entrySet()
*/
@@ -269,13 +259,7 @@ public class WeakHashMapTest extends jun
values = null;
keyArray[50] = null;
- int count = 0;
- do {
- System.gc();
- System.gc();
- Runtime.getRuntime().runFinalization();
- count++;
- } while (count <= 5 && entrySet.size() == 100);
+ enqueueWeakReferences();
assertTrue(
"Incorrect number of entries returned after gc--wanted 99, got: "
@@ -313,12 +297,11 @@ public class WeakHashMapTest extends jun
// java.util.WeakHashMap.put(java.lang.Object, java.lang.Object)
WeakHashMap map = new WeakHashMap();
map.put(null, "value"); // add null key
- System.gc();
- System.runFinalization();
+ enqueueWeakReferences();
map.remove("nothing"); // Cause objects in queue to be removed
assertEquals("null key was removed", 1, map.size());
}
-
+
/**
* @tests java.util.WeakHashMap#putAll(java.util.Map)
*/
@@ -378,13 +361,7 @@ public class WeakHashMapTest extends jun
values = null;
keyArray[50] = null;
- int count = 0;
- do {
- System.gc();
- System.gc();
- Runtime.getRuntime().runFinalization();
- count++;
- } while (count <= 5 && keySet.size() == 100);
+ enqueueWeakReferences();
assertEquals("Incorrect number of keys returned after gc,", 99, keySet
.size());
@@ -403,7 +380,7 @@ public class WeakHashMapTest extends jun
Iterator iter = map.keySet().iterator();
iter.next();
iter.next();
- System.gc();
+ enqueueWeakReferences();
assertFalse("Wrong hasNext() value", iter.hasNext());
}
@@ -449,19 +426,32 @@ public class WeakHashMapTest extends jun
values = null;
keyArray[50] = null;
- int count = 0;
- do {
- System.gc();
- System.gc();
- Runtime.getRuntime().runFinalization();
- count++;
- } while (count <= 5 && valuesCollection.size() == 100);
+ enqueueWeakReferences();
assertEquals("Incorrect number of keys returned after gc,", 99,
valuesCollection.size());
}
- /**
+ /**
+ * Induce the VM to enqueue weak references into the corresponding reference
+ * queues. This guarantees that all weak hash maps can observe their own
+ * references as both cleared and enqueued.
+ *
+ * <p>This method assumes that one value enqueued implies all others will be
+ * enqueued. This behavior isn't specified, and this method may return too
+ * early on some VMs.
+ */
+ private void enqueueWeakReferences() {
+ ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
+ new WeakReference<Object>(new Object(), queue);
+ System.gc();
+ try {
+ queue.remove(200); // '200' shouldn't be necessary, but works on more VMs
+ } catch (InterruptedException e) {
+ }
+ }
+
+ /**
* Sets up the fixture, for example, open a network connection. This method
* is called before a test is executed.
*/