weaks
authorAlexey Kudravtsev <cdr@intellij.com>
Wed, 7 Jul 2010 09:24:53 +0000 (13:24 +0400)
committerAlexey Kudravtsev <cdr@intellij.com>
Wed, 7 Jul 2010 09:24:53 +0000 (13:24 +0400)
platform/util/testSrc/com/intellij/util/containers/WeakListTest.java
platform/util/testSrc/com/intellij/util/containers/WeakReferenceArrayTest.java
platform/util/testSrc/com/intellij/util/containers/WeaksTestCase.java

index a82cc3d5b5e94aba9ed76d995a4a3354d2ff4ac8..d24bde03913acf925bfde8b4163e9d6c8df1b231 100644 (file)
@@ -36,6 +36,7 @@ public class WeakListTest extends WeaksTestCase {
   }
 
   public void testCompresses() {
+    if (!JVM_IS_GC_CAPABLE) return;
     for (int i = 0; i < 20; i++) {
       addElement(new Object(), myWeakArray);
     }
@@ -57,6 +58,7 @@ public class WeakListTest extends WeaksTestCase {
   }
   
   public void testIterator() {
+    if (!JVM_IS_GC_CAPABLE) return;
     myWeakArray.add(new Object());
     addElement(new Object(), myWeakArray);
     myWeakArray.add(new Object());
@@ -72,6 +74,7 @@ public class WeakListTest extends WeaksTestCase {
   }
   
   public void testRemoveViaIterator() {
+    if (!JVM_IS_GC_CAPABLE) return;
     addElement(new Object(), myWeakArray);
     myWeakArray.add(new Object());
     addElement(new Object(), myWeakArray);
@@ -97,6 +100,7 @@ public class WeakListTest extends WeaksTestCase {
   }
 
   public void testRemoveLastViaIterator() {
+    if (!JVM_IS_GC_CAPABLE) return;
     addElement(new Object(), myWeakArray);
     addElement(new Object(), myWeakArray);
     Iterator<Object> iterator = myWeakList.iterator();
@@ -111,6 +115,7 @@ public class WeakListTest extends WeaksTestCase {
   }
 
   public void testIteratorKeepsFirstElement() {
+    if (!JVM_IS_GC_CAPABLE) return;
     addElement(new Object(), myWeakArray);
     addElement(new Object(), myWeakArray);
     Iterator<Object> iterator = myWeakList.iterator();
@@ -122,6 +127,7 @@ public class WeakListTest extends WeaksTestCase {
   }
   
   public void testIteratorKeepsNextElement() {
+    if (!JVM_IS_GC_CAPABLE) return;
     addElement(new Object(), myWeakArray);
     addElement(new Object(), myWeakArray);
     addElement(new Object(), myWeakArray);
index 8beb40f2a92c3551df465495f4308bf7b56bd9cd..3abf8438a6a1797c2313c413d57564c3534b2936 100644 (file)
@@ -34,6 +34,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testCorpseCounter() {
+    if (!JVM_IS_GC_CAPABLE) return;
     addElements(5);
     assertEquals(0, myCollection.getCorpseCount());
     checkSameElements();
@@ -52,6 +53,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testAddRemove() {
+    if (!JVM_IS_GC_CAPABLE) return;
     myHolder.add("1");
     myHolder.add("2");
     assertEquals(0, myCollection.size());
@@ -65,6 +67,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testRemoveDead() {
+    if (!JVM_IS_GC_CAPABLE) return;
     myCollection.add(new Object());
     myCollection.add(this);
     gc();
@@ -75,6 +78,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testCompress() {
+    if (!JVM_IS_GC_CAPABLE) return;
     addElements(5);
     checkSameElements();
     myHolder.remove(0);
@@ -87,6 +91,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testCompressTrackingLastSurvived() {
+    if (!JVM_IS_GC_CAPABLE) return;
     myCollection.add(new Object());
     addElement(new Object());
     myCollection.add(new Object());
@@ -97,6 +102,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testCompressTrackingNotLastSurvived() {
+    if (!JVM_IS_GC_CAPABLE) return;
     myCollection.add(new Object());
     addElement(new Object());
     myCollection.add(new Object());
@@ -106,6 +112,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testCompressTrackingLostIndex() {
+    if (!JVM_IS_GC_CAPABLE) return;
     myCollection.add(new Object());
     addElement(new Object());
     myCollection.add(new Object());
@@ -115,6 +122,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testCompressTrackingLostLastIndex() {
+    if (!JVM_IS_GC_CAPABLE) return;
     myCollection.add(new Object());
     addElement(new Object());
     myCollection.add(new Object());
@@ -125,6 +133,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testAddingManyElement() {
+    if (!JVM_IS_GC_CAPABLE) return;
     int initialCapacity = fullCollection();
     assertEquals(initialCapacity, myCollection.getCapacity());
     assertTrue(initialCapacity > 3); // Need to go on
@@ -138,6 +147,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testReduceSize() {
+    if (!JVM_IS_GC_CAPABLE) return;
     int initialCapacity = fullCollection();
     assertEquals(initialCapacity, myCollection.getCapacity());
     addElement(new Object());
@@ -168,6 +178,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testReduceCapacityOfAliveCollection() {
+    if (!JVM_IS_GC_CAPABLE) return;
     myCollection = new WeakReferenceArray<Object>(WeakReferenceArray.MINIMUM_CAPACITY * 3);
     addElement(new Object());
     myCollection.reduceCapacity(-1);
@@ -176,6 +187,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testRemoveAlives() {
+    if (!JVM_IS_GC_CAPABLE) return;
     addElement(new Object());
     addElement(new Object());
     addElement(new Object());
@@ -198,6 +210,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testRemoveEnqueuedReference() {
+    if (!JVM_IS_GC_CAPABLE) return;
     addElement(new Object());
     WeakReference reference = myCollection.getReferences()[0];
     assertSame(reference.get(), myHolder.get(0));
@@ -213,6 +226,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testRemoveNotEnqueuedReference() {
+    if (!JVM_IS_GC_CAPABLE) return;
     addElement(new Object());
     WeakReference reference = myCollection.getReferences()[0];
     myCollection.remove(0);
@@ -224,6 +238,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testOutofboundsReferences() {
+    if (!JVM_IS_GC_CAPABLE) return;
     for (int i = 0; i < 400; i++) addElement(new Object());
     WeakReference[] references = copyReferences();
     for (int i = 0; i < 100; i++) references[i].clear();
@@ -242,6 +257,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testRemoveAliveReference() {
+    if (!JVM_IS_GC_CAPABLE) return;
     Object obj = new Object();
     myCollection.add(obj);
     WeakReference[] references = copyReferences();
@@ -254,6 +270,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testRemoveDeadReference() {
+    if (!JVM_IS_GC_CAPABLE) return;
     Object obj = new Object();
     myCollection.add(obj);
     WeakReference[] references = copyReferences();
@@ -265,6 +282,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testRemoveRemovedReference() {
+    if (!JVM_IS_GC_CAPABLE) return;
     Object obj = new Object();
     myCollection.add(obj);
     myCollection.remove(0);
@@ -274,6 +292,7 @@ public class WeakReferenceArrayTest extends WeaksTestCase {
   }
 
   public void testCompacting() {
+    if (!JVM_IS_GC_CAPABLE) return;
     addElements(20);
     removeEven(1);
     myCollection.reduceCapacity(-1);
index ab4f7174464639a0a7e086462e07d320d27139ad..9d88ab2989ab4670e663f537ebf097e4c9af664a 100644 (file)
@@ -20,44 +20,41 @@ import junit.framework.TestCase;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 public abstract class WeaksTestCase extends TestCase {
-  protected final List<Object> myHolder = new ArrayList<Object>();
-
-  protected void checkSameElements(Iterator holderIterator, Iterator collectionIterator) {
-    while (holderIterator.hasNext() && collectionIterator.hasNext()) {
-      assertSame(holderIterator.next(), collectionIterator.next());
+  protected static final boolean JVM_IS_GC_CAPABLE = isJvmGcCapable();
+  private static boolean isJvmGcCapable() {
+    List<Object> list = new ArrayList<Object>();
+    Object o = new Object();
+    list.add(o);
+    WeakReference<Object> wr = new WeakReference<Object>(o);
+    assertSame(o, wr.get());
+    o = null;
+    list.clear();
+    gc();
+    boolean cleared = wr.get() == null;
+    if (!cleared) {
+      System.out.println("GC INCAPABLE JVM DETECTED");
     }
-    assertEquals(holderIterator.hasNext(), collectionIterator.hasNext());
+    return cleared;
   }
 
-  //protected void checkSameElements(ArrayList elementsHolder, WeakCollection collection) {
-  //  for (int i = 0; i < elementsHolder.size(); i++) {
-  //    assertSame(String.valueOf(i), elementsHolder.get(i), collection.get(i));
-  //  }
-  //  final Iterator iterator = elementsHolder.iterator();
-  //  collection.forEach(new WeakCollection.Procedure() {
-  //    public boolean execute(Object object, Iterator it) {
-  //      assertSame(iterator.next(), object);
-  //      return true;
-  //    }
-  //  });
-  //}
 
-  protected void gc() {
+  protected final List<Object> myHolder = new ArrayList<Object>();
+
+  protected static void gc() {
     System.gc();
-    int[][] ints = new int[1000000][];
-    for(int i = 0; i < 1000000; i++){
-      ints[i] = new int[0];
+    List<Object> list = new ArrayList<Object>();
+    while (Runtime.getRuntime().freeMemory() > 10000) {
+      list.add(new byte[1000]);
     }
 
     System.gc();
-    ints = null;
+    list = null;
     System.gc();
 
-    WeakReference weakReference = new WeakReference(new Object());
+    WeakReference<Object> weakReference = new WeakReference<Object>(new Object());
     do {
       System.gc();
     }
@@ -94,13 +91,13 @@ public abstract class WeaksTestCase extends TestCase {
       assertNull(references[i]);
   }
 
-  private int nextValidIndex(int validIndex, WeakReferenceArray collection) {
+  private static int nextValidIndex(int validIndex, WeakReferenceArray collection) {
     validIndex++;
     while (validIndex < collection.size() && collection.get(validIndex) == null) validIndex++;
     return validIndex;
   }
 
-  protected void addElement(Object o, WeakReferenceArray array) {
+  protected void addElement(Object o, WeakReferenceArray<Object> array) {
     myHolder.add(o);
     array.add(o);
   }