Skip to content

Commit 2d65f68

Browse files
committed
Fix flaky SdkInitTests
1 parent ee747ae commit 2d65f68

2 files changed

Lines changed: 75 additions & 13 deletions

File tree

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

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import java.util.HashMap;
4747
import java.util.List;
4848
import java.util.Map;
49+
import java.util.concurrent.RejectedExecutionException;
4950
import java.util.concurrent.atomic.AtomicBoolean;
5051
import org.jetbrains.annotations.NotNull;
5152
import org.jetbrains.annotations.Nullable;
@@ -186,21 +187,27 @@ private void unregisterReceiver() {
186187
return;
187188
}
188189

189-
options
190+
try {
191+
options
190192
.getExecutorService()
191193
.submit(
192-
() -> {
193-
final @Nullable SystemEventsBroadcastReceiver receiverRef;
194-
try (final @NotNull ISentryLifecycleToken ignored = receiverLock.acquire()) {
195-
isStopped = true;
196-
receiverRef = receiver;
197-
receiver = null;
198-
}
194+
() -> {
195+
final @Nullable SystemEventsBroadcastReceiver receiverRef;
196+
try (final @NotNull ISentryLifecycleToken ignored = receiverLock.acquire()) {
197+
isStopped = true;
198+
receiverRef = receiver;
199+
receiver = null;
200+
}
199201

200-
if (receiverRef != null) {
201-
context.unregisterReceiver(receiverRef);
202-
}
203-
});
202+
if (receiverRef != null) {
203+
context.unregisterReceiver(receiverRef);
204+
}
205+
});
206+
} catch (RejectedExecutionException e) {
207+
if (options != null) {
208+
options.getLogger().log(SentryLevel.DEBUG, "SystemEventsBreadcrumbsIntegration was unable to unregister receiver.", e);
209+
}
210+
}
204211
}
205212

206213
@Override

sentry-android-integration-tests/sentry-uitest-android/src/androidTest/java/io/sentry/uitest/android/SdkInitTests.kt

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package io.sentry.uitest.android
33
import androidx.lifecycle.Lifecycle
44
import androidx.test.core.app.launchActivity
55
import androidx.test.ext.junit.runners.AndroidJUnit4
6+
import io.sentry.IConnectionStatusProvider
67
import io.sentry.ProfilingTraceData
78
import io.sentry.Sentry
89
import io.sentry.SentryIntegrationPackageStorage
@@ -23,19 +24,51 @@ import shark.AndroidReferenceMatchers
2324
import shark.IgnoredReferenceMatcher
2425
import shark.ReferencePattern
2526

