Skip to content

Commit 927ac33

Browse files
authored
Merge e19f359 into e72bad7
2 parents e72bad7 + e19f359 commit 927ac33

File tree

3 files changed

+56
-5
lines changed

3 files changed

+56
-5
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
### Fixes
6+
7+
- Do not override user-defined `SentryOptions` ([#4262](https://github.com/getsentry/sentry-java/pull/4262))
8+
39
## 8.5.0
410

511
### Features

sentry-android-core/src/main/java/io/sentry/android/core/AndroidOptionsInitializer.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.sentry.ILogger;
1212
import io.sentry.ISentryLifecycleToken;
1313
import io.sentry.ITransactionProfiler;
14+
import io.sentry.NoOpCompositePerformanceCollector;
1415
import io.sentry.NoOpConnectionStatusProvider;
1516
import io.sentry.NoOpContinuousProfiler;
1617
import io.sentry.NoOpTransactionProfiler;
@@ -35,12 +36,16 @@
3536
import io.sentry.cache.PersistingScopeObserver;
3637
import io.sentry.compose.gestures.ComposeGestureTargetLocator;
3738
import io.sentry.compose.viewhierarchy.ComposeViewHierarchyExporter;
39+
import io.sentry.internal.debugmeta.NoOpDebugMetaLoader;
3840
import io.sentry.internal.gestures.GestureTargetLocator;
41+
import io.sentry.internal.modules.NoOpModulesLoader;
3942
import io.sentry.internal.viewhierarchy.ViewHierarchyExporter;
4043
import io.sentry.transport.CurrentDateProvider;
4144
import io.sentry.transport.NoOpEnvelopeCache;
45+
import io.sentry.transport.NoOpTransportGate;
4246
import io.sentry.util.LazyEvaluator;
4347
import io.sentry.util.Objects;
48+
import io.sentry.util.thread.NoOpThreadChecker;
4449
import java.io.File;
4550
import java.util.ArrayList;
4651
import java.util.List;
@@ -163,7 +168,9 @@ static void initializeIntegrationsAndProcessors(
163168
options.addEventProcessor(new ScreenshotEventProcessor(options, buildInfoProvider));
164169
options.addEventProcessor(new ViewHierarchyEventProcessor(options));
165170
options.addEventProcessor(new AnrV2EventProcessor(context, options, buildInfoProvider));
166-
options.setTransportGate(new AndroidTransportGate(options));
171+
if (options.getTransportGate() instanceof NoOpTransportGate) {
172+
options.setTransportGate(new AndroidTransportGate(options));
173+
}
167174

168175
// Check if the profiler was already instantiated in the app start.
169176
// We use the Android profiler, that uses a global start/stop api, so we need to preserve the
@@ -185,8 +192,12 @@ static void initializeIntegrationsAndProcessors(
185192
appStartTransactionProfiler,
186193
appStartContinuousProfiler);
187194

188-
options.setModulesLoader(new AssetsModulesLoader(context, options.getLogger()));
189-
options.setDebugMetaLoader(new AssetsDebugMetaLoader(context, options.getLogger()));
195+
if (options.getModulesLoader() instanceof NoOpModulesLoader) {
196+
options.setModulesLoader(new AssetsModulesLoader(context, options.getLogger()));
197+
}
198+
if (options.getDebugMetaLoader() instanceof NoOpDebugMetaLoader) {
199+
options.setDebugMetaLoader(new AssetsDebugMetaLoader(context, options.getLogger()));
200+
}
190201

191202
final boolean isAndroidXScrollViewAvailable =
192203
loadClass.isClassAvailable("androidx.core.view.ScrollingView", options);
@@ -218,7 +229,9 @@ static void initializeIntegrationsAndProcessors(
218229
options.setViewHierarchyExporters(viewHierarchyExporters);
219230
}
220231

221-
options.setThreadChecker(AndroidThreadChecker.getInstance());
232+
if (options.getThreadChecker() instanceof NoOpThreadChecker) {
233+
options.setThreadChecker(AndroidThreadChecker.getInstance());
234+
}
222235
if (options.getPerformanceCollectors().isEmpty()) {
223236
options.addPerformanceCollector(new AndroidMemoryCollector());
224237
options.addPerformanceCollector(new AndroidCpuCollector(options.getLogger()));
@@ -232,7 +245,9 @@ static void initializeIntegrationsAndProcessors(
232245
"options.getFrameMetricsCollector is required")));
233246
}
234247
}
235-
options.setCompositePerformanceCollector(new DefaultCompositePerformanceCollector(options));
248+
if (options.getCompositePerformanceCollector() instanceof NoOpCompositePerformanceCollector) {
249+
options.setCompositePerformanceCollector(new DefaultCompositePerformanceCollector(options));
250+
}
236251
}
237252

