From 31d16579488645b19d6888fb1a7089103c5b48fc Mon Sep 17 00:00:00 2001 From: markushi Date: Tue, 27 May 2025 07:29:58 +0200 Subject: [PATCH 1/2] Extend tests to ensure default integrations are registered --- .../sentry-uitest-android/build.gradle.kts | 1 + .../io/sentry/uitest/android/SdkInitTests.kt | 64 +++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts b/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts index 19a394514fe..40516ce19f2 100644 --- a/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts +++ b/sentry-android-integration-tests/sentry-uitest-android/build.gradle.kts @@ -61,6 +61,7 @@ android { isMinifyEnabled = true signingConfig = signingConfigs.getByName("debug") proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") + testProguardFiles("proguard-rules.pro") } getByName("release") { isMinifyEnabled = true diff --git a/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt b/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt index e9c08f43591..a4ad624b8f0 100644 --- a/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt +++ b/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt @@ -5,7 +5,9 @@ import androidx.test.core.app.launchActivity import androidx.test.ext.junit.runners.AndroidJUnit4 import io.sentry.ProfilingTraceData import io.sentry.Sentry +import io.sentry.SentryIntegrationPackageStorage import io.sentry.android.core.AndroidLogger +import io.sentry.android.core.CurrentActivityHolder import io.sentry.android.core.SentryAndroidOptions import io.sentry.assertEnvelopeTransaction import io.sentry.protocol.SentryTransaction @@ -15,6 +17,7 @@ import org.junit.runner.RunWith import shark.AndroidReferenceMatchers import shark.IgnoredReferenceMatcher import shark.ReferencePattern +import java.util.concurrent.CountDownLatch import kotlin.test.Test import kotlin.test.assertEquals import kotlin.test.assertTrue @@ -215,4 +218,65 @@ class SdkInitTests : BaseUiTest() { LeakAssertions.assertNoLeaks() } + + @Test + fun foregroundInitInstallsDefaultIntegrations() { + val activityScenario = launchActivity() + activityScenario.moveToState(Lifecycle.State.RESUMED) + activityScenario.onActivity { activity -> + // Our SentryInitProvider does not run in this test + // so we need to set the current activity manually + CurrentActivityHolder.getInstance().setActivity(activity) + initSentry(false) { options: SentryAndroidOptions -> + options.tracesSampleRate = 1.0 + options.profilesSampleRate = 1.0 + } + } + activityScenario.moveToState(Lifecycle.State.DESTROYED) + assertDefaultIntegrations() + } + + @Test + fun backgroundInitInstallsDefaultIntegrations() { + val initLatch = CountDownLatch(1) + + val activityScenario = launchActivity() + activityScenario.moveToState(Lifecycle.State.RESUMED) + activityScenario.onActivity { activity -> + // Our SentryInitProvider does not run in this test + // so we need to set the current activity manually + CurrentActivityHolder.getInstance().setActivity(activity) + Thread { + initSentry(false) { options: SentryAndroidOptions -> + options.tracesSampleRate = 1.0 + options.profilesSampleRate = 1.0 + } + initLatch.countDown() + }.start() + } + initLatch.await() + + activityScenario.moveToState(Lifecycle.State.DESTROYED) + + assertDefaultIntegrations() + } + + private fun assertDefaultIntegrations() { + for (integration in listOf( + "UncaughtExceptionHandler", + "ShutdownHook", + "SendCachedEnvelope", + "Ndk", + "AppLifecycle", + "EnvelopeFileObserver", + "AnrV2", + "ActivityLifecycle", + "ActivityBreadcrumbs", + "UserInteraction", + "AppComponentsBreadcrumbs", + "NetworkBreadcrumbs" + )) { + assertTrue(SentryIntegrationPackageStorage.getInstance().integrations.contains(integration), "Integration $integration was expected, but was not registered") + } + } } From dc8966312cba93ca0b58a1a737b59e7a9d85b508 Mon Sep 17 00:00:00 2001 From: markushi Date: Tue, 27 May 2025 08:23:22 +0200 Subject: [PATCH 2/2] Only check for NDK if it's bundled with the app --- .../io/sentry/uitest/android/SdkInitTests.kt | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt b/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt index a4ad624b8f0..432ac08b10d 100644 --- a/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt +++ b/sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt @@ -8,6 +8,7 @@ import io.sentry.Sentry import io.sentry.SentryIntegrationPackageStorage import io.sentry.android.core.AndroidLogger import io.sentry.android.core.CurrentActivityHolder +import io.sentry.android.core.NdkIntegration import io.sentry.android.core.SentryAndroidOptions import io.sentry.assertEnvelopeTransaction import io.sentry.protocol.SentryTransaction @@ -262,11 +263,10 @@ class SdkInitTests : BaseUiTest() { } private fun assertDefaultIntegrations() { - for (integration in listOf( + val integrations = mutableListOf( "UncaughtExceptionHandler", "ShutdownHook", "SendCachedEnvelope", - "Ndk", "AppLifecycle", "EnvelopeFileObserver", "AnrV2", @@ -275,7 +275,17 @@ class SdkInitTests : BaseUiTest() { "UserInteraction", "AppComponentsBreadcrumbs", "NetworkBreadcrumbs" - )) { + ) + + // NdkIntegration is not always available, so we check for its presence + try { + Class.forName(NdkIntegration.SENTRY_NDK_CLASS_NAME) + integrations.add("Ndk") + } catch (_: ClassNotFoundException) { + // ignored, in case the app is build without NDK support + } + + for (integration in integrations) { assertTrue(SentryIntegrationPackageStorage.getInstance().integrations.contains(integration), "Integration $integration was expected, but was not registered") } }