OOM
[idea/community.git] / platform / util / testSrc / com / intellij / util / containers / WeaksTestCase.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
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.intellij.util.containers;
18
19 import junit.framework.TestCase;
20
21 import java.lang.ref.WeakReference;
22 import java.util.ArrayList;
23 import java.util.List;
24
25 public abstract class WeaksTestCase extends TestCase {
26   protected static final boolean JVM_IS_GC_CAPABLE = isJvmGcCapable();
27   private static boolean isJvmGcCapable() {
28     List<Object> list = new ArrayList<Object>();
29     Object o = new Object();
30     list.add(o);
31     WeakReference<Object> wr = new WeakReference<Object>(o);
32     assertSame(o, wr.get());
33     o = null;
34     list.clear();
35     gc();
36     boolean cleared = wr.get() == null;
37     if (!cleared) {
38       System.out.println("GC INCAPABLE JVM DETECTED");
39     }
40     return cleared;
41   }
42
43
44   protected final List<Object> myHolder = new ArrayList<Object>();
45
46   protected static void gc() {
47     System.gc();
48     try {
49       List<Object> list = new ArrayList<Object>();
50       while (Runtime.getRuntime().freeMemory() > 100000) {
51         list.add(new byte[1000]);
52       }
53
54       System.gc();
55       list = null;
56     }
57     catch (OutOfMemoryError e) {
58       // ignore
59     }
60     System.gc();
61
62     WeakReference<Object> weakReference = new WeakReference<Object>(new Object());
63     do {
64       System.gc();
65     }
66     while (weakReference.get() != null);
67   }
68
69
70   protected void checkSameElements(WeakReferenceArray collection) {
71     checkSameNotNulls(collection);
72     assertEquals(myHolder.size(), collection.size());
73     for (int i = 0; i < myHolder.size(); i++) {
74       assertSame(myHolder.get(i), collection.get(i));
75     }
76     WeakReference[] references = collection.getReferences();
77     for (int i = myHolder.size(); i < references.length; i++)
78       assertNull(references[i]);
79   }
80
81   protected void checkSameNotNulls(WeakReferenceArray collection) {
82     int validIndex = -1;
83     int validCount = 0;
84     for (int i = 0; i < myHolder.size(); i++) {
85       validIndex = nextValidIndex(validIndex, collection);
86       assertSame(i + "==" + validIndex, myHolder.get(i), collection.get(validIndex));
87       validCount++;
88     }
89     assertEquals(myHolder.size(), validCount);
90     assertTrue(collection.size() >= nextValidIndex(validIndex, collection));
91     assertTrue(collection.size() - myHolder.size() >= collection.getCorpseCount());
92
93     //validIndex = Math.max(validIndex, 0);
94     WeakReference[] references = collection.getReferences();
95     for (int i = collection.size(); i < references.length; i++)
96       assertNull(references[i]);
97   }
98
99   private static int nextValidIndex(int validIndex, WeakReferenceArray collection) {
100     validIndex++;
101     while (validIndex < collection.size() && collection.get(validIndex) == null) validIndex++;
102     return validIndex;
103   }
104
105   protected void addElement(Object o, WeakReferenceArray<Object> array) {
106     myHolder.add(o);
107     array.add(o);
108   }
109 }