Skip to content

Commit 4dc8131

Browse files
authored
Merge 6212a23 into c474edf
2 parents c474edf + 6212a23 commit 4dc8131

File tree

3 files changed

+108
-2
lines changed

3 files changed

+108
-2
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
### Fixes
66

7+
- Use `appLaunchedInForeground` to determine invalid app start data on Android ([#4146](https://github.com/getsentry/sentry-react-native/pull/4146))
78
- Emits Bridge log only in debug mode ([#4145](https://github.com/getsentry/sentry-react-native/pull/4145))
89

910
### Dependencies
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package io.sentry.react
2+
3+
import android.content.pm.PackageInfo
4+
import android.content.pm.PackageManager
5+
import com.facebook.react.bridge.Arguments
6+
import com.facebook.react.bridge.Promise
7+
import com.facebook.react.bridge.ReactApplicationContext
8+
import com.facebook.react.bridge.WritableMap
9+
import io.sentry.ILogger
10+
import io.sentry.SentryLevel
11+
import org.junit.After
12+
import org.junit.Assert.assertEquals
13+
import org.junit.Before
14+
import org.junit.Test
15+
import org.junit.runner.RunWith
16+
import org.junit.runners.JUnit4
17+
import org.mockito.ArgumentCaptor
18+
import org.mockito.Captor
19+
import org.mockito.Mockito.*
20+
import org.mockito.MockitoAnnotations
21+
import org.mockito.MockedStatic
22+
import org.mockito.Mockito.mockStatic
23+
import org.mockito.kotlin.whenever
24+
25+
@RunWith(JUnit4::class)
26+
class RNSentryModuleImplTest {
27+
28+
private lateinit var module: RNSentryModuleImpl
29+
private lateinit var promise: Promise
30+
private lateinit var logger: ILogger
31+
private var argumentsMock: MockedStatic<Arguments>? = null
32+
33+
@Captor
34+
private lateinit var writableMapCaptor: ArgumentCaptor<WritableMap>
35+
36+
37+
@Before
38+
fun setUp() {
39+
MockitoAnnotations.openMocks(this)
40+
val reactContext = mock(ReactApplicationContext::class.java)
41+
promise = mock(Promise::class.java)
42+
logger = mock(ILogger::class.java)
43+
val packageManager = mock(PackageManager::class.java)
44+
val packageInfo = mock(PackageInfo::class.java)
45+
46+
whenever(reactContext.packageManager).thenReturn(packageManager)
47+
whenever(packageManager.getPackageInfo(anyString(), anyInt())).thenReturn(packageInfo)
48+
49+
module = RNSentryModuleImpl(reactContext)
50+
51+
// Mock the Arguments class
52+
argumentsMock = mockStatic(Arguments::class.java)
53+
val writableMap = mock(WritableMap::class.java)
54+
whenever(Arguments.createMap()).thenReturn(writableMap)
55+
}
56+
57+
@After
58+
fun tearDown() {
59+
argumentsMock?.close()
60+
}
61+
62+
@Test
63+
fun `fetchNativeAppStart resolves promise with null when app is not launched in the foreground`() {
64+
// Mock the app start measurement
65+
val appStartMeasurement = mapOf<String, Any>()
66+
67+
// Call the method
68+
module.fetchNativeAppStart(promise, appStartMeasurement, logger, false)
69+
70+
// Verify a warning log is emitted
71+
verify(logger, org.mockito.kotlin.times(1)).log(
72+
SentryLevel.WARNING,
73+
"Invalid app start data: app not launched in foreground."
74+
)
75+
76+
// Verify the promise is resolved with null
77+
verify(promise).resolve(null)
78+
}
79+
80+
@Test
81+
fun `fetchNativeAppStart resolves promise with app start data when app is launched in the foreground`() {
82+
// Mock the app start measurement
83+
val appStartMeasurement = mapOf<String, Any>()
84+
85+
// Call the method
86+
module.fetchNativeAppStart(promise, appStartMeasurement, logger, true)
87+
88+
// Verify no logs are emitted
89+
verify(logger, org.mockito.kotlin.times(0)).log(any(), any())
90+
91+
// Verify the promise is resolved with the expected data
92+
verify(promise).resolve(any(WritableMap::class.java))
93+
verify(promise).resolve(writableMapCaptor.capture())
94+
val capturedMap = writableMapCaptor.value
95+
assertEquals(false, capturedMap.getBoolean("has_fetched"))
96+
}
97+
}

android/src/main/java/io/sentry/react/RNSentryModuleImpl.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -380,9 +380,17 @@ public void fetchNativeRelease(Promise promise) {
380380
}
381381

382382
public void fetchNativeAppStart(Promise promise) {
383-
final Map<String, Object> measurement = InternalSentrySdk.getAppStartMeasurement();
383+
fetchNativeAppStart(promise, InternalSentrySdk.getAppStartMeasurement(), logger, AppStartMetrics.getInstance().isAppLaunchedInForeground());
384+
}
385+
386+
protected void fetchNativeAppStart(Promise promise, final Map<String, Object> appStartMeasurement, ILogger logger, boolean isAppLaunchedInForeground) {
387+
if (!isAppLaunchedInForeground) {
388+
logger.log(SentryLevel.WARNING, "Invalid app start data: app not launched in foreground.");
389+
promise.resolve(null);
390+
return;
391+
}
384392

385-
WritableMap mutableMeasurement = (WritableMap) RNSentryMapConverter.convertToWritable(measurement);
393+
WritableMap mutableMeasurement = (WritableMap) RNSentryMapConverter.convertToWritable(appStartMeasurement);
386394
mutableMeasurement.putBoolean("has_fetched", hasFetchedAppStart);
387395

388396
// This is always set to true, as we would only allow an app start fetch to only

0 commit comments

Comments
 (0)