diff options
Diffstat (limited to 'luni/src/test/java/libcore/java/lang/ref/FinalizeTest.java')
-rw-r--r-- | luni/src/test/java/libcore/java/lang/ref/FinalizeTest.java | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/luni/src/test/java/libcore/java/lang/ref/FinalizeTest.java b/luni/src/test/java/libcore/java/lang/ref/FinalizeTest.java index 10a26fe..ef303bd 100644 --- a/luni/src/test/java/libcore/java/lang/ref/FinalizeTest.java +++ b/luni/src/test/java/libcore/java/lang/ref/FinalizeTest.java @@ -29,18 +29,42 @@ public final class FinalizeTest extends TestCase { FinalizationTester.induceFinalization(); if (!finalized.get()) { - fail(); + fail("object not yet finalized"); + } + } + + /** + * Test verifies that runFinalization() does not mess up objects + * that should be finalized later on. http://b/6907299 + */ + public void testInducedFinalization() throws Exception { + AtomicBoolean finalized1 = new AtomicBoolean(); + AtomicBoolean finalized2 = new AtomicBoolean(); + createFinalizableObject(finalized1); + createFinalizableObject(finalized2); + FinalizationTester.induceFinalization(); + if (!finalized1.get() || !finalized2.get()) { + fail("not yet finalized: " + finalized1.get() + " " + finalized2.get()); } } /** Do not inline this method; that could break non-precise GCs. See FinalizationTester. */ - private void createFinalizableObject(final AtomicBoolean finalized) { - new X() { + private X createFinalizableObject(final AtomicBoolean finalized) { + X result = new X() { @Override protected void finalize() throws Throwable { super.finalize(); finalized.set(true); } }; + FinalizationTester.induceFinalization(); + // Dance around a bit to discourage dx from realizing that 'result' is no longer live. + boolean wasFinalized = finalized.get(); + if (wasFinalized) { + fail("finalizer called early"); // ...because 'result' is still live until we return. + } + // But we don't actually want to return 'result' because then we'd have to worry about + // the caller accidentally keeping it live. + return wasFinalized ? result : null; } static class X {} |