// 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.base.test.BaseRobolectricTestRunner;
import org.chromium.base.test.util.RetryOnFailure;

import java.lang.ref.WeakReference;

/**
 * Tests for {@link DiscardableReferencePool}.
 */
@RunWith(BaseRobolectricTestRunner.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
    @RetryOnFailure
    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());
    }
}
