Index: android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java |
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java |
index 501ce011a1dd9a30dd6b1e8c5021fe6abcbf1d06..8d6da4c96083d40bf93a6ea521428e9820ca97e6 100644 |
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java |
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsGarbageCollectionTest.java |
@@ -12,11 +12,13 @@ import android.test.suitebuilder.annotation.SmallTest; |
import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout; |
import org.chromium.android_webview.AwContents; |
+import org.chromium.base.Log; |
import org.chromium.base.annotations.SuppressFBWarnings; |
import org.chromium.base.test.util.Feature; |
import org.chromium.content.browser.test.util.Criteria; |
import org.chromium.content.browser.test.util.CriteriaHelper; |
+import java.util.Map; |
import java.util.concurrent.Callable; |
/** |
@@ -26,6 +28,8 @@ import java.util.concurrent.Callable; |
* See crbug.com/544098 for why @DisableHardwareAccelerationForTest is needed. |
*/ |
public class AwContentsGarbageCollectionTest extends AwTestBase { |
+ private static final String TAG = "AwGcTest"; |
+ |
// The system retains a strong ref to the last focused view (in InputMethodManager) |
// so allow for 1 'leaked' instance. |
private static final int MAX_IDLE_INSTANCES = 1; |
@@ -86,6 +90,7 @@ public class AwContentsGarbageCollectionTest extends AwTestBase { |
@SmallTest |
@Feature({"AndroidWebView"}) |
public void testCreateAndGcOneTime() throws Throwable { |
+ Log.d(TAG, "testCreateAndGcOneTime start"); |
gcAndCheckAllAwContentsDestroyed(); |
TestAwContentsClient client = new TestAwContentsClient(); |
@@ -94,10 +99,13 @@ public class AwContentsGarbageCollectionTest extends AwTestBase { |
containerViews[i] = createAwTestContainerViewOnMainSync(client); |
loadUrlAsync(containerViews[i].getAwContents(), "about:blank"); |
} |
+ Log.d(TAG, "testCreateAndGcOneTime create views done"); |
containerViews = null; |
removeAllViews(); |
+ Log.d(TAG, "testCreateAndGcOneTime remove views done"); |
gcAndCheckAllAwContentsDestroyed(); |
+ Log.d(TAG, "testCreateAndGcOneTime end"); |
} |
@DisableHardwareAccelerationForTest |
@@ -172,15 +180,31 @@ public class AwContentsGarbageCollectionTest extends AwTestBase { |
} |
private void removeAllViews() throws Throwable { |
+ Log.d(TAG, "removeAllViews instrumentation thread"); |
+ dumpAllThreadStacks(); |
runTestOnUiThread(new Runnable() { |
@Override |
public void run() { |
+ Log.d(TAG, "removeAllViews UI thread"); |
getActivity().removeAllViews(); |
} |
}); |
+ Log.d(TAG, "removeAllViews instrumentation thread done"); |
+ } |
+ |
+ private void dumpAllThreadStacks() { |
+ Log.d(TAG, "_________________________"); |
+ for (Map.Entry<Thread, StackTraceElement[]> entry : Thread.getAllStackTraces().entrySet()) { |
+ Log.d(TAG, "Thread name: " + entry.getKey().getName()); |
+ for (StackTraceElement stack : entry.getValue()) { |
+ Log.d(TAG, " " + stack); |
+ } |
+ } |
+ Log.d(TAG, "_________________________"); |
} |
private void gcAndCheckAllAwContentsDestroyed() throws InterruptedException { |
+ Log.d(TAG, "Cause GC"); |
Runtime.getRuntime().gc(); |
Criteria criteria = new Criteria() { |
@@ -191,6 +215,7 @@ public class AwContentsGarbageCollectionTest extends AwTestBase { |
@Override |
public Boolean call() { |
int count = AwContents.getNativeInstanceCount(); |
+ Log.d(TAG, "NativeInstanceCount = " + count); |
return count <= MAX_IDLE_INSTANCES; |
} |
}); |
@@ -210,6 +235,7 @@ public class AwContentsGarbageCollectionTest extends AwTestBase { |
CriteriaHelper.pollForCriteria(criteria, timeoutBetweenGcMs, CHECK_INTERVAL); |
break; |
} catch (AssertionError e) { |
+ Log.d(TAG, "Cause GC " + i); |
Runtime.getRuntime().gc(); |
} |
} |