238253
/** Setup the correct profiler (transaction or continuous) based on the options. */

sentry-android-core/src/test/java/io/sentry/android/core/AndroidOptionsInitializerTest.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,35 @@ import android.os.Build
66
import android.os.Bundle
77
import androidx.test.core.app.ApplicationProvider
88
import androidx.test.ext.junit.runners.AndroidJUnit4
9+
import io.sentry.CompositePerformanceCollector
910
import io.sentry.DefaultCompositePerformanceCollector
1011
import io.sentry.IContinuousProfiler
12+
import io.sentry.IConnectionStatusProvider
1113
import io.sentry.ILogger
1214
import io.sentry.ITransactionProfiler
1315
import io.sentry.MainEventProcessor
1416
import io.sentry.NoOpContinuousProfiler
1517
import io.sentry.NoOpTransactionProfiler
1618
import io.sentry.SentryOptions
1719
import io.sentry.android.core.cache.AndroidEnvelopeCache
20+
import io.sentry.android.core.internal.debugmeta.AssetsDebugMetaLoader
1821
import io.sentry.android.core.internal.gestures.AndroidViewGestureTargetLocator
1922
import io.sentry.android.core.internal.modules.AssetsModulesLoader
23+
import io.sentry.android.core.internal.util.AndroidConnectionStatusProvider
2024
import io.sentry.android.core.internal.util.AndroidThreadChecker
2125
import io.sentry.android.core.performance.AppStartMetrics
2226
import io.sentry.android.fragment.FragmentLifecycleIntegration
2327
import io.sentry.android.replay.ReplayIntegration
2428
import io.sentry.android.timber.SentryTimberIntegration
29+
import io.sentry.cache.IEnvelopeCache
2530
import io.sentry.cache.PersistingOptionsObserver
2631
import io.sentry.cache.PersistingScopeObserver
2732
import io.sentry.compose.gestures.ComposeGestureTargetLocator
33+
import io.sentry.internal.debugmeta.IDebugMetaLoader
34+
import io.sentry.internal.modules.IModulesLoader
2835
import io.sentry.test.ImmediateExecutorService
36+
import io.sentry.transport.ITransportGate
37+
import io.sentry.util.thread.IThreadChecker
2938
import org.junit.runner.RunWith
3039
import org.mockito.kotlin.any
3140
import org.mockito.kotlin.eq
@@ -840,4 +849,25 @@ class AndroidOptionsInitializerTest {
840849
fixture.sentryOptions.findPersistingScopeObserver()?.setTags(mapOf("key" to "value"))
841850
assertFalse(File(AndroidOptionsInitializer.getCacheDir(fixture.context), PersistingScopeObserver.SCOPE_CACHE).exists())
842851
}
852+
853+
@Test
854+
fun `user options have precedence over defaults`() {
855+
fixture.initSut(configureOptions = {
856+
setTransportGate(mock<ITransportGate>())
857+
setEnvelopeDiskCache(mock<IEnvelopeCache>())
858+
connectionStatusProvider = mock<IConnectionStatusProvider>()
859+
setModulesLoader(mock<IModulesLoader>())
860+
setDebugMetaLoader(mock<IDebugMetaLoader>())
861+
threadChecker = mock<IThreadChecker>()
862+
compositePerformanceCollector = mock<CompositePerformanceCollector>()
863+
})
864+
865+
assertFalse { fixture.sentryOptions.transportGate is AndroidTransportGate }
866+
assertFalse { fixture.sentryOptions.envelopeDiskCache is AndroidEnvelopeCache }
867+
assertFalse { fixture.sentryOptions.connectionStatusProvider is AndroidConnectionStatusProvider }
868+
assertFalse { fixture.sentryOptions.modulesLoader is AssetsModulesLoader }
869+
assertFalse { fixture.sentryOptions.debugMetaLoader is AssetsDebugMetaLoader }
870+
assertFalse { fixture.sentryOptions.threadChecker is AndroidThreadChecker }
871+
assertFalse { fixture.sentryOptions.compositePerformanceCollector is DefaultCompositePerformanceCollector }
872+
}
843873
}

0 commit comments

Comments
 (0)