Skip to content

Commit d8402b6

Browse files
committed
Add tests
1 parent 5edb0d3 commit d8402b6

4 files changed

Lines changed: 261 additions & 5 deletions

File tree

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.sentry.ISentryLifecycleToken;
1010
import io.sentry.NoOpLogger;
1111
import io.sentry.SentryLevel;
12+
import io.sentry.SentryOptions;
1213
import io.sentry.android.core.internal.util.AndroidThreadChecker;
1314
import io.sentry.util.AutoClosableReentrantLock;
1415
import java.io.Closeable;
@@ -36,11 +37,18 @@ private AppState() {}
3637

3738
private volatile @Nullable Boolean inBackground = null;
3839

40+
@ApiStatus.Internal
3941
@TestOnly
40-
void resetInstance() {
42+
public void resetInstance() {
4143
instance = new AppState();
4244
}
4345

46+
@ApiStatus.Internal
47+
@TestOnly
48+
public LifecycleObserver getLifecycleObserver() {
49+
return lifecycleObserver;
50+
}
51+
4452
public @Nullable Boolean isInBackground() {
4553
return inBackground;
4654
}
@@ -65,7 +73,8 @@ public void removeAppStateListener(final @NotNull AppStateListener listener) {
6573
}
6674
}
6775

68-
void registerLifecycleObserver(final @Nullable SentryAndroidOptions options) {
76+
@ApiStatus.Internal
77+
public void registerLifecycleObserver(final @Nullable SentryOptions options) {
6978
if (lifecycleObserver != null) {
7079
return;
7180
}
@@ -121,7 +130,8 @@ private void addObserverInternal(final @NotNull ILogger logger) {
121130
}
122131
}
123132

124-
void unregisterLifecycleObserver() {
133+
@ApiStatus.Internal
134+
public void unregisterLifecycleObserver() {
125135
if (lifecycleObserver == null) {
126136
return;
127137
}
@@ -155,7 +165,8 @@ public void close() throws IOException {
155165
unregisterLifecycleObserver();
156166
}
157167

158-
final class LifecycleObserver implements DefaultLifecycleObserver {
168+
@ApiStatus.Internal
169+
public final class LifecycleObserver implements DefaultLifecycleObserver {
159170
final List<AppStateListener> listeners =
160171
new CopyOnWriteArrayList<AppStateListener>() {
161172
@Override
@@ -171,6 +182,12 @@ public boolean add(AppStateListener appStateListener) {
171182
}
172183
};
173184

185+
@ApiStatus.Internal
186+
@TestOnly
187+
public List<AppStateListener> getListeners() {
188+
return listeners;
189+
}
190+
174191
@Override
175192
public void onStart(@NonNull LifecycleOwner owner) {
176193
setInBackground(false);

sentry-android-core/src/main/java/io/sentry/android/core/internal/util/AndroidConnectionStatusProvider.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,7 @@ public void close() {
460460
connectivityManagerLock.acquire()) {
461461
connectivityManager = null;
462462
}
463+
AppState.getInstance().removeAppStateListener(this);
463464
});
464465
}
465466

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package io.sentry.android.core
22

3+
import android.app.ActivityManager
4+
import android.app.ActivityManager.RunningAppProcessInfo
35
import android.content.Context
46
import android.content.Intent
57
import android.os.BatteryManager
68
import android.os.Build
79
import android.os.Looper
10+
import androidx.test.core.app.ApplicationProvider
811
import androidx.test.ext.junit.runners.AndroidJUnit4
912
import io.sentry.Breadcrumb
1013
import io.sentry.IScopes
@@ -33,6 +36,9 @@ import org.mockito.kotlin.verifyNoMoreInteractions
3336
import org.mockito.kotlin.whenever
3437
import org.robolectric.Shadows.shadowOf
3538
import org.robolectric.annotation.Config
39+
import org.robolectric.shadow.api.Shadow
40+
import org.robolectric.shadows.ShadowActivityManager
41+
import org.robolectric.shadows.ShadowBuild
3642

3743
@RunWith(AndroidJUnit4::class)
3844
@Config(sdk = [Build.VERSION_CODES.TIRAMISU])
@@ -41,6 +47,7 @@ class SystemEventsBreadcrumbsIntegrationTest {
4147
val context = mock<Context>()
4248
var options = SentryAndroidOptions()
4349
val scopes = mock<IScopes>()
50+
lateinit var shadowActivityManager: ShadowActivityManager
4451

4552
fun getSut(
4653
enableSystemEventBreadcrumbs: Boolean = true,
@@ -64,6 +71,9 @@ class SystemEventsBreadcrumbsIntegrationTest {
6471
fun `set up`() {
6572
AppState.getInstance().resetInstance()
6673
AppState.getInstance().registerLifecycleObserver(fixture.options)
74+
ShadowBuild.reset()
75+
val activityManager = ApplicationProvider.getApplicationContext<Context>().getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager?
76+
fixture.shadowActivityManager = Shadow.extract(activityManager)
6777
}
6878

6979
@AfterTest
@@ -501,4 +511,16 @@ class SystemEventsBreadcrumbsIntegrationTest {
501511

502512
assertNull(sut.receiver)
503513
}
514+
515+
@Test
516+
fun `when integration is registered in background, receiver is registered`() {
517+
val process = RunningAppProcessInfo().apply { this.importance = RunningAppProcessInfo.IMPORTANCE_CACHED }
518+
val processes = mutableListOf(process)
519+
fixture.shadowActivityManager.setProcesses(processes)
520+
521+
val sut = fixture.getSut()
522+
sut.register(fixture.scopes, fixture.options)
523+
524+
assertNull(sut.receiver)
525+
}
504526
}

0 commit comments

Comments
 (0)