diff options
Diffstat (limited to 'integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/ShadowNativeAllocationRegistryTest.java')
-rw-r--r-- | integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/ShadowNativeAllocationRegistryTest.java | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/ShadowNativeAllocationRegistryTest.java b/integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/ShadowNativeAllocationRegistryTest.java index 14f74de93..0fce5d5af 100644 --- a/integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/ShadowNativeAllocationRegistryTest.java +++ b/integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/ShadowNativeAllocationRegistryTest.java @@ -1,16 +1,45 @@ package org.robolectric.integrationtests.nativegraphics; +import static android.os.Build.VERSION_CODES.O; +import static android.os.Build.VERSION_CODES.S; +import static com.google.common.truth.Truth.assertThat; +import static org.robolectric.util.reflector.Reflector.reflector; + import android.graphics.Bitmap; import android.graphics.Color; +import android.graphics.Matrix; +import com.google.common.testing.GcFinalization; +import java.lang.ref.WeakReference; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; +import org.robolectric.util.reflector.Accessor; +import org.robolectric.util.reflector.ForType; +import org.robolectric.util.reflector.Static; @RunWith(RobolectricTestRunner.class) -@Config(sdk = 30) +@Config(minSdk = O) public final class ShadowNativeAllocationRegistryTest { + @Test + public void applyFreeFunction_matrix() throws Exception { + WeakReference<Matrix> weakMatrix = new WeakReference<>(newMatrix()); + // Invokes 'applyFreeFunction' when the matrix is GC'd. + GcFinalization.awaitClear(weakMatrix); + } + + // Creates a new Matrix as a local variable, which is eligible for GC when it goes out + // of scope. + private Matrix newMatrix() { + Matrix matrix = new Matrix(); + long pointer = reflector(MatrixReflector.class, matrix).getNativeInstance(); + long freeFunction = reflector(MatrixReflector.class).nGetNativeFinalizer(); + assertThat(pointer).isNotEqualTo(0); + assertThat(freeFunction).isNotEqualTo(0); + return matrix; + } + @Config(sdk = S) // No need to re-run on multiple SDK levels @Test public void nativeAllocationRegistryStressTest() { for (int i = 0; i < 10_000; i++) { @@ -21,4 +50,13 @@ public final class ShadowNativeAllocationRegistryTest { } } } + + @ForType(Matrix.class) + interface MatrixReflector { + @Accessor("native_instance") + long getNativeInstance(); + + @Static + long nGetNativeFinalizer(); + } } |