From efdc0134d04429cf400cc89533cf8f87c63e1643 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Thu, 10 Aug 2023 16:23:10 +0200 Subject: [PATCH 1/9] Deprecate context in Sentry.init in favor of using init without it --- buildSrc/src/main/java/Config.kt | 1 + sentry-kotlin-multiplatform/build.gradle.kts | 1 + .../src/androidMain/AndroidManifest.xml | 9 ++- .../multiplatform/SentryInit.android.kt | 65 +++++++++++++++++-- .../kotlin/multiplatform/BaseSentryTest.kt | 13 +++- .../multiplatform/ContextProviderTest.kt | 45 +++++++++++++ .../kotlin/multiplatform/SentryBridge.jvm.kt | 4 +- .../sentry/kotlin/multiplatform/SentryKMP.kt | 5 ++ .../kotlin/multiplatform/SentryInit.jvm.kt | 2 +- .../sample/kmp/app/android/MainActivity.kt | 2 +- .../kotlin/sample.kmp.app/SentrySetup.kt | 10 --- .../kotlin/sentry/kmp/demo/android/MainApp.kt | 4 +- .../kmp-app-mvvm-di/iosApp/AppDelegate.swift | 2 +- .../sentry.kmp.demo/sentry/SentrySetup.kt | 16 +---- .../sample/kmp/app/android/MainActivity.kt | 2 +- .../kotlin/sample.kmp.app/SentrySetup.kt | 10 --- 16 files changed, 140 insertions(+), 51 deletions(-) create mode 100644 sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/ContextProviderTest.kt diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt index 26d9dbe2..79c228a9 100644 --- a/buildSrc/src/main/java/Config.kt +++ b/buildSrc/src/main/java/Config.kt @@ -53,6 +53,7 @@ object Config { val roboelectric = "org.robolectric:robolectric:4.9" val junitKtx = "androidx.test.ext:junit-ktx:1.1.5" + val mockitoCore = "org.mockito:mockito-core:5.4.0" } object Android { diff --git a/sentry-kotlin-multiplatform/build.gradle.kts b/sentry-kotlin-multiplatform/build.gradle.kts index fbc52077..369ee4c9 100644 --- a/sentry-kotlin-multiplatform/build.gradle.kts +++ b/sentry-kotlin-multiplatform/build.gradle.kts @@ -67,6 +67,7 @@ kotlin { dependencies { implementation(Config.TestLibs.roboelectric) implementation(Config.TestLibs.junitKtx) + implementation(Config.TestLibs.mockitoCore) } } val jvmMain by getting diff --git a/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml b/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml index 8c41501c..86cae3ae 100644 --- a/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml +++ b/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml @@ -8,7 +8,14 @@ android:name="io.sentry.android.core.SentryInitProvider" android:authorities="${applicationId}.SentryInitProvider" android:exported="false" - tools:node="remove"/> + tools:node="remove"> + + + diff --git a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt index 8777b6eb..c9b56da3 100644 --- a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt +++ b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt @@ -1,15 +1,72 @@ package io.sentry.kotlin.multiplatform +import android.content.ContentProvider +import android.content.ContentValues import android.content.Context +import android.database.Cursor +import android.net.Uri import io.sentry.android.core.SentryAndroid import io.sentry.kotlin.multiplatform.extensions.toAndroidSentryOptionsCallback -internal actual fun initSentry(context: Context?, configuration: OptionsConfiguration) { +internal actual fun initSentry(configuration: OptionsConfiguration) { val options = SentryOptions() configuration.invoke(options) - context?.let { - SentryAndroid.init(it, options.toAndroidSentryOptionsCallback()) - } + SentryAndroid.init(applicationContext, options.toAndroidSentryOptionsCallback()) } +internal lateinit var applicationContext: Context + private set + public actual typealias Context = Context + +/** + * A ContentProvider that does NOT store or provide any data for read or write operations. + * + * It's only purpose is to retrieve and store the application context in an internal top-level variable. + * The context is used for [SentryAndroid.init]. + * + *

This does not allow for overriding the abstract query, insert, update, and delete operations + * of the {@link ContentProvider}. + */ +internal class ContextProvider : ContentProvider() { + override fun onCreate(): Boolean { + val context = context + if (context != null) { + applicationContext = context.applicationContext + } else { + error("Context cannot be null") + } + return true + } + + override fun query( + uri: Uri, + projection: Array?, + selection: String?, + selectionArgs: Array?, + sortOrder: String? + ): Cursor? { + error("Not allowed.") + } + + override fun getType(uri: Uri): String? { + error("Not allowed.") + } + + override fun insert(uri: Uri, values: ContentValues?): Uri? { + error("Not allowed.") + } + + override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int { + error("Not allowed.") + } + + override fun update( + uri: Uri, + values: ContentValues?, + selection: String?, + selectionArgs: Array? + ): Int { + error("Not allowed.") + } +} diff --git a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryTest.kt b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryTest.kt index 47356110..dfa5b35d 100644 --- a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryTest.kt +++ b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryTest.kt @@ -1,15 +1,22 @@ package io.sentry.kotlin.multiplatform import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry import org.junit.runner.RunWith +import org.robolectric.Robolectric +import kotlin.test.BeforeTest @RunWith(AndroidJUnit4::class) actual abstract class BaseSentryTest { actual val platform: String = "Android" actual val authToken: String? = System.getenv("SENTRY_AUTH_TOKEN") actual fun sentryInit(optionsConfiguration: OptionsConfiguration) { - val context = InstrumentationRegistry.getInstrumentation().targetContext - Sentry.init(context, optionsConfiguration) + Sentry.init(optionsConfiguration) + } + + @BeforeTest + open fun setUp() { + // Set up the provider needed for Sentry.init on Android + val provider = Robolectric.buildContentProvider(ContextProvider::class.java) + provider.create() } } diff --git a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/ContextProviderTest.kt b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/ContextProviderTest.kt new file mode 100644 index 00000000..d242b796 --- /dev/null +++ b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/ContextProviderTest.kt @@ -0,0 +1,45 @@ +package io.sentry.kotlin.multiplatform + +import android.content.ContentValues +import android.net.Uri +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.mock + +@RunWith(AndroidJUnit4::class) +class ContextProviderTest : BaseSentryTest() { + private lateinit var provider: ContextProvider + + @Before + override fun setUp() { + provider = ContextProvider() + } + + @Test(expected = IllegalStateException::class) + fun `insert throws Exception`() { + val uri = mock(Uri::class.java) + val values = ContentValues() + provider.insert(uri, values) + } + + @Test(expected = IllegalStateException::class) + fun `update throws Exception`() { + val uri = mock(Uri::class.java) + val values = ContentValues() + provider.update(uri, values, null, null) + } + + @Test(expected = IllegalStateException::class) + fun `delete throws Exception`() { + val uri = mock(Uri::class.java) + provider.delete(uri, null, null) + } + + @Test(expected = IllegalStateException::class) + fun `getType throws Exception`() { + val uri = mock(Uri::class.java) + provider.getType(uri) + } +} diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.jvm.kt index e26dde05..585ae762 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.jvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.jvm.kt @@ -9,12 +9,12 @@ import io.sentry.kotlin.multiplatform.protocol.SentryId import io.sentry.kotlin.multiplatform.protocol.User import io.sentry.kotlin.multiplatform.protocol.UserFeedback -internal expect fun initSentry(context: Context? = null, configuration: OptionsConfiguration) +internal expect fun initSentry(configuration: OptionsConfiguration) internal actual object SentryBridge { actual fun init(context: Context, configuration: OptionsConfiguration) { - initSentry(context, configuration) + initSentry(configuration) } actual fun init(configuration: OptionsConfiguration) { diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt index 549ed698..56f6f39e 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryKMP.kt @@ -11,6 +11,7 @@ public typealias ScopeCallback = (Scope) -> Unit public typealias OptionsConfiguration = (SentryOptions) -> Unit /** The context used for Android initialization. */ +@Deprecated("No longer necessary to initialize Sentry on Android.") public expect abstract class Context /** Sentry Kotlin Multiplatform SDK API entry point. */ @@ -24,6 +25,10 @@ public object Sentry { */ @OptIn(ExperimentalObjCRefinement::class) @HiddenFromObjC + @Deprecated( + "Use init(OptionsConfiguration) instead.", + ReplaceWith("Sentry.init(configuration)") + ) public fun init(context: Context, configuration: OptionsConfiguration) { SentryBridge.init(context, configuration) } diff --git a/sentry-kotlin-multiplatform/src/jvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.jvm.kt b/sentry-kotlin-multiplatform/src/jvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.jvm.kt index 836d200e..547712f1 100644 --- a/sentry-kotlin-multiplatform/src/jvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.jvm.kt +++ b/sentry-kotlin-multiplatform/src/jvmMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.jvm.kt @@ -3,7 +3,7 @@ package io.sentry.kotlin.multiplatform import io.sentry.Sentry import io.sentry.kotlin.multiplatform.extensions.toJvmSentryOptionsCallback -internal actual fun initSentry(context: Context?, configuration: OptionsConfiguration) { +internal actual fun initSentry(configuration: OptionsConfiguration) { val options = SentryOptions() configuration.invoke(options) Sentry.init(options.toJvmSentryOptionsCallback()) diff --git a/sentry-samples/kmp-app-cocoapods/androidApp/src/main/java/sample/kmp/app/android/MainActivity.kt b/sentry-samples/kmp-app-cocoapods/androidApp/src/main/java/sample/kmp/app/android/MainActivity.kt index 1b693381..388efb17 100644 --- a/sentry-samples/kmp-app-cocoapods/androidApp/src/main/java/sample/kmp/app/android/MainActivity.kt +++ b/sentry-samples/kmp-app-cocoapods/androidApp/src/main/java/sample/kmp/app/android/MainActivity.kt @@ -42,7 +42,7 @@ class SentryApplication : Application() { super.onCreate() // Initialize Sentry using shared code - initializeSentry(this) + initializeSentry() // Shared scope across all platforms configureSentryScope() diff --git a/sentry-samples/kmp-app-cocoapods/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt b/sentry-samples/kmp-app-cocoapods/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt index 331f1017..ffdd4af6 100644 --- a/sentry-samples/kmp-app-cocoapods/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt +++ b/sentry-samples/kmp-app-cocoapods/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt @@ -1,7 +1,6 @@ package sample.kmp.app import io.sentry.kotlin.multiplatform.Attachment -import io.sentry.kotlin.multiplatform.Context import io.sentry.kotlin.multiplatform.HttpStatusCodeRange import io.sentry.kotlin.multiplatform.OptionsConfiguration import io.sentry.kotlin.multiplatform.Sentry @@ -24,15 +23,6 @@ fun configureSentryScope() { * Initializes Sentry with given options. * Make sure to hook this into your native platforms as early as possible */ -fun initializeSentry(context: Context) { - Sentry.init(context, optionsConfiguration()) -} - -/** - * Convenience initializer for Cocoa targets. - * Kotlin -> ObjC doesn't support default parameters (yet). - * Otherwise, you would need to do this: AppSetupKt.initializeSentry(context: nil) in Swift. - */ fun initializeSentry() { Sentry.init(optionsConfiguration()) } diff --git a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/MainApp.kt b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/MainApp.kt index 1d60baaa..05ad4a62 100644 --- a/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/MainApp.kt +++ b/sentry-samples/kmp-app-mvvm-di/androidApp/src/main/kotlin/sentry/kmp/demo/android/MainApp.kt @@ -4,14 +4,14 @@ import android.app.Application import android.content.Context import org.koin.dsl.module import sentry.kmp.demo.initKoin -import sentry.kmp.demo.sentry.initSentry +import sentry.kmp.demo.sentry.initializeSentry class MainApp : Application() { override fun onCreate() { super.onCreate() - initSentry(this) + initializeSentry() initKoin( module { diff --git a/sentry-samples/kmp-app-mvvm-di/iosApp/AppDelegate.swift b/sentry-samples/kmp-app-mvvm-di/iosApp/AppDelegate.swift index f863295a..cc0ba4c7 100644 --- a/sentry-samples/kmp-app-mvvm-di/iosApp/AppDelegate.swift +++ b/sentry-samples/kmp-app-mvvm-di/iosApp/AppDelegate.swift @@ -11,7 +11,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { startKoin() - SentrySetupKt.start() + SentrySetupKt.initializeSentry() let viewController = UIHostingController(rootView: HomeScreen()) diff --git a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/sentry/SentrySetup.kt b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/sentry/SentrySetup.kt index 920aa3a2..60f1f6e1 100644 --- a/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/sentry/SentrySetup.kt +++ b/sentry-samples/kmp-app-mvvm-di/shared/src/commonMain/kotlin/sentry.kmp.demo/sentry/SentrySetup.kt @@ -1,11 +1,8 @@ package sentry.kmp.demo.sentry import io.sentry.kotlin.multiplatform.Attachment -import io.sentry.kotlin.multiplatform.Context import io.sentry.kotlin.multiplatform.OptionsConfiguration import io.sentry.kotlin.multiplatform.Sentry -import kotlin.experimental.ExperimentalObjCRefinement -import kotlin.native.HiddenFromObjC /** Shared options configuration */ private val optionsConfiguration: OptionsConfiguration = { @@ -31,18 +28,7 @@ private val optionsConfiguration: OptionsConfiguration = { * Initializes Sentry with given options. * Make sure to hook this into your native platforms as early as possible */ -@OptIn(ExperimentalObjCRefinement::class) -@HiddenFromObjC -fun initSentry(context: Context) { - Sentry.init(context, optionsConfiguration) - configureSentryScope() -} - -/** - * Convenience initializer for Cocoa targets. - * Kotlin -> ObjC doesn't support default parameters (yet). - */ -fun start() { +fun initializeSentry() { Sentry.init(optionsConfiguration) configureSentryScope() } diff --git a/sentry-samples/kmp-app-spm/androidApp/src/main/java/sample/kmp/app/android/MainActivity.kt b/sentry-samples/kmp-app-spm/androidApp/src/main/java/sample/kmp/app/android/MainActivity.kt index 1b693381..388efb17 100644 --- a/sentry-samples/kmp-app-spm/androidApp/src/main/java/sample/kmp/app/android/MainActivity.kt +++ b/sentry-samples/kmp-app-spm/androidApp/src/main/java/sample/kmp/app/android/MainActivity.kt @@ -42,7 +42,7 @@ class SentryApplication : Application() { super.onCreate() // Initialize Sentry using shared code - initializeSentry(this) + initializeSentry() // Shared scope across all platforms configureSentryScope() diff --git a/sentry-samples/kmp-app-spm/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt b/sentry-samples/kmp-app-spm/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt index c094d11d..be7e6e27 100644 --- a/sentry-samples/kmp-app-spm/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt +++ b/sentry-samples/kmp-app-spm/shared/src/commonMain/kotlin/sample.kmp.app/SentrySetup.kt @@ -1,7 +1,6 @@ package sample.kmp.app import io.sentry.kotlin.multiplatform.Attachment -import io.sentry.kotlin.multiplatform.Context import io.sentry.kotlin.multiplatform.HttpStatusCodeRange import io.sentry.kotlin.multiplatform.OptionsConfiguration import io.sentry.kotlin.multiplatform.Sentry @@ -24,15 +23,6 @@ fun configureSentryScope() { * Initializes Sentry with given options. * Make sure to hook this into your native platforms as early as possible */ -fun initializeSentry(context: Context) { - Sentry.init(context, optionsConfiguration()) -} - -/** - * Convenience initializer for Cocoa targets. - * Kotlin -> ObjC doesn't support default parameters (yet). - * Otherwise, you would need to do this: AppSetupKt.initializeSentry(context: nil) in Swift. - */ fun initializeSentry() { Sentry.init(optionsConfiguration()) } From 1c1f12d856a73edc90d44abb1c41d3be3d0bd4b9 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Thu, 10 Aug 2023 16:28:06 +0200 Subject: [PATCH 2/9] Update comments --- .../io/sentry/kotlin/multiplatform/SentryInit.android.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt index c9b56da3..3b0ae91f 100644 --- a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt +++ b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt @@ -25,8 +25,8 @@ public actual typealias Context = Context * It's only purpose is to retrieve and store the application context in an internal top-level variable. * The context is used for [SentryAndroid.init]. * - *

This does not allow for overriding the abstract query, insert, update, and delete operations - * of the {@link ContentProvider}. + * This does not allow for overriding the abstract query, insert, update, and delete operations + * of the [ContentProvider]. */ internal class ContextProvider : ContentProvider() { override fun onCreate(): Boolean { From 62ac72d9531d5aaf1c9359f255d97cb4863bea69 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Thu, 10 Aug 2023 16:34:35 +0200 Subject: [PATCH 3/9] Update AndroidManifest.xml --- sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml b/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml index 86cae3ae..62c59689 100644 --- a/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml +++ b/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml @@ -12,7 +12,7 @@ From 29ea2c36e706d20ab655f00e4507c514814d93d6 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Thu, 10 Aug 2023 16:36:02 +0200 Subject: [PATCH 4/9] Update comments --- .../kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt index 3b0ae91f..aa16e606 100644 --- a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt +++ b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt @@ -22,7 +22,7 @@ public actual typealias Context = Context /** * A ContentProvider that does NOT store or provide any data for read or write operations. * - * It's only purpose is to retrieve and store the application context in an internal top-level variable. + * It's only purpose is to retrieve and store the application context in an internal top-level variable [applicationContext]. * The context is used for [SentryAndroid.init]. * * This does not allow for overriding the abstract query, insert, update, and delete operations From 6ea697b79b9bf486dc0ac309ca476508dd003d2d Mon Sep 17 00:00:00 2001 From: buenaflor Date: Thu, 10 Aug 2023 16:40:14 +0200 Subject: [PATCH 5/9] Update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 749a3f04..68ae979a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## Unreleased + +- Remove need for context in Sentry.init for Android ([#117](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/117)) + ## 0.2.1 ### Fixes From 48851127e0b9a6afff37dc24797f89916f240ed7 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Thu, 10 Aug 2023 16:45:36 +0200 Subject: [PATCH 6/9] Update comments --- .../io/sentry/kotlin/multiplatform/SentryInit.android.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt index aa16e606..07256ede 100644 --- a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt +++ b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt @@ -22,8 +22,8 @@ public actual typealias Context = Context /** * A ContentProvider that does NOT store or provide any data for read or write operations. * - * It's only purpose is to retrieve and store the application context in an internal top-level variable [applicationContext]. - * The context is used for [SentryAndroid.init]. + * It's only purpose is to retrieve and store the application context in an internal top-level + * variable [applicationContext]. The context is used for [SentryAndroid.init]. * * This does not allow for overriding the abstract query, insert, update, and delete operations * of the [ContentProvider]. From 6958cd6b2b122523490b59b31ff12bf0902506a2 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Mon, 14 Aug 2023 13:12:22 +0200 Subject: [PATCH 7/9] Improvements --- .../src/androidMain/AndroidManifest.xml | 4 ++-- .../multiplatform/SentryInit.android.kt | 2 +- .../kotlin/multiplatform/BaseSentryTest.kt | 2 +- ...erTest.kt => SentryContextProviderTest.kt} | 21 ++++++++++++++++--- 4 files changed, 22 insertions(+), 7 deletions(-) rename sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/{ContextProviderTest.kt => SentryContextProviderTest.kt} (63%) diff --git a/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml b/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml index 62c59689..f0aaedea 100644 --- a/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml +++ b/sentry-kotlin-multiplatform/src/androidMain/AndroidManifest.xml @@ -11,8 +11,8 @@ tools:node="remove"> diff --git a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt index 07256ede..da017c2c 100644 --- a/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt +++ b/sentry-kotlin-multiplatform/src/androidMain/kotlin/io/sentry/kotlin/multiplatform/SentryInit.android.kt @@ -28,7 +28,7 @@ public actual typealias Context = Context * This does not allow for overriding the abstract query, insert, update, and delete operations * of the [ContentProvider]. */ -internal class ContextProvider : ContentProvider() { +internal class SentryContextProvider : ContentProvider() { override fun onCreate(): Boolean { val context = context if (context != null) { diff --git a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryTest.kt b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryTest.kt index dfa5b35d..87a14629 100644 --- a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryTest.kt +++ b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/BaseSentryTest.kt @@ -16,7 +16,7 @@ actual abstract class BaseSentryTest { @BeforeTest open fun setUp() { // Set up the provider needed for Sentry.init on Android - val provider = Robolectric.buildContentProvider(ContextProvider::class.java) + val provider = Robolectric.buildContentProvider(SentryContextProvider::class.java) provider.create() } } diff --git a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/ContextProviderTest.kt b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt similarity index 63% rename from sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/ContextProviderTest.kt rename to sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt index d242b796..47b9c603 100644 --- a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/ContextProviderTest.kt +++ b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt @@ -9,12 +9,27 @@ import org.junit.runner.RunWith import org.mockito.Mockito.mock @RunWith(AndroidJUnit4::class) -class ContextProviderTest : BaseSentryTest() { - private lateinit var provider: ContextProvider +class SentryContextProviderTest : BaseSentryTest() { + private lateinit var provider: SentryContextProvider @Before override fun setUp() { - provider = ContextProvider() + provider = SentryContextProvider() + } + + // We create a nested class so this test is executed with the BeforeEach method that initializes + // the actual content provider and not just a mock. + class SentryContextOnCreateTest : BaseSentryTest() { + @Test + fun `onCreate initializes applicationContext`() { + // Simple call to the applicationContext to make sure it's initialized + applicationContext + } + } + + + fun `create does not throw Exception`() { + provider.onCreate() } @Test(expected = IllegalStateException::class) From 1add9f5a79c220030df86816625cf23623e8187e Mon Sep 17 00:00:00 2001 From: Sentry Github Bot Date: Mon, 14 Aug 2023 11:13:38 +0000 Subject: [PATCH 8/9] Format code --- .../io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt index 47b9c603..b7bcd4b5 100644 --- a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt +++ b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt @@ -27,7 +27,6 @@ class SentryContextProviderTest : BaseSentryTest() { } } - fun `create does not throw Exception`() { provider.onCreate() } From 61a646d95168a0c41b177d6826aaed13d5ff1737 Mon Sep 17 00:00:00 2001 From: buenaflor Date: Mon, 14 Aug 2023 14:48:59 +0200 Subject: [PATCH 9/9] Update comment --- .../io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt index b7bcd4b5..86f53329 100644 --- a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt +++ b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/SentryContextProviderTest.kt @@ -22,7 +22,7 @@ class SentryContextProviderTest : BaseSentryTest() { class SentryContextOnCreateTest : BaseSentryTest() { @Test fun `onCreate initializes applicationContext`() { - // Simple call to the applicationContext to make sure it's initialized + // Simple call to the lateinit applicationContext to make sure it's initialized applicationContext } }