aboutsummaryrefslogtreecommitdiff
path: root/integration_tests/nativegraphics/src/test/java/org/robolectric/integrationtests/nativegraphics/ShadowNativeAllocationRegistryTest.java
diff options
context:
space:
mode:
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.java40
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();
+ }
}