Skip to content

Commit 38c8af8

Browse files
committed
Do not override user-defined SentryOptions
1 parent 70c11a0 commit 38c8af8

File tree

2 files changed

+52
-5
lines changed

2 files changed

+52
-5
lines changed

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

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.sentry.ISentryLifecycleToken;
1212
import io.sentry.ITransactionProfiler;
1313
import io.sentry.NoOpConnectionStatusProvider;
14+
import io.sentry.NoOpTransactionPerformanceCollector;
1415
import io.sentry.ScopeType;
1516
import io.sentry.SendFireAndForgetEnvelopeSender;
1617
import io.sentry.SendFireAndForgetOutboxSender;
@@ -32,12 +33,16 @@
3233
import io.sentry.cache.PersistingScopeObserver;
3334
import io.sentry.compose.gestures.ComposeGestureTargetLocator;
3435
import io.sentry.compose.viewhierarchy.ComposeViewHierarchyExporter;
36+
import io.sentry.internal.debugmeta.NoOpDebugMetaLoader;
3537
import io.sentry.internal.gestures.GestureTargetLocator;
38+
import io.sentry.internal.modules.NoOpModulesLoader;
3639
import io.sentry.internal.viewhierarchy.ViewHierarchyExporter;
3740
import io.sentry.transport.CurrentDateProvider;
3841
import io.sentry.transport.NoOpEnvelopeCache;
42+
import io.sentry.transport.NoOpTransportGate;
3943
import io.sentry.util.LazyEvaluator;
4044
import io.sentry.util.Objects;
45+
import io.sentry.util.thread.NoOpThreadChecker;
4146
import java.io.File;
4247
import java.util.ArrayList;
4348
import java.util.List;
@@ -160,7 +165,9 @@ static void initializeIntegrationsAndProcessors(
160165
options.addEventProcessor(new ScreenshotEventProcessor(options, buildInfoProvider));
161166
options.addEventProcessor(new ViewHierarchyEventProcessor(options));
162167
options.addEventProcessor(new AnrV2EventProcessor(context, options, buildInfoProvider));
163-
options.setTransportGate(new AndroidTransportGate(options));
168+
if (options.getTransportGate() instanceof NoOpTransportGate) {
169+
options.setTransportGate(new AndroidTransportGate(options));
170+
}
164171

165172
// Check if the profiler was already instantiated in the app start.
166173
// We use the Android profiler, that uses a global start/stop api, so we need to preserve the
@@ -182,8 +189,12 @@ static void initializeIntegrationsAndProcessors(
182189
"options.getFrameMetricsCollector is required")));
183190
}
184191
}
185-
options.setModulesLoader(new AssetsModulesLoader(context, options.getLogger()));
186-
options.setDebugMetaLoader(new AssetsDebugMetaLoader(context, options.getLogger()));
192+
if (options.getModulesLoader() instanceof NoOpModulesLoader) {
193+
options.setModulesLoader(new AssetsModulesLoader(context, options.getLogger()));
194+
}
195+
if (options.getDebugMetaLoader() instanceof NoOpDebugMetaLoader) {
196+
options.setDebugMetaLoader(new AssetsDebugMetaLoader(context, options.getLogger()));
197+
}
187198

188199
final boolean isAndroidXScrollViewAvailable =
189200
loadClass.isClassAvailable("androidx.core.view.ScrollingView", options);
@@ -215,7 +226,9 @@ static void initializeIntegrationsAndProcessors(
215226
options.setViewHierarchyExporters(viewHierarchyExporters);
216227
}
217228

218-
options.setThreadChecker(AndroidThreadChecker.getInstance());
229+
if (options.getThreadChecker() instanceof NoOpThreadChecker) {
230+
options.setThreadChecker(AndroidThreadChecker.getInstance());
231+
}
219232
if (options.getPerformanceCollectors().isEmpty()) {
220233
options.addPerformanceCollector(new AndroidMemoryCollector());
221234
options.addPerformanceCollector(new AndroidCpuCollector(options.getLogger()));
@@ -229,7 +242,11 @@ static void initializeIntegrationsAndProcessors(
229242
"options.getFrameMetricsCollector is required")));
230243
}
231244
}
232-
options.setTransactionPerformanceCollector(new DefaultTransactionPerformanceCollector(options));
245+
if (options.getTransactionPerformanceCollector()
246+
instanceof NoOpTransactionPerformanceCollector) {
247+
options.setTransactionPerformanceCollector(
248+
new DefaultTransactionPerformanceCollector(options));
249+
}
233250
}
234251

