From 2b0f3a80f2f7c00f8aefef4158d6930899324156 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 4 Apr 2025 03:11:05 +0200 Subject: [PATCH 01/25] Update --- .../kotlin/multiplatform/SentryBridge.apple.kt | 3 ++- .../kotlin/multiplatform/SentryBridgeTest.apple.kt | 14 ++++++++++++++ .../multiplatform/SentryBridgeTest.commonJvm.kt | 13 +++++++++++++ .../kotlin/multiplatform/SentryBridgeTest.kt | 1 + 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt index a954e90b..0570a20a 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt @@ -23,7 +23,7 @@ internal actual fun SentryPlatformOptions.prepareForInit() { val existingBeforeSend = cocoa?.beforeSend val modifiedBeforeSend: (CocoaSentryEvent?) -> CocoaSentryEvent? = beforeSend@{ event -> // Return early if the user's beforeSend returns null - if (existingBeforeSend?.invoke(event) == null) { + if (existingBeforeSend != null && existingBeforeSend.invoke(event) == null) { return@beforeSend null } @@ -37,6 +37,7 @@ internal actual fun SentryPlatformOptions.prepareForInit() { sdk["packages"] = packages event?.sdk = sdk + existingBeforeSend?.invoke(event) dropKotlinCrashEvent(event) } diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.apple.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.apple.kt index 104e39dc..1ccd3087 100644 --- a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.apple.kt @@ -84,11 +84,25 @@ actual class SentryBridgeTest { fixture.sentryInstance.lastConfiguration?.invoke(this) }.let { it as CocoaSentryOptions } + // THEN assert(option.beforeSend != null) assert(option.beforeSend!!.invoke(CocoaSentryEvent()) != null) } + @Test + actual fun `default beforeSend in init does not drop the event after prepareForInit`() { + fixture.sut.init { } + + val option = SentryPlatformOptions().apply { + fixture.sentryInstance.lastConfiguration?.invoke(this) + prepareForInit() + }.let { it as CocoaSentryOptions } + + assert(option.beforeSend != null) + assert(option.beforeSend!!.invoke(CocoaSentryEvent()) != null) + } + @Test actual fun `init sets the SDK packages`() { // GIVEN diff --git a/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.commonJvm.kt b/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.commonJvm.kt index da16380e..0d08dbbf 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.commonJvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.commonJvm.kt @@ -73,6 +73,19 @@ actual class SentryBridgeTest { assert(option.beforeSend!!.execute(JvmSentryEvent(), Hint()) != null) } + @Test + actual fun `default beforeSend in init does not drop the event after prepareForInit`() { + fixture.sut.init { } + + val option = SentryPlatformOptions().apply { + fixture.sentryInstance.lastConfiguration?.invoke(this) + prepareForInit() + }.let { it as JvmSentryOptions } + + assert(option.beforeSend != null) + assert(option.beforeSend!!.execute(JvmSentryEvent(), Hint()) != null) + } + @Test actual fun `init sets the SDK packages`() { // WHEN diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.kt index 76514aca..d44a8d2d 100644 --- a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.kt +++ b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.kt @@ -4,6 +4,7 @@ expect class SentryBridgeTest { fun `init sets correct configuration`() fun `setting null in beforeSend during init drops the event`() fun `default beforeSend in init does not drop the event`() + fun `default beforeSend in init does not drop the event after prepareForInit`() fun `init sets the SDK packages`() fun `init sets SDK version and name`() } From 36ab625a090828404a52c0e088b14f14d7e5c935 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Wed, 16 Apr 2025 16:52:39 +0200 Subject: [PATCH 02/25] Update SentryBridgeTest.apple.kt --- .../io/sentry/kotlin/multiplatform/SentryBridgeTest.apple.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.apple.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.apple.kt index 1ccd3087..c6b2ebff 100644 --- a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/SentryBridgeTest.apple.kt @@ -84,7 +84,6 @@ actual class SentryBridgeTest { fixture.sentryInstance.lastConfiguration?.invoke(this) }.let { it as CocoaSentryOptions } - // THEN assert(option.beforeSend != null) assert(option.beforeSend!!.invoke(CocoaSentryEvent()) != null) From 37405f6ea64fc8a6618e32ad5865dee6c3a9343c Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Apr 2025 00:22:04 +0200 Subject: [PATCH 03/25] Update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00653181..25eb418f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Fixes - Do not throw if exec operation fails ([#360](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/360)) +- `initWithPlatforms` not sending events if `beforeSend` is not set on iOS ([#366](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/366)) ### Miscellaneous From 4cb4c02bca6bc39234da8248bc5583d6e705290d Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Apr 2025 01:25:47 +0200 Subject: [PATCH 04/25] Update --- .../io/sentry/kotlin/multiplatform/SentryBridge.apple.kt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt index 0570a20a..ab28c06c 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt @@ -22,11 +22,6 @@ internal actual fun SentryPlatformOptions.prepareForInit() { val cocoa = this as? CocoaSentryOptions val existingBeforeSend = cocoa?.beforeSend val modifiedBeforeSend: (CocoaSentryEvent?) -> CocoaSentryEvent? = beforeSend@{ event -> - // Return early if the user's beforeSend returns null - if (existingBeforeSend != null && existingBeforeSend.invoke(event) == null) { - return@beforeSend null - } - val cocoaName = BuildKonfig.SENTRY_COCOA_PACKAGE_NAME val cocoaVersion = BuildKonfig.SENTRY_COCOA_VERSION @@ -37,7 +32,9 @@ internal actual fun SentryPlatformOptions.prepareForInit() { sdk["packages"] = packages event?.sdk = sdk - existingBeforeSend?.invoke(event) + if (existingBeforeSend?.invoke(event) == null) { + return@beforeSend null + } dropKotlinCrashEvent(event) } From cd56975d18146bfafa267e292d11925124211329 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Apr 2025 02:13:19 +0200 Subject: [PATCH 05/25] Update --- .../sentry_kotlin_multiplatform.podspec | 2 +- .../io/sentry/kotlin/multiplatform/SentryBridge.apple.kt | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/sentry-kotlin-multiplatform/sentry_kotlin_multiplatform.podspec b/sentry-kotlin-multiplatform/sentry_kotlin_multiplatform.podspec index a8d74eec..5ad3341d 100644 --- a/sentry-kotlin-multiplatform/sentry_kotlin_multiplatform.podspec +++ b/sentry-kotlin-multiplatform/sentry_kotlin_multiplatform.podspec @@ -54,4 +54,4 @@ Pod::Spec.new do |spec| } ] -end +end \ No newline at end of file diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt index ab28c06c..933ddae0 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryBridge.apple.kt @@ -20,8 +20,12 @@ public actual abstract class Context // like on JVM and Android, we may do that later on if needed. internal actual fun SentryPlatformOptions.prepareForInit() { val cocoa = this as? CocoaSentryOptions - val existingBeforeSend = cocoa?.beforeSend + val userDefinedBeforeSend = cocoa?.beforeSend val modifiedBeforeSend: (CocoaSentryEvent?) -> CocoaSentryEvent? = beforeSend@{ event -> + // Return early if the user's beforeSend returns null + if (userDefinedBeforeSend != null && userDefinedBeforeSend.invoke(event) == null) { + return@beforeSend null + } val cocoaName = BuildKonfig.SENTRY_COCOA_PACKAGE_NAME val cocoaVersion = BuildKonfig.SENTRY_COCOA_VERSION @@ -32,9 +36,6 @@ internal actual fun SentryPlatformOptions.prepareForInit() { sdk["packages"] = packages event?.sdk = sdk - if (existingBeforeSend?.invoke(event) == null) { - return@beforeSend null - } dropKotlinCrashEvent(event) } From 0a229ed0c9444725a541ceb637407549d550ce33 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Apr 2025 02:15:25 +0200 Subject: [PATCH 06/25] Podspec --- sentry-kotlin-multiplatform/sentry_kotlin_multiplatform.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/sentry_kotlin_multiplatform.podspec b/sentry-kotlin-multiplatform/sentry_kotlin_multiplatform.podspec index 5ad3341d..a8d74eec 100644 --- a/sentry-kotlin-multiplatform/sentry_kotlin_multiplatform.podspec +++ b/sentry-kotlin-multiplatform/sentry_kotlin_multiplatform.podspec @@ -54,4 +54,4 @@ Pod::Spec.new do |spec| } ] -end \ No newline at end of file +end From 2c6ba5f412be18610b856be0352fe0f9fdde868c Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Apr 2025 03:30:15 +0200 Subject: [PATCH 07/25] Fix syncing between kmp event and native event --- .../kotlin/multiplatform/SentryEvent.apple.kt | 2 +- .../extensions/SentryEventExtensions.apple.kt | 51 ++++++++++++++----- .../SentryOptionsExtensions.apple.kt | 16 ++++-- .../extensions/SentryEventExtensions.jvm.kt | 41 ++++++++++----- .../extensions/SentryOptionsExtensions.jvm.kt | 7 ++- .../multiplatform/util/ApplyIfChanged.kt | 5 ++ 6 files changed, 87 insertions(+), 35 deletions(-) create mode 100644 sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/util/ApplyIfChanged.kt diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt index 45c14ff9..fee60542 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt @@ -10,7 +10,7 @@ import io.sentry.kotlin.multiplatform.protocol.SentryException import io.sentry.kotlin.multiplatform.protocol.SentryId import io.sentry.kotlin.multiplatform.protocol.User -public actual class SentryEvent actual constructor() : SentryBaseEvent() { +public actual open class SentryEvent actual constructor() : SentryBaseEvent() { public actual var level: SentryLevel? = null public actual var message: Message? = null public actual var logger: String? = null diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt index 73e6d8f3..b1dbaa5c 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt @@ -3,20 +3,43 @@ package io.sentry.kotlin.multiplatform.extensions import cocoapods.Sentry.SentryId import io.sentry.kotlin.multiplatform.CocoaSentryEvent import io.sentry.kotlin.multiplatform.SentryEvent +import io.sentry.kotlin.multiplatform.util.applyIfChanged -internal fun CocoaSentryEvent.applyKmpEvent(kmpEvent: SentryEvent): CocoaSentryEvent { - kmpEvent.level?.let { level = it.toCocoaSentryLevel() } - kmpEvent.platform?.let { platform = it } - message = kmpEvent.message?.toCocoaMessage() - logger = kmpEvent.logger - fingerprint = kmpEvent.fingerprint - releaseName = kmpEvent.release - environment = kmpEvent.environment - user = kmpEvent.user?.toCocoaUser() - serverName = kmpEvent.serverName - dist = kmpEvent.dist - breadcrumbs = kmpEvent.breadcrumbs.map { it.toCocoaBreadcrumb() }.toMutableList() - tags = kmpEvent.tags.toMutableMap() - eventId = SentryId(kmpEvent.eventId.toString()) +/** + * Syncs updated fields from a KMP [SentryEvent] to this [CocoaSentryEvent]. + * + * Only the properties modified (e.g., in beforeSend or event processors) are copied. + * + * @param beforeKmpEvent The KMP [SentryEvent] before the changes were applied. + * @param afterKmpEvent The KMP [SentryEvent] after the changes were applied. + * @return The modified [CocoaSentryEvent]. + */ +internal fun CocoaSentryEvent.updateFromKmpEventChanges( + beforeKmpEvent: SentryEvent, + afterKmpEvent: SentryEvent +): CocoaSentryEvent { + applyIfChanged(beforeKmpEvent.release, afterKmpEvent.release) { releaseName = it } + applyIfChanged(beforeKmpEvent.dist, afterKmpEvent.dist) { dist = it } + applyIfChanged(beforeKmpEvent.environment, afterKmpEvent.environment) { environment = it } + applyIfChanged(beforeKmpEvent.serverName, afterKmpEvent.serverName) { serverName = it } + applyIfChanged(beforeKmpEvent.platform, afterKmpEvent.platform) { + if (it != null) { + platform = it + } + } + applyIfChanged(beforeKmpEvent.logger, afterKmpEvent.logger) { logger = it } + applyIfChanged(beforeKmpEvent.level, afterKmpEvent.level) { + if (it != null) level = it.toCocoaSentryLevel() + } + applyIfChanged(beforeKmpEvent.message, afterKmpEvent.message) { message = it?.toCocoaMessage() } + applyIfChanged(beforeKmpEvent.fingerprint, afterKmpEvent.fingerprint) { fingerprint = it } + applyIfChanged(beforeKmpEvent.user, afterKmpEvent.user) { user = it?.toCocoaUser() } + applyIfChanged(beforeKmpEvent.breadcrumbs, afterKmpEvent.breadcrumbs) { + breadcrumbs = it.map { it.toCocoaBreadcrumb() }.toMutableList() + } + applyIfChanged(beforeKmpEvent.eventId, afterKmpEvent.eventId) { + eventId = SentryId(it.toString()) + } + applyIfChanged(beforeKmpEvent.tags, afterKmpEvent.tags) { tags = it.toMutableMap() } return this } diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt index d7c488a0..616b2a3a 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt @@ -23,7 +23,9 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(kmpOptions: SentryOptions) kmpOptions.environment?.let { cocoaOptions.environment = it } - cocoaOptions.releaseName = kmpOptions.release + kmpOptions.release?.let{ + cocoaOptions.releaseName = it + } cocoaOptions.debug = kmpOptions.debug cocoaOptions.sessionTrackingIntervalMillis = kmpOptions.sessionTrackingIntervalMillis.convert() cocoaOptions.enableAutoSessionTracking = kmpOptions.enableAutoSessionTracking @@ -53,9 +55,15 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(kmpOptions: SentryOptions) if (kmpOptions.beforeSend == null) { event } else { - event?.let { SentryEvent(it) }?.let { unwrappedEvent -> - val result = kmpOptions.beforeSend?.invoke(unwrappedEvent) - result?.let { event.applyKmpEvent(it) } + event?.let { cocoaEvent -> + println("before release1: ${cocoaEvent.releaseName}") + val beforeKmpEvent = SentryEvent(cocoaEvent) + val beforeKmpEventCopy = SentryEvent(cocoaEvent) + kmpOptions.beforeSend + ?.invoke(beforeKmpEventCopy) + ?.let { afterEvent -> + cocoaEvent.updateFromKmpEventChanges(beforeKmpEvent, afterEvent) + } } } } diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt index ca228ced..3ea5edaf 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt @@ -3,20 +3,33 @@ package io.sentry.kotlin.multiplatform.extensions import io.sentry.kotlin.multiplatform.JvmSentryEvent import io.sentry.kotlin.multiplatform.JvmSentryId import io.sentry.kotlin.multiplatform.SentryEvent +import io.sentry.kotlin.multiplatform.util.applyIfChanged -internal fun JvmSentryEvent.applyKmpEvent(kmpEvent: SentryEvent): JvmSentryEvent { - level = kmpEvent.level?.toJvmSentryLevel() - message = kmpEvent.message?.toJvmMessage() - logger = kmpEvent.logger - fingerprints = kmpEvent.fingerprint - release = kmpEvent.release - environment = kmpEvent.environment - platform = kmpEvent.platform - user = kmpEvent.user?.toJvmUser() - serverName = kmpEvent.serverName - dist = kmpEvent.dist - breadcrumbs = kmpEvent.breadcrumbs?.map { it.toJvmBreadcrumb() } - eventId = JvmSentryId(kmpEvent.eventId.toString()) - tags = kmpEvent.tags +/** + * Syncs updated fields from a KMP [SentryEvent] to this [JvmSentryEvent]. + * + * Only the properties modified (e.g., in beforeSend or event processors) are copied. + * + * @param beforeKmpEvent The KMP [SentryEvent] before the changes were applied. + * @param afterKmpEvent The KMP [SentryEvent] after the changes were applied. + * @return The modified [JvmSentryEvent]. + */ +internal fun JvmSentryEvent.updateFromKmpEventChanges( + beforeKmpEvent: SentryEvent, + afterKmpEvent: SentryEvent +): JvmSentryEvent { + applyIfChanged(beforeKmpEvent.release, afterKmpEvent.release) { release = it } + applyIfChanged(beforeKmpEvent.dist, afterKmpEvent.dist) { dist = it } + applyIfChanged(beforeKmpEvent.environment, afterKmpEvent.environment) { environment = it } + applyIfChanged(beforeKmpEvent.serverName, afterKmpEvent.serverName) { serverName = it } + applyIfChanged(beforeKmpEvent.platform, afterKmpEvent.platform) { platform = it } + applyIfChanged(beforeKmpEvent.logger, afterKmpEvent.logger) { logger = it } + applyIfChanged(beforeKmpEvent.level, afterKmpEvent.level) { level = it?.toJvmSentryLevel() } + applyIfChanged(beforeKmpEvent.message, afterKmpEvent.message) { message = it?.toJvmMessage() } + applyIfChanged(beforeKmpEvent.fingerprint, afterKmpEvent.fingerprint) { fingerprints = it } + applyIfChanged(beforeKmpEvent.user, afterKmpEvent.user) { user = it?.toJvmUser() } + applyIfChanged(beforeKmpEvent.breadcrumbs, afterKmpEvent.breadcrumbs) { breadcrumbs = it.map { it.toJvmBreadcrumb() } } + applyIfChanged(beforeKmpEvent.eventId, afterKmpEvent.eventId) { eventId = JvmSentryId(it.toString()) } + applyIfChanged(beforeKmpEvent.tags, afterKmpEvent.tags) { tags = it } return this } diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt index 2f42adac..6843c457 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt @@ -43,9 +43,12 @@ internal fun JvmSentryOptions.applyJvmBaseOptions(kmpOptions: SentryOptions) { if (kmpOptions.beforeSend == null) { jvmSentryEvent } else { - kmpOptions.beforeSend?.invoke(SentryEvent(jvmSentryEvent))?.let { - jvmSentryEvent.applyKmpEvent(it) + val beforeKmpEvent = SentryEvent(jvmSentryEvent) + val beforeKmpEventCopy = SentryEvent(jvmSentryEvent) + kmpOptions.beforeSend?.invoke(beforeKmpEventCopy)?.let { afterKmpEvent -> + jvmSentryEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) } } } } + diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/util/ApplyIfChanged.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/util/ApplyIfChanged.kt new file mode 100644 index 00000000..5675dca3 --- /dev/null +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/util/ApplyIfChanged.kt @@ -0,0 +1,5 @@ +package io.sentry.kotlin.multiplatform.util + +internal inline fun applyIfChanged(old: T, new: T, applyNew: (T) -> Unit) { + if (old != new) applyNew(new) +} From ab925d37cb860013456e268c4725a9089ebe75a2 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Apr 2025 03:30:55 +0200 Subject: [PATCH 08/25] Revert open --- .../kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt index fee60542..45c14ff9 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt @@ -10,7 +10,7 @@ import io.sentry.kotlin.multiplatform.protocol.SentryException import io.sentry.kotlin.multiplatform.protocol.SentryId import io.sentry.kotlin.multiplatform.protocol.User -public actual open class SentryEvent actual constructor() : SentryBaseEvent() { +public actual class SentryEvent actual constructor() : SentryBaseEvent() { public actual var level: SentryLevel? = null public actual var message: Message? = null public actual var logger: String? = null From 423bd6bdf93b7ce56d8bc93584089c2163398f9a Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Apr 2025 03:31:52 +0200 Subject: [PATCH 09/25] Formatting --- .../kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt | 2 +- .../multiplatform/extensions/SentryOptionsExtensions.apple.kt | 2 +- .../multiplatform/extensions/SentryOptionsExtensions.jvm.kt | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt index 45c14ff9..b6c93b71 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt @@ -25,7 +25,7 @@ public actual class SentryEvent actual constructor() : SentryBaseEvent() { public constructor(cocoaSentryEvent: CocoaSentryEvent) : this() { eventId = SentryId(cocoaSentryEvent.eventId.toString()) - level = cocoaSentryEvent.level?.toKmpSentryLevel() + level = cocoaSentryEvent.level.toKmpSentryLevel() message = cocoaSentryEvent.message?.toKmpMessage() logger = cocoaSentryEvent.logger release = cocoaSentryEvent.releaseName diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt index 616b2a3a..0f7c846b 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt @@ -23,7 +23,7 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(kmpOptions: SentryOptions) kmpOptions.environment?.let { cocoaOptions.environment = it } - kmpOptions.release?.let{ + kmpOptions.release?.let { cocoaOptions.releaseName = it } cocoaOptions.debug = kmpOptions.debug diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt index 6843c457..85d460e1 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt @@ -51,4 +51,3 @@ internal fun JvmSentryOptions.applyJvmBaseOptions(kmpOptions: SentryOptions) { } } } - From 7fe3bd23daa9254bb9b04177605393a0d2a55191 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 17 Apr 2025 03:32:32 +0200 Subject: [PATCH 10/25] Remove print --- .../multiplatform/extensions/SentryOptionsExtensions.apple.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt index 0f7c846b..248b87cb 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt @@ -56,7 +56,6 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(kmpOptions: SentryOptions) event } else { event?.let { cocoaEvent -> - println("before release1: ${cocoaEvent.releaseName}") val beforeKmpEvent = SentryEvent(cocoaEvent) val beforeKmpEventCopy = SentryEvent(cocoaEvent) kmpOptions.beforeSend From 2bfdbb9bebb84b3ae10ca2fa08ee723f88af510a Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 24 Apr 2025 23:16:48 +0200 Subject: [PATCH 11/25] Update CHANGELOG --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index eed1e432..5b64a807 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Fixes + +- `beforeSend` overriding default values even if they were not set explicitly ([#376](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/376)) + ## 0.12.0 ### Feature From aa9d03403acb79f75403506cc598ddb11a010cf6 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 25 Apr 2025 00:03:35 +0200 Subject: [PATCH 12/25] Update --- .../UpdateFromKmpEventChangesTest.apple.kt | 122 ++++++++++++++++++ .../UpdateFromKmpEventChangesTest.jvm.kt | 121 +++++++++++++++++ .../BeforeSendIntegrationTest.kt | 4 + .../multiplatform/utils/ApplyIfChangedTest.kt | 25 ++++ 4 files changed, 272 insertions(+) create mode 100644 sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt create mode 100644 sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt create mode 100644 sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/utils/ApplyIfChangedTest.kt diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt new file mode 100644 index 00000000..002406bb --- /dev/null +++ b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt @@ -0,0 +1,122 @@ +package io.sentry.kotlin.multiplatform + +import io.sentry.kotlin.multiplatform.extensions.updateFromKmpEventChanges +import io.sentry.kotlin.multiplatform.protocol.Breadcrumb +import io.sentry.kotlin.multiplatform.protocol.Message +import io.sentry.kotlin.multiplatform.protocol.SentryId +import io.sentry.kotlin.multiplatform.protocol.User +import kotlinx.cinterop.convert +import kotlin.test.Test +import kotlin.test.assertEquals + +class UpdateFromKmpEventChangesTest { + @Test + fun `native value is untouched when before and after values are the same`() { + val cocoaEvent = CocoaSentryEvent().apply { + releaseName = "1.0" + dist = "1" + environment = "production" + serverName = "localhost" + platform = "java" + logger = "random logger" + level = 3.convert() + message = CocoaMessage().apply { + message = "My Message" + } + fingerprint = mutableListOf("custom-fingerprints") + user = CocoaUser().apply { + userId = "123" + } + breadcrumbs = mutableListOf( + CocoaBreadcrumb().apply { + message = "My Breadcrumb" + } + ) + eventId = CocoaSentryId("2bcc030ccc994de890e058cf5a0527d8") + } + val beforeKmpEvent = SentryEvent() + val afterKmpEvent = SentryEvent() + + val updatedCocoaEvent = cocoaEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) + + assertEquals("1.0", updatedCocoaEvent.releaseName) + assertEquals("1", updatedCocoaEvent.dist) + assertEquals("production", updatedCocoaEvent.environment) + assertEquals("localhost", updatedCocoaEvent.serverName) + assertEquals("java", updatedCocoaEvent.platform) + assertEquals("random logger", updatedCocoaEvent.logger) + assertEquals(3.convert(), updatedCocoaEvent.level) + assertEquals("My Message", updatedCocoaEvent.message!!.message) + assertEquals(1, updatedCocoaEvent.fingerprint!!.size) + assertEquals("custom-fingerprints", updatedCocoaEvent.fingerprint!!.first()) + assertEquals("123", updatedCocoaEvent.user!!.userId) + assertEquals(1, updatedCocoaEvent.breadcrumbs!!.size) + assertEquals("My Breadcrumb", (updatedCocoaEvent.breadcrumbs!!.first() as CocoaBreadcrumb).message) + assertEquals(CocoaSentryId("2bcc030ccc994de890e058cf5a0527d8"), updatedCocoaEvent.eventId) + } + + @Test + fun `native value is updated when before and after values are different`() { + val cocoaEvent = CocoaSentryEvent().apply { + releaseName = "1.0" + dist = "1" + environment = "production" + serverName = "localhost" + platform = "java" + logger = "random logger" + level = 1.convert() + message = CocoaMessage().apply { + message = "My Message" + } + fingerprint = mutableListOf("custom-fingerprints") + user = CocoaUser().apply { + userId = "123" + } + breadcrumbs = mutableListOf( + CocoaBreadcrumb().apply { + message = "My Breadcrumb" + } + ) + eventId = CocoaSentryId("2bcc030ccc994de890e058cf5a0527d8") + } + val beforeKmpEvent = SentryEvent(cocoaEvent) + val afterKmpEvent = SentryEvent(cocoaEvent).apply { + release = "2.0" + dist = "123" + environment = "staging" + serverName = "www" + platform = "kotlin" + logger = "kmp logger" + level = SentryLevel.DEBUG + message = Message().apply { + message = "Another Message" + } + fingerprint = mutableListOf("another-fingerprints") + user = User().apply { + id = "1234" + } + breadcrumbs = mutableListOf( + Breadcrumb().apply { + message = "My Breadcrumb" + } + ) + eventId = SentryId("8bcc030ccc994de890e058cf5a0527d9") + } + + val updatedCocoaEvent = cocoaEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) + + assertEquals("2.0", updatedCocoaEvent.releaseName) + assertEquals("staging", updatedCocoaEvent.environment) + assertEquals("www", updatedCocoaEvent.serverName) + assertEquals("kotlin", updatedCocoaEvent.platform) + assertEquals("kmp logger", updatedCocoaEvent.logger) + assertEquals(0.convert(), updatedCocoaEvent.level) + assertEquals("Another Message", updatedCocoaEvent.message?.message) + assertEquals(1, updatedCocoaEvent.fingerprint!!.size) + assertEquals("another-fingerprints", updatedCocoaEvent.fingerprint!!.first()) + assertEquals("1234", updatedCocoaEvent.user?.userId) + assertEquals(1, updatedCocoaEvent.breadcrumbs?.size) + assertEquals("My Breadcrumb", (updatedCocoaEvent.breadcrumbs?.first() as CocoaBreadcrumb).message) + assertEquals(SentryId("8bcc030ccc994de890e058cf5a0527d9").toString(), updatedCocoaEvent.eventId.toString()) + } +} diff --git a/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt new file mode 100644 index 00000000..844fc716 --- /dev/null +++ b/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt @@ -0,0 +1,121 @@ +package io.sentry.kotlin.multiplatform + +import io.sentry.kotlin.multiplatform.extensions.updateFromKmpEventChanges +import io.sentry.kotlin.multiplatform.protocol.Breadcrumb +import io.sentry.kotlin.multiplatform.protocol.Message +import io.sentry.kotlin.multiplatform.protocol.SentryId +import io.sentry.kotlin.multiplatform.protocol.User +import kotlin.test.Test +import kotlin.test.assertEquals + +class UpdateFromKmpEventChangesTest { + @Test + fun `native value is untouched when before and after values are the same`() { + val jvmEvent = JvmSentryEvent().apply { + release = "1.0" + dist = "1" + environment = "production" + serverName = "localhost" + platform = "java" + logger = "random logger" + level = JvmSentryLevel.FATAL + message = JvmMessage().apply { + message = "My Message" + } + fingerprints = mutableListOf("custom-fingerprints") + user = io.sentry.protocol.User().apply { + id = "123" + } + breadcrumbs = mutableListOf( + JvmBreadcrumb().apply { + message = "My Breadcrumb" + } + ) + eventId = JvmSentryId("2bcc030ccc994de890e058cf5a0527d8") + } + val beforeKmpEvent = SentryEvent() + val afterKmpEvent = SentryEvent() + + val updatedJvmEvent = jvmEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) + + assertEquals("1.0", updatedJvmEvent.release) + assertEquals("1", updatedJvmEvent.dist) + assertEquals("production", updatedJvmEvent.environment) + assertEquals("localhost", updatedJvmEvent.serverName) + assertEquals("java", updatedJvmEvent.platform) + assertEquals("random logger", updatedJvmEvent.logger) + assertEquals(JvmSentryLevel.FATAL, updatedJvmEvent.level) + assertEquals("My Message", updatedJvmEvent.message!!.message) + assertEquals(1, updatedJvmEvent.fingerprints!!.size) + assertEquals("custom-fingerprints", updatedJvmEvent.fingerprints!!.first()) + assertEquals("123", updatedJvmEvent.user!!.id) + assertEquals(1, updatedJvmEvent.breadcrumbs!!.size) + assertEquals("My Breadcrumb", updatedJvmEvent.breadcrumbs!!.first().message) + assertEquals(JvmSentryId("2bcc030ccc994de890e058cf5a0527d8"), updatedJvmEvent.eventId) + } + + @Test + fun `native value is updated when before and after values are different`() { + val jvmEvent = JvmSentryEvent().apply { + release = "1.0" + dist = "1" + environment = "production" + serverName = "localhost" + platform = "java" + logger = "random logger" + level = JvmSentryLevel.FATAL + message = JvmMessage().apply { + message = "My Message" + } + fingerprints = mutableListOf("custom-fingerprints") + user = io.sentry.protocol.User().apply { + id = "123" + } + breadcrumbs = mutableListOf( + JvmBreadcrumb().apply { + message = "My Breadcrumb" + } + ) + eventId = JvmSentryId("2bcc030ccc994de890e058cf5a0527d8") + } + val beforeKmpEvent = SentryEvent(jvmEvent) + val afterKmpEvent = SentryEvent(jvmEvent).apply { + release = "2.0" + dist = "123" + environment = "staging" + serverName = "www" + platform = "kotlin" + logger = "kmp logger" + level = SentryLevel.DEBUG + message = Message().apply { + message = "Another Message" + } + fingerprint = mutableListOf("another-fingerprints") + user = User().apply { + id = "123" + } + breadcrumbs = mutableListOf( + Breadcrumb().apply { + message = "My Breadcrumb" + } + ) + eventId = SentryId("8bcc030ccc994de890e058cf5a0527d9") + } + + val updatedJvmEvent = jvmEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) + + assertEquals("2.0", updatedJvmEvent.release) + assertEquals("staging", updatedJvmEvent.environment) + assertEquals("www", updatedJvmEvent.serverName) + assertEquals("kotlin", updatedJvmEvent.platform) + assertEquals("kmp logger", updatedJvmEvent.logger) + assertEquals(JvmSentryLevel.DEBUG, updatedJvmEvent.level) + assertEquals("Another Message", updatedJvmEvent.message?.message) + assertEquals(1, updatedJvmEvent.fingerprints!!.size) + assertEquals("another-fingerprints", updatedJvmEvent.fingerprints!!.first()) + assertEquals("123", updatedJvmEvent.user?.id) + assertEquals(1, updatedJvmEvent.breadcrumbs?.size) + assertEquals("My Breadcrumb", updatedJvmEvent.breadcrumbs?.first()?.message) + assertEquals(SentryId("8bcc030ccc994de890e058cf5a0527d9").toString(), updatedJvmEvent.eventId.toString()) + } +} diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/BeforeSendIntegrationTest.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/BeforeSendIntegrationTest.kt index b143d8df..c864a72d 100644 --- a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/BeforeSendIntegrationTest.kt +++ b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/BeforeSendIntegrationTest.kt @@ -215,6 +215,7 @@ class BeforeSendIntegrationTest { fun `event release is not modified if KMP beforeSend callback config is not modified`() { val originalEvent = sentryEventConfigurator.originalEvent val event = sentryEventConfigurator.applyOptions { + it.release = "1.0.0" it.dsn = fakeDsn } assertNotNull(event) @@ -236,6 +237,9 @@ class BeforeSendIntegrationTest { val originalEvent = sentryEventConfigurator.originalEvent val event = sentryEventConfigurator.applyOptions { it.dsn = fakeDsn + it.beforeSend = { event -> + event + } } assertNotNull(event) assertEquals(originalEvent.serverName, event.serverName) diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/utils/ApplyIfChangedTest.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/utils/ApplyIfChangedTest.kt new file mode 100644 index 00000000..2f174ab0 --- /dev/null +++ b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/utils/ApplyIfChangedTest.kt @@ -0,0 +1,25 @@ +package io.sentry.kotlin.multiplatform.utils + +import io.sentry.kotlin.multiplatform.util.applyIfChanged +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.fail + +class ApplyIfChangedTest { + @Test + fun `applyIfChanged applies change if value changed`() { + var value = "old value" + applyIfChanged(value, "new value") { + value = it + } + assertEquals("new value", value) + } + + @Test + fun `applyIfChanged does not apply change if value did not change`() { + applyIfChanged("same value", "same value") { + // This block should not be executed + fail("Change was applied even though the value did not change") + } + } +} From 4b0646fffa12a094fc476c5ee154f9c06de1fea2 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 25 Apr 2025 00:06:05 +0200 Subject: [PATCH 13/25] Update --- .../UpdateFromKmpEventChangesTest.apple.kt | 6 +++--- .../UpdateFromKmpEventChangesTest.jvm.kt | 6 +++--- .../UpdateFromKmpEventChangesTest.kt | 15 +++++++++++++++ 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt index 002406bb..c13a6834 100644 --- a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt @@ -9,9 +9,9 @@ import kotlinx.cinterop.convert import kotlin.test.Test import kotlin.test.assertEquals -class UpdateFromKmpEventChangesTest { +actual class UpdateFromKmpEventChangesTest { @Test - fun `native value is untouched when before and after values are the same`() { + actual fun `native value is untouched when before and after values are the same`() { val cocoaEvent = CocoaSentryEvent().apply { releaseName = "1.0" dist = "1" @@ -56,7 +56,7 @@ class UpdateFromKmpEventChangesTest { } @Test - fun `native value is updated when before and after values are different`() { + actual fun `native value is updated when before and after values are different`() { val cocoaEvent = CocoaSentryEvent().apply { releaseName = "1.0" dist = "1" diff --git a/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt index 844fc716..41ac59ef 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt @@ -8,9 +8,9 @@ import io.sentry.kotlin.multiplatform.protocol.User import kotlin.test.Test import kotlin.test.assertEquals -class UpdateFromKmpEventChangesTest { +actual class UpdateFromKmpEventChangesTest { @Test - fun `native value is untouched when before and after values are the same`() { + actual fun `native value is untouched when before and after values are the same`() { val jvmEvent = JvmSentryEvent().apply { release = "1.0" dist = "1" @@ -55,7 +55,7 @@ class UpdateFromKmpEventChangesTest { } @Test - fun `native value is updated when before and after values are different`() { + actual fun `native value is updated when before and after values are different`() { val jvmEvent = JvmSentryEvent().apply { release = "1.0" dist = "1" diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt new file mode 100644 index 00000000..d54b3051 --- /dev/null +++ b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt @@ -0,0 +1,15 @@ +package io.sentry.kotlin.multiplatform + +import io.sentry.kotlin.multiplatform.extensions.updateFromKmpEventChanges +import io.sentry.kotlin.multiplatform.protocol.Breadcrumb +import io.sentry.kotlin.multiplatform.protocol.Message +import io.sentry.kotlin.multiplatform.protocol.SentryId +import io.sentry.kotlin.multiplatform.protocol.User +import kotlinx.cinterop.convert +import kotlin.test.Test +import kotlin.test.assertEquals + +expect class UpdateFromKmpEventChangesTest { + fun `native value is untouched when before and after values are the same`() + fun `native value is updated when before and after values are different` +} From 5e8aeac3cd28648094e2e080467091ff2cc2e466 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 25 Apr 2025 00:06:21 +0200 Subject: [PATCH 14/25] Update --- .../kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt index d54b3051..0f17c6db 100644 --- a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt +++ b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt @@ -11,5 +11,5 @@ import kotlin.test.assertEquals expect class UpdateFromKmpEventChangesTest { fun `native value is untouched when before and after values are the same`() - fun `native value is updated when before and after values are different` + fun `native value is updated when before and after values are different`() } From 5091311b5b8be2bee25deef726c5cff98d1e296a Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 25 Apr 2025 00:09:31 +0200 Subject: [PATCH 15/25] Update --- .../multiplatform/extensions/SentryOptionsExtensions.apple.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt index 95d0b433..a71ddef3 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt @@ -61,8 +61,8 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(kmpOptions: SentryOptions) val beforeKmpEventCopy = SentryEvent(cocoaEvent) kmpOptions.beforeSend ?.invoke(beforeKmpEventCopy) - ?.let { afterEvent -> - cocoaEvent.updateFromKmpEventChanges(beforeKmpEvent, afterEvent) + ?.let { afterKmpEvent -> + cocoaEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) } } } From de816fd087421721ea768384740142ff1918f44c Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 2 May 2025 12:46:28 +0200 Subject: [PATCH 16/25] Update --- .../multiplatform/PlatformOptions.android.kt | 3 - .../kotlin/multiplatform/SentryEvent.apple.kt | 2 +- .../extensions/SentryEventExtensions.apple.kt | 54 +++----- .../SentryOptionsExtensions.apple.kt | 16 +-- .../kotlin/multiplatform/ApplyKmpEventTest.kt | 28 ++++ .../multiplatform/PlatformOptions.apple.kt | 3 - .../UpdateFromKmpEventChangesTest.apple.kt | 122 ------------------ .../extensions/SentryEventExtensions.jvm.kt | 47 +++---- .../extensions/SentryOptionsExtensions.jvm.kt | 7 +- .../UpdateFromKmpEventChangesTest.jvm.kt | 121 ----------------- .../kotlin/multiplatform/SentryOptions.kt | 13 -- .../BeforeSendIntegrationTest.kt | 4 - .../kotlin/multiplatform/PlatformOptions.kt | 1 - .../kotlin/multiplatform/SentryOptionsTest.kt | 2 - .../UpdateFromKmpEventChangesTest.kt | 15 --- .../multiplatform/PlatformOptions.jvm.kt | 3 - 16 files changed, 73 insertions(+), 368 deletions(-) create mode 100644 sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt delete mode 100644 sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt delete mode 100644 sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt delete mode 100644 sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt diff --git a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt index 76e6cc57..02a7e439 100644 --- a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt +++ b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt @@ -73,9 +73,6 @@ class SentryAndroidOptionsWrapper(private val androidOptions: SentryAndroidOptio override val sessionReplay: AndroidSentryReplayOptions get() = androidOptions.sessionReplay - override val sendDefaultPii: Boolean - get() = androidOptions.isSendDefaultPii - override fun applyFromOptions(options: SentryOptions) { options.toAndroidSentryOptionsCallback().invoke(androidOptions) } diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt index b6c93b71..45c14ff9 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/SentryEvent.apple.kt @@ -25,7 +25,7 @@ public actual class SentryEvent actual constructor() : SentryBaseEvent() { public constructor(cocoaSentryEvent: CocoaSentryEvent) : this() { eventId = SentryId(cocoaSentryEvent.eventId.toString()) - level = cocoaSentryEvent.level.toKmpSentryLevel() + level = cocoaSentryEvent.level?.toKmpSentryLevel() message = cocoaSentryEvent.message?.toKmpMessage() logger = cocoaSentryEvent.logger release = cocoaSentryEvent.releaseName diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt index b1dbaa5c..159df88f 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt @@ -3,43 +3,25 @@ package io.sentry.kotlin.multiplatform.extensions import cocoapods.Sentry.SentryId import io.sentry.kotlin.multiplatform.CocoaSentryEvent import io.sentry.kotlin.multiplatform.SentryEvent -import io.sentry.kotlin.multiplatform.util.applyIfChanged -/** - * Syncs updated fields from a KMP [SentryEvent] to this [CocoaSentryEvent]. - * - * Only the properties modified (e.g., in beforeSend or event processors) are copied. - * - * @param beforeKmpEvent The KMP [SentryEvent] before the changes were applied. - * @param afterKmpEvent The KMP [SentryEvent] after the changes were applied. - * @return The modified [CocoaSentryEvent]. - */ -internal fun CocoaSentryEvent.updateFromKmpEventChanges( - beforeKmpEvent: SentryEvent, - afterKmpEvent: SentryEvent -): CocoaSentryEvent { - applyIfChanged(beforeKmpEvent.release, afterKmpEvent.release) { releaseName = it } - applyIfChanged(beforeKmpEvent.dist, afterKmpEvent.dist) { dist = it } - applyIfChanged(beforeKmpEvent.environment, afterKmpEvent.environment) { environment = it } - applyIfChanged(beforeKmpEvent.serverName, afterKmpEvent.serverName) { serverName = it } - applyIfChanged(beforeKmpEvent.platform, afterKmpEvent.platform) { - if (it != null) { - platform = it - } +internal fun CocoaSentryEvent.applyKmpEvent(kmpEvent: SentryEvent): CocoaSentryEvent { + // Native SDKs may have a default behaviour if no release is set. + // Setting a release (even if it's null) will remove this behaviour, + // so we have to check if the values differ first before setting. + if (releaseName != kmpEvent.release) { + releaseName = kmpEvent.release } - applyIfChanged(beforeKmpEvent.logger, afterKmpEvent.logger) { logger = it } - applyIfChanged(beforeKmpEvent.level, afterKmpEvent.level) { - if (it != null) level = it.toCocoaSentryLevel() - } - applyIfChanged(beforeKmpEvent.message, afterKmpEvent.message) { message = it?.toCocoaMessage() } - applyIfChanged(beforeKmpEvent.fingerprint, afterKmpEvent.fingerprint) { fingerprint = it } - applyIfChanged(beforeKmpEvent.user, afterKmpEvent.user) { user = it?.toCocoaUser() } - applyIfChanged(beforeKmpEvent.breadcrumbs, afterKmpEvent.breadcrumbs) { - breadcrumbs = it.map { it.toCocoaBreadcrumb() }.toMutableList() - } - applyIfChanged(beforeKmpEvent.eventId, afterKmpEvent.eventId) { - eventId = SentryId(it.toString()) - } - applyIfChanged(beforeKmpEvent.tags, afterKmpEvent.tags) { tags = it.toMutableMap() } + kmpEvent.level?.let { level = it.toCocoaSentryLevel() } + kmpEvent.platform?.let { platform = it } + message = kmpEvent.message?.toCocoaMessage() + logger = kmpEvent.logger + fingerprint = kmpEvent.fingerprint + environment = kmpEvent.environment + user = kmpEvent.user?.toCocoaUser() + serverName = kmpEvent.serverName + dist = kmpEvent.dist + breadcrumbs = kmpEvent.breadcrumbs.map { it.toCocoaBreadcrumb() }.toMutableList() + tags = kmpEvent.tags.toMutableMap() + eventId = SentryId(kmpEvent.eventId.toString()) return this } diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt index a71ddef3..d7c488a0 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt @@ -23,10 +23,7 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(kmpOptions: SentryOptions) kmpOptions.environment?.let { cocoaOptions.environment = it } - kmpOptions.release?.let { - cocoaOptions.releaseName = it - } - cocoaOptions.sendDefaultPii = kmpOptions.sendDefaultPii + cocoaOptions.releaseName = kmpOptions.release cocoaOptions.debug = kmpOptions.debug cocoaOptions.sessionTrackingIntervalMillis = kmpOptions.sessionTrackingIntervalMillis.convert() cocoaOptions.enableAutoSessionTracking = kmpOptions.enableAutoSessionTracking @@ -56,14 +53,9 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(kmpOptions: SentryOptions) if (kmpOptions.beforeSend == null) { event } else { - event?.let { cocoaEvent -> - val beforeKmpEvent = SentryEvent(cocoaEvent) - val beforeKmpEventCopy = SentryEvent(cocoaEvent) - kmpOptions.beforeSend - ?.invoke(beforeKmpEventCopy) - ?.let { afterKmpEvent -> - cocoaEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) - } + event?.let { SentryEvent(it) }?.let { unwrappedEvent -> + val result = kmpOptions.beforeSend?.invoke(unwrappedEvent) + result?.let { event.applyKmpEvent(it) } } } } diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt new file mode 100644 index 00000000..ba1aa80e --- /dev/null +++ b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt @@ -0,0 +1,28 @@ +package io.sentry.kotlin.multiplatform + +import io.sentry.kotlin.multiplatform.extensions.applyKmpEvent +import kotlin.test.Test +import kotlin.test.assertFalse + +class ApplyKmpEventTest { + @Test + fun `native release is not set if kmp release has same value`() { + val nativeEvent = FakeSentryEvent() + val kmpEvent = SentryEvent() + + nativeEvent.applyKmpEvent(kmpEvent) + + assertFalse(nativeEvent.wasReleaseSet) + } +} + +// init with a SentryLevel as a workaround for: +// Unable to call non-designated initializer as super constructor +private class FakeSentryEvent : CocoaSentryEvent(Internal.Sentry.kSentryLevelFatal) { + var wasReleaseSet = false + + override fun setReleaseName(releaseName: String?) { + super.setReleaseName(releaseName) + wasReleaseSet = true + } +} \ No newline at end of file diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.apple.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.apple.kt index 47bcd12f..5c9891d7 100644 --- a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.apple.kt @@ -54,9 +54,6 @@ open class SentryAppleOptionsWrapper(private val cocoaOptions: CocoaSentryOption override val diagnosticLevel: SentryLevel get() = cocoaOptions.diagnosticLevel.toKmpSentryLevel()!! - override val sendDefaultPii: Boolean - get() = cocoaOptions.sendDefaultPii - override fun applyFromOptions(options: SentryOptions) { options.toCocoaOptionsConfiguration().invoke(cocoaOptions) } diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt deleted file mode 100644 index c13a6834..00000000 --- a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.apple.kt +++ /dev/null @@ -1,122 +0,0 @@ -package io.sentry.kotlin.multiplatform - -import io.sentry.kotlin.multiplatform.extensions.updateFromKmpEventChanges -import io.sentry.kotlin.multiplatform.protocol.Breadcrumb -import io.sentry.kotlin.multiplatform.protocol.Message -import io.sentry.kotlin.multiplatform.protocol.SentryId -import io.sentry.kotlin.multiplatform.protocol.User -import kotlinx.cinterop.convert -import kotlin.test.Test -import kotlin.test.assertEquals - -actual class UpdateFromKmpEventChangesTest { - @Test - actual fun `native value is untouched when before and after values are the same`() { - val cocoaEvent = CocoaSentryEvent().apply { - releaseName = "1.0" - dist = "1" - environment = "production" - serverName = "localhost" - platform = "java" - logger = "random logger" - level = 3.convert() - message = CocoaMessage().apply { - message = "My Message" - } - fingerprint = mutableListOf("custom-fingerprints") - user = CocoaUser().apply { - userId = "123" - } - breadcrumbs = mutableListOf( - CocoaBreadcrumb().apply { - message = "My Breadcrumb" - } - ) - eventId = CocoaSentryId("2bcc030ccc994de890e058cf5a0527d8") - } - val beforeKmpEvent = SentryEvent() - val afterKmpEvent = SentryEvent() - - val updatedCocoaEvent = cocoaEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) - - assertEquals("1.0", updatedCocoaEvent.releaseName) - assertEquals("1", updatedCocoaEvent.dist) - assertEquals("production", updatedCocoaEvent.environment) - assertEquals("localhost", updatedCocoaEvent.serverName) - assertEquals("java", updatedCocoaEvent.platform) - assertEquals("random logger", updatedCocoaEvent.logger) - assertEquals(3.convert(), updatedCocoaEvent.level) - assertEquals("My Message", updatedCocoaEvent.message!!.message) - assertEquals(1, updatedCocoaEvent.fingerprint!!.size) - assertEquals("custom-fingerprints", updatedCocoaEvent.fingerprint!!.first()) - assertEquals("123", updatedCocoaEvent.user!!.userId) - assertEquals(1, updatedCocoaEvent.breadcrumbs!!.size) - assertEquals("My Breadcrumb", (updatedCocoaEvent.breadcrumbs!!.first() as CocoaBreadcrumb).message) - assertEquals(CocoaSentryId("2bcc030ccc994de890e058cf5a0527d8"), updatedCocoaEvent.eventId) - } - - @Test - actual fun `native value is updated when before and after values are different`() { - val cocoaEvent = CocoaSentryEvent().apply { - releaseName = "1.0" - dist = "1" - environment = "production" - serverName = "localhost" - platform = "java" - logger = "random logger" - level = 1.convert() - message = CocoaMessage().apply { - message = "My Message" - } - fingerprint = mutableListOf("custom-fingerprints") - user = CocoaUser().apply { - userId = "123" - } - breadcrumbs = mutableListOf( - CocoaBreadcrumb().apply { - message = "My Breadcrumb" - } - ) - eventId = CocoaSentryId("2bcc030ccc994de890e058cf5a0527d8") - } - val beforeKmpEvent = SentryEvent(cocoaEvent) - val afterKmpEvent = SentryEvent(cocoaEvent).apply { - release = "2.0" - dist = "123" - environment = "staging" - serverName = "www" - platform = "kotlin" - logger = "kmp logger" - level = SentryLevel.DEBUG - message = Message().apply { - message = "Another Message" - } - fingerprint = mutableListOf("another-fingerprints") - user = User().apply { - id = "1234" - } - breadcrumbs = mutableListOf( - Breadcrumb().apply { - message = "My Breadcrumb" - } - ) - eventId = SentryId("8bcc030ccc994de890e058cf5a0527d9") - } - - val updatedCocoaEvent = cocoaEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) - - assertEquals("2.0", updatedCocoaEvent.releaseName) - assertEquals("staging", updatedCocoaEvent.environment) - assertEquals("www", updatedCocoaEvent.serverName) - assertEquals("kotlin", updatedCocoaEvent.platform) - assertEquals("kmp logger", updatedCocoaEvent.logger) - assertEquals(0.convert(), updatedCocoaEvent.level) - assertEquals("Another Message", updatedCocoaEvent.message?.message) - assertEquals(1, updatedCocoaEvent.fingerprint!!.size) - assertEquals("another-fingerprints", updatedCocoaEvent.fingerprint!!.first()) - assertEquals("1234", updatedCocoaEvent.user?.userId) - assertEquals(1, updatedCocoaEvent.breadcrumbs?.size) - assertEquals("My Breadcrumb", (updatedCocoaEvent.breadcrumbs?.first() as CocoaBreadcrumb).message) - assertEquals(SentryId("8bcc030ccc994de890e058cf5a0527d9").toString(), updatedCocoaEvent.eventId.toString()) - } -} diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt index 3ea5edaf..bdca879f 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt @@ -3,33 +3,26 @@ package io.sentry.kotlin.multiplatform.extensions import io.sentry.kotlin.multiplatform.JvmSentryEvent import io.sentry.kotlin.multiplatform.JvmSentryId import io.sentry.kotlin.multiplatform.SentryEvent -import io.sentry.kotlin.multiplatform.util.applyIfChanged -/** - * Syncs updated fields from a KMP [SentryEvent] to this [JvmSentryEvent]. - * - * Only the properties modified (e.g., in beforeSend or event processors) are copied. - * - * @param beforeKmpEvent The KMP [SentryEvent] before the changes were applied. - * @param afterKmpEvent The KMP [SentryEvent] after the changes were applied. - * @return The modified [JvmSentryEvent]. - */ -internal fun JvmSentryEvent.updateFromKmpEventChanges( - beforeKmpEvent: SentryEvent, - afterKmpEvent: SentryEvent -): JvmSentryEvent { - applyIfChanged(beforeKmpEvent.release, afterKmpEvent.release) { release = it } - applyIfChanged(beforeKmpEvent.dist, afterKmpEvent.dist) { dist = it } - applyIfChanged(beforeKmpEvent.environment, afterKmpEvent.environment) { environment = it } - applyIfChanged(beforeKmpEvent.serverName, afterKmpEvent.serverName) { serverName = it } - applyIfChanged(beforeKmpEvent.platform, afterKmpEvent.platform) { platform = it } - applyIfChanged(beforeKmpEvent.logger, afterKmpEvent.logger) { logger = it } - applyIfChanged(beforeKmpEvent.level, afterKmpEvent.level) { level = it?.toJvmSentryLevel() } - applyIfChanged(beforeKmpEvent.message, afterKmpEvent.message) { message = it?.toJvmMessage() } - applyIfChanged(beforeKmpEvent.fingerprint, afterKmpEvent.fingerprint) { fingerprints = it } - applyIfChanged(beforeKmpEvent.user, afterKmpEvent.user) { user = it?.toJvmUser() } - applyIfChanged(beforeKmpEvent.breadcrumbs, afterKmpEvent.breadcrumbs) { breadcrumbs = it.map { it.toJvmBreadcrumb() } } - applyIfChanged(beforeKmpEvent.eventId, afterKmpEvent.eventId) { eventId = JvmSentryId(it.toString()) } - applyIfChanged(beforeKmpEvent.tags, afterKmpEvent.tags) { tags = it } +// TODO(buenaflor): properly test this once we introduce a mocking framework +internal fun JvmSentryEvent.applyKmpEvent(kmpEvent: SentryEvent): JvmSentryEvent { + // Native SDKs may have a default behaviour if no release is set. + // Setting a release (even if it's null) will remove this behaviour, + // so we have to check if the values differ first before setting. + if (release != kmpEvent.release) { + release = kmpEvent.release + } + level = kmpEvent.level?.toJvmSentryLevel() + message = kmpEvent.message?.toJvmMessage() + logger = kmpEvent.logger + fingerprints = kmpEvent.fingerprint + environment = kmpEvent.environment + platform = kmpEvent.platform + user = kmpEvent.user?.toJvmUser() + serverName = kmpEvent.serverName + dist = kmpEvent.dist + breadcrumbs = kmpEvent.breadcrumbs?.map { it.toJvmBreadcrumb() } + eventId = JvmSentryId(kmpEvent.eventId.toString()) + tags = kmpEvent.tags return this } diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt index 5053d83c..2f42adac 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt @@ -23,7 +23,6 @@ internal fun JvmSentryOptions.applyJvmBaseOptions(kmpOptions: SentryOptions) { jvmOptions.isAttachStacktrace = kmpOptions.attachStackTrace jvmOptions.dist = kmpOptions.dist jvmOptions.environment = kmpOptions.environment - jvmOptions.isSendDefaultPii = kmpOptions.sendDefaultPii jvmOptions.release = kmpOptions.release jvmOptions.isDebug = kmpOptions.debug jvmOptions.sessionTrackingIntervalMillis = kmpOptions.sessionTrackingIntervalMillis @@ -44,10 +43,8 @@ internal fun JvmSentryOptions.applyJvmBaseOptions(kmpOptions: SentryOptions) { if (kmpOptions.beforeSend == null) { jvmSentryEvent } else { - val beforeKmpEvent = SentryEvent(jvmSentryEvent) - val beforeKmpEventCopy = SentryEvent(jvmSentryEvent) - kmpOptions.beforeSend?.invoke(beforeKmpEventCopy)?.let { afterKmpEvent -> - jvmSentryEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) + kmpOptions.beforeSend?.invoke(SentryEvent(jvmSentryEvent))?.let { + jvmSentryEvent.applyKmpEvent(it) } } } diff --git a/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt deleted file mode 100644 index 41ac59ef..00000000 --- a/sentry-kotlin-multiplatform/src/commonJvmTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.jvm.kt +++ /dev/null @@ -1,121 +0,0 @@ -package io.sentry.kotlin.multiplatform - -import io.sentry.kotlin.multiplatform.extensions.updateFromKmpEventChanges -import io.sentry.kotlin.multiplatform.protocol.Breadcrumb -import io.sentry.kotlin.multiplatform.protocol.Message -import io.sentry.kotlin.multiplatform.protocol.SentryId -import io.sentry.kotlin.multiplatform.protocol.User -import kotlin.test.Test -import kotlin.test.assertEquals - -actual class UpdateFromKmpEventChangesTest { - @Test - actual fun `native value is untouched when before and after values are the same`() { - val jvmEvent = JvmSentryEvent().apply { - release = "1.0" - dist = "1" - environment = "production" - serverName = "localhost" - platform = "java" - logger = "random logger" - level = JvmSentryLevel.FATAL - message = JvmMessage().apply { - message = "My Message" - } - fingerprints = mutableListOf("custom-fingerprints") - user = io.sentry.protocol.User().apply { - id = "123" - } - breadcrumbs = mutableListOf( - JvmBreadcrumb().apply { - message = "My Breadcrumb" - } - ) - eventId = JvmSentryId("2bcc030ccc994de890e058cf5a0527d8") - } - val beforeKmpEvent = SentryEvent() - val afterKmpEvent = SentryEvent() - - val updatedJvmEvent = jvmEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) - - assertEquals("1.0", updatedJvmEvent.release) - assertEquals("1", updatedJvmEvent.dist) - assertEquals("production", updatedJvmEvent.environment) - assertEquals("localhost", updatedJvmEvent.serverName) - assertEquals("java", updatedJvmEvent.platform) - assertEquals("random logger", updatedJvmEvent.logger) - assertEquals(JvmSentryLevel.FATAL, updatedJvmEvent.level) - assertEquals("My Message", updatedJvmEvent.message!!.message) - assertEquals(1, updatedJvmEvent.fingerprints!!.size) - assertEquals("custom-fingerprints", updatedJvmEvent.fingerprints!!.first()) - assertEquals("123", updatedJvmEvent.user!!.id) - assertEquals(1, updatedJvmEvent.breadcrumbs!!.size) - assertEquals("My Breadcrumb", updatedJvmEvent.breadcrumbs!!.first().message) - assertEquals(JvmSentryId("2bcc030ccc994de890e058cf5a0527d8"), updatedJvmEvent.eventId) - } - - @Test - actual fun `native value is updated when before and after values are different`() { - val jvmEvent = JvmSentryEvent().apply { - release = "1.0" - dist = "1" - environment = "production" - serverName = "localhost" - platform = "java" - logger = "random logger" - level = JvmSentryLevel.FATAL - message = JvmMessage().apply { - message = "My Message" - } - fingerprints = mutableListOf("custom-fingerprints") - user = io.sentry.protocol.User().apply { - id = "123" - } - breadcrumbs = mutableListOf( - JvmBreadcrumb().apply { - message = "My Breadcrumb" - } - ) - eventId = JvmSentryId("2bcc030ccc994de890e058cf5a0527d8") - } - val beforeKmpEvent = SentryEvent(jvmEvent) - val afterKmpEvent = SentryEvent(jvmEvent).apply { - release = "2.0" - dist = "123" - environment = "staging" - serverName = "www" - platform = "kotlin" - logger = "kmp logger" - level = SentryLevel.DEBUG - message = Message().apply { - message = "Another Message" - } - fingerprint = mutableListOf("another-fingerprints") - user = User().apply { - id = "123" - } - breadcrumbs = mutableListOf( - Breadcrumb().apply { - message = "My Breadcrumb" - } - ) - eventId = SentryId("8bcc030ccc994de890e058cf5a0527d9") - } - - val updatedJvmEvent = jvmEvent.updateFromKmpEventChanges(beforeKmpEvent, afterKmpEvent) - - assertEquals("2.0", updatedJvmEvent.release) - assertEquals("staging", updatedJvmEvent.environment) - assertEquals("www", updatedJvmEvent.serverName) - assertEquals("kotlin", updatedJvmEvent.platform) - assertEquals("kmp logger", updatedJvmEvent.logger) - assertEquals(JvmSentryLevel.DEBUG, updatedJvmEvent.level) - assertEquals("Another Message", updatedJvmEvent.message?.message) - assertEquals(1, updatedJvmEvent.fingerprints!!.size) - assertEquals("another-fingerprints", updatedJvmEvent.fingerprints!!.first()) - assertEquals("123", updatedJvmEvent.user?.id) - assertEquals(1, updatedJvmEvent.breadcrumbs?.size) - assertEquals("My Breadcrumb", updatedJvmEvent.breadcrumbs?.first()?.message) - assertEquals(SentryId("8bcc030ccc994de890e058cf5a0527d9").toString(), updatedJvmEvent.eventId.toString()) - } -} diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt index 124fa0d3..9f59f3a9 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt @@ -191,19 +191,6 @@ public open class SentryOptions { */ public var sessionReplay: SentryReplayOptions = SentryReplayOptions() - /** - * If this flag is enabled, certain personally identifiable information (PII) is added by active integrations. - * Among other things, enabling this will enable automatic IP address collection on events. - * - * If you enable this option, be sure to manually remove what you don't want to send using - * our features for managing sensitive data. - * - * For further details, refer to the documentation in the respective native SDKs: - * - [Cocoa](https://docs.sentry.io/platforms/apple/data-management/data-collected/) - * - [Android](https://docs.sentry.io/platforms/android/data-management/data-collected/) - */ - public var sendDefaultPii: Boolean = false - /** * Experimental options for new features, these options are going to be promoted to SentryOptions * before GA. diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/BeforeSendIntegrationTest.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/BeforeSendIntegrationTest.kt index c864a72d..b143d8df 100644 --- a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/BeforeSendIntegrationTest.kt +++ b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/BeforeSendIntegrationTest.kt @@ -215,7 +215,6 @@ class BeforeSendIntegrationTest { fun `event release is not modified if KMP beforeSend callback config is not modified`() { val originalEvent = sentryEventConfigurator.originalEvent val event = sentryEventConfigurator.applyOptions { - it.release = "1.0.0" it.dsn = fakeDsn } assertNotNull(event) @@ -237,9 +236,6 @@ class BeforeSendIntegrationTest { val originalEvent = sentryEventConfigurator.originalEvent val event = sentryEventConfigurator.applyOptions { it.dsn = fakeDsn - it.beforeSend = { event -> - event - } } assertNotNull(event) assertEquals(originalEvent.serverName, event.serverName) diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.kt index c34aa6ba..b89952f9 100644 --- a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.kt +++ b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.kt @@ -14,7 +14,6 @@ interface CommonPlatformOptions { val maxAttachmentSize: Long val sampleRate: Double? val tracesSampleRate: Double? - val sendDefaultPii: Boolean fun applyFromOptions(options: SentryOptions) } diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt index 2bb260f3..40b7b431 100644 --- a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt +++ b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt @@ -133,7 +133,6 @@ class SentryOptionsTest : BaseSentryTest() { assertTrue(options.sessionReplay.maskAllImages) assertEquals(SentryReplayOptions.Quality.MEDIUM, options.sessionReplay.quality) assertTrue(options.enableWatchdogTerminationTracking) - assertFalse(options.sendDefaultPii) } @Test @@ -164,7 +163,6 @@ class SentryOptionsTest : BaseSentryTest() { sessionReplay.maskAllText = false sessionReplay.maskAllImages = false sessionReplay.quality = SentryReplayOptions.Quality.LOW - sendDefaultPii = true } val platformOptions = createPlatformOptions() diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt deleted file mode 100644 index 0f17c6db..00000000 --- a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/UpdateFromKmpEventChangesTest.kt +++ /dev/null @@ -1,15 +0,0 @@ -package io.sentry.kotlin.multiplatform - -import io.sentry.kotlin.multiplatform.extensions.updateFromKmpEventChanges -import io.sentry.kotlin.multiplatform.protocol.Breadcrumb -import io.sentry.kotlin.multiplatform.protocol.Message -import io.sentry.kotlin.multiplatform.protocol.SentryId -import io.sentry.kotlin.multiplatform.protocol.User -import kotlinx.cinterop.convert -import kotlin.test.Test -import kotlin.test.assertEquals - -expect class UpdateFromKmpEventChangesTest { - fun `native value is untouched when before and after values are the same`() - fun `native value is updated when before and after values are different`() -} diff --git a/sentry-kotlin-multiplatform/src/jvmTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.jvm.kt b/sentry-kotlin-multiplatform/src/jvmTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.jvm.kt index 48eac5a8..7a3afecf 100644 --- a/sentry-kotlin-multiplatform/src/jvmTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.jvm.kt +++ b/sentry-kotlin-multiplatform/src/jvmTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.jvm.kt @@ -46,9 +46,6 @@ class SentryJvmOptionsWrapper(private val jvmOptions: JvmSentryOptions) : Platfo override val diagnosticLevel: SentryLevel get() = jvmOptions.diagnosticLevel.toKmpSentryLevel()!! - override val sendDefaultPii: Boolean - get() = jvmOptions.isSendDefaultPii - override fun applyFromOptions(options: SentryOptions) { options.toJvmSentryOptionsCallback().invoke(jvmOptions) } From b0cc5e7f2c23019dd75e010825fc430aa9aaae35 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 2 May 2025 12:52:16 +0200 Subject: [PATCH 17/25] Update --- .../kotlin/multiplatform/PlatformOptions.android.kt | 3 +++ .../extensions/SentryOptionsExtensions.apple.kt | 1 + .../kotlin/multiplatform/PlatformOptions.apple.kt | 3 +++ .../extensions/SentryOptionsExtensions.jvm.kt | 1 + .../io/sentry/kotlin/multiplatform/SentryOptions.kt | 13 +++++++++++++ .../sentry/kotlin/multiplatform/PlatformOptions.kt | 1 + .../kotlin/multiplatform/SentryOptionsTest.kt | 2 ++ .../kotlin/multiplatform/PlatformOptions.jvm.kt | 3 +++ 8 files changed, 27 insertions(+) diff --git a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt index 02a7e439..76e6cc57 100644 --- a/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt +++ b/sentry-kotlin-multiplatform/src/androidUnitTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.android.kt @@ -73,6 +73,9 @@ class SentryAndroidOptionsWrapper(private val androidOptions: SentryAndroidOptio override val sessionReplay: AndroidSentryReplayOptions get() = androidOptions.sessionReplay + override val sendDefaultPii: Boolean + get() = androidOptions.isSendDefaultPii + override fun applyFromOptions(options: SentryOptions) { options.toAndroidSentryOptionsCallback().invoke(androidOptions) } diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt index d7c488a0..77ce7d0c 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.apple.kt @@ -23,6 +23,7 @@ internal fun CocoaSentryOptions.applyCocoaBaseOptions(kmpOptions: SentryOptions) kmpOptions.environment?.let { cocoaOptions.environment = it } + cocoaOptions.sendDefaultPii = kmpOptions.sendDefaultPii cocoaOptions.releaseName = kmpOptions.release cocoaOptions.debug = kmpOptions.debug cocoaOptions.sessionTrackingIntervalMillis = kmpOptions.sessionTrackingIntervalMillis.convert() diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.apple.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.apple.kt index 5c9891d7..47bcd12f 100644 --- a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.apple.kt @@ -54,6 +54,9 @@ open class SentryAppleOptionsWrapper(private val cocoaOptions: CocoaSentryOption override val diagnosticLevel: SentryLevel get() = cocoaOptions.diagnosticLevel.toKmpSentryLevel()!! + override val sendDefaultPii: Boolean + get() = cocoaOptions.sendDefaultPii + override fun applyFromOptions(options: SentryOptions) { options.toCocoaOptionsConfiguration().invoke(cocoaOptions) } diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt index 2f42adac..2caf8d6e 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryOptionsExtensions.jvm.kt @@ -23,6 +23,7 @@ internal fun JvmSentryOptions.applyJvmBaseOptions(kmpOptions: SentryOptions) { jvmOptions.isAttachStacktrace = kmpOptions.attachStackTrace jvmOptions.dist = kmpOptions.dist jvmOptions.environment = kmpOptions.environment + jvmOptions.isSendDefaultPii = kmpOptions.sendDefaultPii jvmOptions.release = kmpOptions.release jvmOptions.isDebug = kmpOptions.debug jvmOptions.sessionTrackingIntervalMillis = kmpOptions.sessionTrackingIntervalMillis diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt index 9f59f3a9..124fa0d3 100644 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt +++ b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/SentryOptions.kt @@ -191,6 +191,19 @@ public open class SentryOptions { */ public var sessionReplay: SentryReplayOptions = SentryReplayOptions() + /** + * If this flag is enabled, certain personally identifiable information (PII) is added by active integrations. + * Among other things, enabling this will enable automatic IP address collection on events. + * + * If you enable this option, be sure to manually remove what you don't want to send using + * our features for managing sensitive data. + * + * For further details, refer to the documentation in the respective native SDKs: + * - [Cocoa](https://docs.sentry.io/platforms/apple/data-management/data-collected/) + * - [Android](https://docs.sentry.io/platforms/android/data-management/data-collected/) + */ + public var sendDefaultPii: Boolean = false + /** * Experimental options for new features, these options are going to be promoted to SentryOptions * before GA. diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.kt index b89952f9..c34aa6ba 100644 --- a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.kt +++ b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.kt @@ -14,6 +14,7 @@ interface CommonPlatformOptions { val maxAttachmentSize: Long val sampleRate: Double? val tracesSampleRate: Double? + val sendDefaultPii: Boolean fun applyFromOptions(options: SentryOptions) } diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt index 40b7b431..2bb260f3 100644 --- a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt +++ b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/SentryOptionsTest.kt @@ -133,6 +133,7 @@ class SentryOptionsTest : BaseSentryTest() { assertTrue(options.sessionReplay.maskAllImages) assertEquals(SentryReplayOptions.Quality.MEDIUM, options.sessionReplay.quality) assertTrue(options.enableWatchdogTerminationTracking) + assertFalse(options.sendDefaultPii) } @Test @@ -163,6 +164,7 @@ class SentryOptionsTest : BaseSentryTest() { sessionReplay.maskAllText = false sessionReplay.maskAllImages = false sessionReplay.quality = SentryReplayOptions.Quality.LOW + sendDefaultPii = true } val platformOptions = createPlatformOptions() diff --git a/sentry-kotlin-multiplatform/src/jvmTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.jvm.kt b/sentry-kotlin-multiplatform/src/jvmTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.jvm.kt index 7a3afecf..48eac5a8 100644 --- a/sentry-kotlin-multiplatform/src/jvmTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.jvm.kt +++ b/sentry-kotlin-multiplatform/src/jvmTest/kotlin/io/sentry/kotlin/multiplatform/PlatformOptions.jvm.kt @@ -46,6 +46,9 @@ class SentryJvmOptionsWrapper(private val jvmOptions: JvmSentryOptions) : Platfo override val diagnosticLevel: SentryLevel get() = jvmOptions.diagnosticLevel.toKmpSentryLevel()!! + override val sendDefaultPii: Boolean + get() = jvmOptions.isSendDefaultPii + override fun applyFromOptions(options: SentryOptions) { options.toJvmSentryOptionsCallback().invoke(jvmOptions) } From 756d0848913939b421bd5e262d6db43fb325601d Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 2 May 2025 12:52:38 +0200 Subject: [PATCH 18/25] Update --- .../multiplatform/util/ApplyIfChanged.kt | 5 ---- .../multiplatform/utils/ApplyIfChangedTest.kt | 25 ------------------- 2 files changed, 30 deletions(-) delete mode 100644 sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/util/ApplyIfChanged.kt delete mode 100644 sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/utils/ApplyIfChangedTest.kt diff --git a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/util/ApplyIfChanged.kt b/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/util/ApplyIfChanged.kt deleted file mode 100644 index 5675dca3..00000000 --- a/sentry-kotlin-multiplatform/src/commonMain/kotlin/io/sentry/kotlin/multiplatform/util/ApplyIfChanged.kt +++ /dev/null @@ -1,5 +0,0 @@ -package io.sentry.kotlin.multiplatform.util - -internal inline fun applyIfChanged(old: T, new: T, applyNew: (T) -> Unit) { - if (old != new) applyNew(new) -} diff --git a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/utils/ApplyIfChangedTest.kt b/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/utils/ApplyIfChangedTest.kt deleted file mode 100644 index 2f174ab0..00000000 --- a/sentry-kotlin-multiplatform/src/commonTest/kotlin/io/sentry/kotlin/multiplatform/utils/ApplyIfChangedTest.kt +++ /dev/null @@ -1,25 +0,0 @@ -package io.sentry.kotlin.multiplatform.utils - -import io.sentry.kotlin.multiplatform.util.applyIfChanged -import kotlin.test.Test -import kotlin.test.assertEquals -import kotlin.test.fail - -class ApplyIfChangedTest { - @Test - fun `applyIfChanged applies change if value changed`() { - var value = "old value" - applyIfChanged(value, "new value") { - value = it - } - assertEquals("new value", value) - } - - @Test - fun `applyIfChanged does not apply change if value did not change`() { - applyIfChanged("same value", "same value") { - // This block should not be executed - fail("Change was applied even though the value did not change") - } - } -} From 5b7eb17c8acd1bf598de228808f4e482b8af95a0 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 16 May 2025 14:23:43 +0200 Subject: [PATCH 19/25] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28b47196..886fae41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ ### Fixes -- `beforeSend` overriding default values even if they were not set explicitly ([#376](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/376)) +- `beforeSend` overriding default release even if it was not set explicitly ([#376](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/376)) ### Dependencies From b5cc56d4ed64e9187e4625342bedf424f9dfbe1d Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 16 May 2025 17:58:02 +0200 Subject: [PATCH 20/25] Update dist impl as well --- .../extensions/SentryEventExtensions.apple.kt | 7 +++-- .../kotlin/multiplatform/ApplyKmpEventTest.kt | 28 +++++++++++++++++-- .../extensions/SentryEventExtensions.jvm.kt | 7 +++-- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt index 159df88f..5ef341fe 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt @@ -5,12 +5,15 @@ import io.sentry.kotlin.multiplatform.CocoaSentryEvent import io.sentry.kotlin.multiplatform.SentryEvent internal fun CocoaSentryEvent.applyKmpEvent(kmpEvent: SentryEvent): CocoaSentryEvent { - // Native SDKs may have a default behaviour if no release is set. - // Setting a release (even if it's null) will remove this behaviour, + // Native SDKs may have a default behaviour if no release/dist is set. + // Setting a release/dist (even if it's null) will remove this behaviour, // so we have to check if the values differ first before setting. if (releaseName != kmpEvent.release) { releaseName = kmpEvent.release } + if (dist != kmpEvent.dist) { + dist = kmpEvent.dist + } kmpEvent.level?.let { level = it.toCocoaSentryLevel() } kmpEvent.platform?.let { platform = it } message = kmpEvent.message?.toCocoaMessage() diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt index ba1aa80e..3e9cdfaf 100644 --- a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt +++ b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt @@ -7,22 +7,46 @@ import kotlin.test.assertFalse class ApplyKmpEventTest { @Test fun `native release is not set if kmp release has same value`() { - val nativeEvent = FakeSentryEvent() - val kmpEvent = SentryEvent() + val nativeEvent = FakeSentryEvent().apply { + releaseName = "1.0.0" + } + val kmpEvent = SentryEvent().apply { + release = "1.0.0" + } nativeEvent.applyKmpEvent(kmpEvent) assertFalse(nativeEvent.wasReleaseSet) } + + @Test + fun `native dist is not set if kmp dist has same value`() { + val nativeEvent = FakeSentryEvent().apply { + dist = "randomDist" + } + val kmpEvent = SentryEvent().apply { + dist = "randomDist" + } + + nativeEvent.applyKmpEvent(kmpEvent) + + assertFalse(nativeEvent.wasDistSet) + } } // init with a SentryLevel as a workaround for: // Unable to call non-designated initializer as super constructor private class FakeSentryEvent : CocoaSentryEvent(Internal.Sentry.kSentryLevelFatal) { var wasReleaseSet = false + var wasDistSet = false override fun setReleaseName(releaseName: String?) { super.setReleaseName(releaseName) wasReleaseSet = true } + + override fun setDist(dist: String?) { + super.setDist(dist) + wasDistSet = true + } } \ No newline at end of file diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt index bdca879f..d691ac36 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt @@ -6,12 +6,15 @@ import io.sentry.kotlin.multiplatform.SentryEvent // TODO(buenaflor): properly test this once we introduce a mocking framework internal fun JvmSentryEvent.applyKmpEvent(kmpEvent: SentryEvent): JvmSentryEvent { - // Native SDKs may have a default behaviour if no release is set. - // Setting a release (even if it's null) will remove this behaviour, + // Native SDKs may have a default behaviour if no release/dist is set. + // Setting a release/dist (even if it's null) will remove this behaviour, // so we have to check if the values differ first before setting. if (release != kmpEvent.release) { release = kmpEvent.release } + if (dist != kmpEvent.dist) { + dist = kmpEvent.dist + } level = kmpEvent.level?.toJvmSentryLevel() message = kmpEvent.message?.toJvmMessage() logger = kmpEvent.logger From 6a334f743603b75c482132aeb2a10aa604777bc1 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 16 May 2025 17:58:52 +0200 Subject: [PATCH 21/25] Update CHANGELOG --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 886fae41..7f7ae2e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ ### Fixes -- `beforeSend` overriding default release even if it was not set explicitly ([#376](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/376)) +- `beforeSend` overriding default release and dist even if it was not set explicitly ([#376](https://github.com/getsentry/sentry-kotlin-multiplatform/pull/376)) ### Dependencies From 865d6957ec3414e0d7159b7e2f397dc12f90d04c Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 16 May 2025 17:59:17 +0200 Subject: [PATCH 22/25] Remove old dist --- .../multiplatform/extensions/SentryEventExtensions.apple.kt | 1 - .../kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt index 5ef341fe..757a43e5 100644 --- a/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt +++ b/sentry-kotlin-multiplatform/src/appleMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.apple.kt @@ -22,7 +22,6 @@ internal fun CocoaSentryEvent.applyKmpEvent(kmpEvent: SentryEvent): CocoaSentryE environment = kmpEvent.environment user = kmpEvent.user?.toCocoaUser() serverName = kmpEvent.serverName - dist = kmpEvent.dist breadcrumbs = kmpEvent.breadcrumbs.map { it.toCocoaBreadcrumb() }.toMutableList() tags = kmpEvent.tags.toMutableMap() eventId = SentryId(kmpEvent.eventId.toString()) diff --git a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt index d691ac36..1e1e8d1a 100644 --- a/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt +++ b/sentry-kotlin-multiplatform/src/commonJvmMain/kotlin/io/sentry/kotlin/multiplatform/extensions/SentryEventExtensions.jvm.kt @@ -23,7 +23,6 @@ internal fun JvmSentryEvent.applyKmpEvent(kmpEvent: SentryEvent): JvmSentryEvent platform = kmpEvent.platform user = kmpEvent.user?.toJvmUser() serverName = kmpEvent.serverName - dist = kmpEvent.dist breadcrumbs = kmpEvent.breadcrumbs?.map { it.toJvmBreadcrumb() } eventId = JvmSentryId(kmpEvent.eventId.toString()) tags = kmpEvent.tags From f659b21770e3c183cb437ef3336120ead7a037a6 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Fri, 16 May 2025 18:16:42 +0200 Subject: [PATCH 23/25] Formatting --- .../kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt index 3e9cdfaf..0d9376ab 100644 --- a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt +++ b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt @@ -49,4 +49,4 @@ private class FakeSentryEvent : CocoaSentryEvent(Internal.Sentry.kSentryLevelFat super.setDist(dist) wasDistSet = true } -} \ No newline at end of file +} From 35275a69058acdac62c88088d9c2cf0d11ee067e Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 26 Jun 2025 02:29:17 +0200 Subject: [PATCH 24/25] Fix apple test --- .../kotlin/multiplatform/ApplyKmpEventTest.kt | 43 ++++++++++++++++--- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt index 0d9376ab..a95bf21e 100644 --- a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt +++ b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt @@ -2,7 +2,9 @@ package io.sentry.kotlin.multiplatform import io.sentry.kotlin.multiplatform.extensions.applyKmpEvent import kotlin.test.Test +import kotlin.test.assertEquals import kotlin.test.assertFalse +import kotlin.test.assertTrue class ApplyKmpEventTest { @Test @@ -16,9 +18,10 @@ class ApplyKmpEventTest { nativeEvent.applyKmpEvent(kmpEvent) - assertFalse(nativeEvent.wasReleaseSet) + assertEquals(1, nativeEvent.releaseSetCount) } + @Test fun `native dist is not set if kmp dist has same value`() { val nativeEvent = FakeSentryEvent().apply { @@ -30,23 +33,51 @@ class ApplyKmpEventTest { nativeEvent.applyKmpEvent(kmpEvent) - assertFalse(nativeEvent.wasDistSet) + assertEquals(1, nativeEvent.distSetCount) + } + + @Test + fun `native release is set if kmp release has different value`() { + val nativeEvent = FakeSentryEvent().apply { + releaseName = "1.0.0" + } + val kmpEvent = SentryEvent().apply { + release = "7.0.0" + } + + nativeEvent.applyKmpEvent(kmpEvent) + + assertEquals(2, nativeEvent.releaseSetCount) + } + + @Test + fun `native dist is set if kmp dist has different value`() { + val nativeEvent = FakeSentryEvent().apply { + dist = "randomDist" + } + val kmpEvent = SentryEvent().apply { + dist = "differentDist" + } + + nativeEvent.applyKmpEvent(kmpEvent) + + assertEquals(2, nativeEvent.distSetCount) } } // init with a SentryLevel as a workaround for: // Unable to call non-designated initializer as super constructor private class FakeSentryEvent : CocoaSentryEvent(Internal.Sentry.kSentryLevelFatal) { - var wasReleaseSet = false - var wasDistSet = false + var releaseSetCount = 0 + var distSetCount = 0 override fun setReleaseName(releaseName: String?) { super.setReleaseName(releaseName) - wasReleaseSet = true + releaseSetCount += 1 } override fun setDist(dist: String?) { super.setDist(dist) - wasDistSet = true + distSetCount += 1 } } From 9ba7a9913f2fbce576fb9d91040c11e0e121ef26 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 26 Jun 2025 02:37:02 +0200 Subject: [PATCH 25/25] Formatting --- .../kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt index a95bf21e..c0f92c77 100644 --- a/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt +++ b/sentry-kotlin-multiplatform/src/appleTest/kotlin/io/sentry/kotlin/multiplatform/ApplyKmpEventTest.kt @@ -3,8 +3,6 @@ package io.sentry.kotlin.multiplatform import io.sentry.kotlin.multiplatform.extensions.applyKmpEvent import kotlin.test.Test import kotlin.test.assertEquals -import kotlin.test.assertFalse -import kotlin.test.assertTrue class ApplyKmpEventTest { @Test @@ -21,7 +19,6 @@ class ApplyKmpEventTest { assertEquals(1, nativeEvent.releaseSetCount) } - @Test fun `native dist is not set if kmp dist has same value`() { val nativeEvent = FakeSentryEvent().apply {