27+
/** Test connection status provider that always reports connected. */
28+
private class AlwaysOnlineStatusProvider : IConnectionStatusProvider {
29+
30+
override fun close() {
31+
// No-op for test implementation
32+
}
33+
34+
override fun getConnectionStatus(): IConnectionStatusProvider.ConnectionStatus {
35+
return IConnectionStatusProvider.ConnectionStatus.CONNECTED
36+
}
37+
38+
override fun getConnectionType(): String? {
39+
return null
40+
}
41+
42+
override fun addConnectionStatusObserver(
43+
observer: IConnectionStatusProvider.IConnectionStatusObserver
44+
): Boolean {
45+
return false
46+
}
47+
48+
override fun removeConnectionStatusObserver(
49+
observer: IConnectionStatusProvider.IConnectionStatusObserver
50+
) {
51+
// no-op
52+
}
53+
}
54+
2655
@RunWith(AndroidJUnit4::class)
2756
class SdkInitTests : BaseUiTest() {
2857
@Test
2958
fun doubleInitDoesNotThrow() {
3059
initSentry(false) { options: SentryAndroidOptions ->
3160
options.tracesSampleRate = 1.0
3261
options.profilesSampleRate = 1.0
62+
options.readTimeoutMillis = 500
63+
options.connectionTimeoutMillis = 500
3364
}
3465
val transaction = Sentry.startTransaction("e2etests", "testInit")
3566
val sampleScenario = launchActivity<EmptyActivity>()
3667
initSentry(false) { options: SentryAndroidOptions ->
3768
options.tracesSampleRate = 1.0
3869
options.profilesSampleRate = 1.0
70+
options.readTimeoutMillis = 500
71+
options.connectionTimeoutMillis = 500
3972
}
4073
transaction.finish()
4174
sampleScenario.moveToState(Lifecycle.State.DESTROYED)
@@ -53,6 +86,9 @@ class SdkInitTests : BaseUiTest() {
5386
// We use the same executorService before and after closing the SDK
5487
it.executorService = options.executorService
5588
it.isDebug = true
89+
it.readTimeoutMillis = 500
90+
it.connectionTimeoutMillis = 500
91+
it.connectionStatusProvider = AlwaysOnlineStatusProvider()
5692
}
5793
val transaction = Sentry.startTransaction("e2etests", "testInit")
5894
val sampleScenario = launchActivity<EmptyActivity>()
@@ -62,6 +98,9 @@ class SdkInitTests : BaseUiTest() {
6298
// We use the same executorService before and after closing the SDK
6399
it.executorService = options.executorService
64100
it.isDebug = true
101+
it.readTimeoutMillis = 500
102+
it.connectionTimeoutMillis = 500
103+
it.connectionStatusProvider = AlwaysOnlineStatusProvider()
65104
}
66105
relayIdlingResource.increment()
67106
relayIdlingResource.increment()
@@ -103,7 +142,12 @@ class SdkInitTests : BaseUiTest() {
103142
// Let's make the first request timeout
104143
relay.addTimeoutResponse()
105144

106-
initSentry(true) { options: SentryAndroidOptions -> options.tracesSampleRate = 1.0 }
145+
initSentry(true) { options: SentryAndroidOptions ->
146+
options.tracesSampleRate = 1.0
147+
options.readTimeoutMillis = 500
148+
options.connectionTimeoutMillis = 500
149+
options.connectionStatusProvider = AlwaysOnlineStatusProvider()
150+
}
107151

108152
Sentry.startTransaction("beforeRestart", "emptyTransaction").finish()
109153

@@ -120,6 +164,9 @@ class SdkInitTests : BaseUiTest() {
120164
initSentry(true) { options: SentryAndroidOptions ->
121165
options.tracesSampleRate = 1.0
122166
options.profilesSampleRate = 1.0
167+
options.readTimeoutMillis = 500
168+
options.connectionTimeoutMillis = 500
169+
options.connectionStatusProvider = AlwaysOnlineStatusProvider()
123170
}
124171
val afterRestart = System.currentTimeMillis()
125172
val restartMs = afterRestart - beforeRestart
@@ -156,6 +203,7 @@ class SdkInitTests : BaseUiTest() {
156203
initSentry(true) { options: SentryAndroidOptions ->
157204
options.tracesSampleRate = 1.0
158205
options.flushTimeoutMillis = 3000
206+
options.connectionStatusProvider = AlwaysOnlineStatusProvider()
159207
}
160208

161209
Sentry.startTransaction("beforeRestart", "emptyTransaction").finish()
@@ -170,6 +218,7 @@ class SdkInitTests : BaseUiTest() {
170218
initSentry(true) { options: SentryAndroidOptions ->
171219
options.tracesSampleRate = 1.0
172220
options.profilesSampleRate = 1.0
221+
options.connectionStatusProvider = AlwaysOnlineStatusProvider()
173222
}
174223
val afterRestart = System.currentTimeMillis()
175224
val restartMs = afterRestart - beforeRestart
@@ -224,6 +273,9 @@ class SdkInitTests : BaseUiTest() {
224273
initSentry(false) { options: SentryAndroidOptions ->
225274
options.tracesSampleRate = 1.0
226275
options.profilesSampleRate = 1.0
276+
options.readTimeoutMillis = 500
277+
options.connectionTimeoutMillis = 500
278+
options.connectionStatusProvider = AlwaysOnlineStatusProvider()
227279
}
228280
}
229281
activityScenario.moveToState(Lifecycle.State.DESTROYED)
@@ -244,6 +296,9 @@ class SdkInitTests : BaseUiTest() {
244296
initSentry(false) { options: SentryAndroidOptions ->
245297
options.tracesSampleRate = 1.0
246298
options.profilesSampleRate = 1.0
299+
options.readTimeoutMillis = 500
300+
options.connectionTimeoutMillis = 500
301+
options.connectionStatusProvider = AlwaysOnlineStatusProvider()
247302
}
248303
initLatch.countDown()
249304
}

0 commit comments

Comments
 (0)