235252
static void installDefaultIntegrations(

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
@@ -7,20 +7,29 @@ import android.os.Bundle
77
import androidx.test.core.app.ApplicationProvider
88
import androidx.test.ext.junit.runners.AndroidJUnit4
99
import io.sentry.DefaultTransactionPerformanceCollector
10+
import io.sentry.IConnectionStatusProvider
1011
import io.sentry.ILogger
1112
import io.sentry.MainEventProcessor
1213
import io.sentry.SentryOptions
14+
import io.sentry.TransactionPerformanceCollector
1315
import io.sentry.android.core.cache.AndroidEnvelopeCache
16+
import io.sentry.android.core.internal.debugmeta.AssetsDebugMetaLoader
1417
import io.sentry.android.core.internal.gestures.AndroidViewGestureTargetLocator
1518
import io.sentry.android.core.internal.modules.AssetsModulesLoader
19+
import io.sentry.android.core.internal.util.AndroidConnectionStatusProvider
1620
import io.sentry.android.core.internal.util.AndroidThreadChecker
1721
import io.sentry.android.fragment.FragmentLifecycleIntegration
1822
import io.sentry.android.replay.ReplayIntegration
1923
import io.sentry.android.timber.SentryTimberIntegration
24+
import io.sentry.cache.IEnvelopeCache
2025
import io.sentry.cache.PersistingOptionsObserver
2126
import io.sentry.cache.PersistingScopeObserver
2227
import io.sentry.compose.gestures.ComposeGestureTargetLocator
28+
import io.sentry.internal.debugmeta.IDebugMetaLoader
29+
import io.sentry.internal.modules.IModulesLoader
2330
import io.sentry.test.ImmediateExecutorService
31+
import io.sentry.transport.ITransportGate
32+
import io.sentry.util.thread.IThreadChecker
2433
import org.junit.runner.RunWith
2534
import org.mockito.kotlin.any
2635
import org.mockito.kotlin.eq
@@ -732,4 +741,25 @@ class AndroidOptionsInitializerTest {
732741
fixture.sentryOptions.findPersistingScopeObserver()?.setTags(mapOf("key" to "value"))
733742
assertFalse(File(AndroidOptionsInitializer.getCacheDir(fixture.context), PersistingScopeObserver.SCOPE_CACHE).exists())
734743
}
744+
745+
@Test
746+
fun `user options have precedence over defaults`() {
747+
fixture.initSut(configureOptions = {
748+
setTransportGate(mock<ITransportGate>())
749+
setEnvelopeDiskCache(mock<IEnvelopeCache>())
750+
connectionStatusProvider = mock<IConnectionStatusProvider>()
751+
setModulesLoader(mock<IModulesLoader>())
752+
setDebugMetaLoader(mock<IDebugMetaLoader>())
753+
threadChecker = mock<IThreadChecker>()
754+
transactionPerformanceCollector = mock<TransactionPerformanceCollector>()
755+
})
756+
757+
assertFalse { fixture.sentryOptions.transportGate is AndroidTransportGate }
758+
assertFalse { fixture.sentryOptions.envelopeDiskCache is AndroidEnvelopeCache }
759+
assertFalse { fixture.sentryOptions.connectionStatusProvider is AndroidConnectionStatusProvider }
760+
assertFalse { fixture.sentryOptions.modulesLoader is AssetsModulesLoader }
761+
assertFalse { fixture.sentryOptions.debugMetaLoader is AssetsDebugMetaLoader }
762+
assertFalse { fixture.sentryOptions.threadChecker is AndroidThreadChecker }
763+
assertFalse { fixture.sentryOptions.transactionPerformanceCollector is DefaultTransactionPerformanceCollector }
764+
}
735765
}

0 commit comments

Comments
 (0)