Index: base/android/junit/src/org/chromium/base/DiscardableReferencePoolTest.java |
diff --git a/base/android/junit/src/org/chromium/base/DiscardableReferencePoolTest.java b/base/android/junit/src/org/chromium/base/DiscardableReferencePoolTest.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..48a23b567a4032a0fd580661341330e34dd02eb1 |
--- /dev/null |
+++ b/base/android/junit/src/org/chromium/base/DiscardableReferencePoolTest.java |
@@ -0,0 +1,78 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.base; |
+ |
+import org.junit.Assert; |
+import org.junit.Test; |
+import org.junit.runner.RunWith; |
+import org.robolectric.annotation.Config; |
+ |
+import org.chromium.base.DiscardableReferencePool.DiscardableReference; |
+import org.chromium.testing.local.LocalRobolectricTestRunner; |
+ |
+import java.lang.ref.WeakReference; |
+ |
+/** |
+ * Tests for {@link DiscardableReferencePool}. |
+ */ |
+@RunWith(LocalRobolectricTestRunner.class) |
+@Config(manifest = Config.NONE) |
+public class DiscardableReferencePoolTest { |
+ /** |
+ * Tests that draining the pool clears references and allows objects to be garbage collected. |
+ */ |
+ @Test |
+ public void testDrain() { |
+ DiscardableReferencePool pool = new DiscardableReferencePool(); |
+ |
+ Object object = new Object(); |
+ WeakReference<Object> weakReference = new WeakReference<>(object); |
+ |
+ DiscardableReference<Object> discardableReference = pool.put(object); |
+ Assert.assertEquals(object, discardableReference.get()); |
+ |
+ // Drop reference to the object itself, to allow it to be garbage-collected. |
+ object = null; |
+ |
+ pool.drain(); |
+ |
+ // The discardable reference should be null now. |
+ Assert.assertNull(discardableReference.get()); |
+ |
+ // The object is not (strongly) reachable anymore, so the weak reference may or may not be |
+ // null (it could be if a GC has happened since the pool was drained). |
+ // After an explicit GC call it definitely should be null. |
+ Runtime.getRuntime().gc(); |
+ |
+ Assert.assertNull(weakReference.get()); |
+ } |
+ |
+ /** |
+ * Tests that dropping the (last) discardable reference to an object allows it to be regularly |
+ * garbage collected. |
+ */ |
+ @Test |
+ public void testReferenceGCd() { |
+ DiscardableReferencePool pool = new DiscardableReferencePool(); |
+ |
+ Object object = new Object(); |
+ WeakReference<Object> weakReference = new WeakReference<>(object); |
+ |
+ DiscardableReference<Object> discardableReference = pool.put(object); |
+ Assert.assertEquals(object, discardableReference.get()); |
+ |
+ // Drop reference to the object itself and to the discardable reference, allowing the object |
+ // to be garbage-collected. |
+ object = null; |
+ discardableReference = null; |
+ |
+ // The object is not (strongly) reachable anymore, so the weak reference may or may not be |
+ // null (it could be if a GC has happened since the pool was drained). |
+ // After an explicit GC call it definitely should be null. |
+ Runtime.getRuntime().gc(); |
+ |
+ Assert.assertNull(weakReference.get()); |
+ } |
+} |