@@ -8,12 +8,15 @@ import io.sentry.ILogger
88import io.sentry.MainEventProcessor
99import io.sentry.SentryOptions
1010import io.sentry.android.core.cache.AndroidEnvelopeCache
11+ import io.sentry.android.core.internal.gestures.AndroidViewGestureTargetLocator
1112import io.sentry.android.core.internal.modules.AssetsModulesLoader
1213import io.sentry.android.core.internal.util.AndroidMainThreadChecker
1314import io.sentry.android.fragment.FragmentLifecycleIntegration
1415import io.sentry.android.timber.SentryTimberIntegration
16+ import io.sentry.compose.gestures.ComposeGestureTargetLocator
1517import org.junit.runner.RunWith
1618import org.mockito.kotlin.any
19+ import org.mockito.kotlin.eq
1720import org.mockito.kotlin.mock
1821import org.mockito.kotlin.whenever
1922import java.io.File
@@ -66,7 +69,7 @@ class AndroidOptionsInitializerTest {
6669
6770 fun initSutWithClassLoader (
6871 minApi : Int = 16,
69- classToLoad : Class < * > ? = null ,
72+ classesToLoad : List < String > = emptyList() ,
7073 isFragmentAvailable : Boolean = false,
7174 isTimberAvailable : Boolean = false
7275 ) {
@@ -89,7 +92,7 @@ class AndroidOptionsInitializerTest {
8992 sentryOptions,
9093 context,
9194 buildInfo,
92- createClassMock(classToLoad ),
95+ createClassMock(classesToLoad ),
9396 isFragmentAvailable,
9497 isTimberAvailable
9598 )
@@ -101,10 +104,14 @@ class AndroidOptionsInitializerTest {
101104 return buildInfo
102105 }
103106
104- private fun createClassMock (clazz : Class < * > ? ): LoadClass {
107+ private fun createClassMock (classes : List < String > ): LoadClass {
105108 val loadClassMock = mock<LoadClass >()
106- whenever(loadClassMock.loadClass(any(), any())).thenReturn(clazz)
107- whenever(loadClassMock.isClassAvailable(any(), any<ILogger >())).thenReturn(clazz != null )
109+ classes.forEach {
110+ whenever(loadClassMock.loadClass(eq(it), any()))
111+ .thenReturn(Class .forName(it, false , this ::class .java.classLoader))
112+ whenever(loadClassMock.isClassAvailable(eq(it), any<SentryOptions >()))
113+ .thenReturn(true )
114+ }
108115 return loadClassMock
109116 }
110117 }
@@ -267,23 +274,23 @@ class AndroidOptionsInitializerTest {
267274
268275 @Test
269276 fun `NdkIntegration will load SentryNdk class and add to the integration list` () {
270- fixture.initSutWithClassLoader(classToLoad = SentryNdk :: class .java )
277+ fixture.initSutWithClassLoader(classesToLoad = listOfNotNull( NdkIntegration . SENTRY_NDK_CLASS_NAME ) )
271278
272279 val actual = fixture.sentryOptions.integrations.firstOrNull { it is NdkIntegration }
273280 assertNotNull((actual as NdkIntegration ).sentryNdkClass)
274281 }
275282
276283 @Test
277284 fun `NdkIntegration won't be enabled because API is lower than 16` () {
278- fixture.initSutWithClassLoader(minApi = 14 , classToLoad = SentryNdk :: class .java )
285+ fixture.initSutWithClassLoader(minApi = 14 , classesToLoad = listOfNotNull( NdkIntegration . SENTRY_NDK_CLASS_NAME ) )
279286
280287 val actual = fixture.sentryOptions.integrations.firstOrNull { it is NdkIntegration }
281288 assertNull((actual as NdkIntegration ).sentryNdkClass)
282289 }
283290
284291 @Test
285292 fun `NdkIntegration won't be enabled, if class not found` () {
286- fixture.initSutWithClassLoader(classToLoad = null )
293+ fixture.initSutWithClassLoader(classesToLoad = emptyList() )
287294
288295 val actual = fixture.sentryOptions.integrations.firstOrNull { it is NdkIntegration }
289296 assertNull((actual as NdkIntegration ).sentryNdkClass)
@@ -455,4 +462,26 @@ class AndroidOptionsInitializerTest {
455462
456463 assertTrue { fixture.sentryOptions.mainThreadChecker is AndroidMainThreadChecker }
457464 }
465+
466+ @Test
467+ fun `does not install ComposeGestureTargetLocator, if sentry-compose is not available` () {
468+ fixture.initSutWithClassLoader()
469+
470+ assertTrue { fixture.sentryOptions.gestureTargetLocators.size == 1 }
471+ assertTrue { fixture.sentryOptions.gestureTargetLocators[0 ] is AndroidViewGestureTargetLocator }
472+ }
473+
474+ @Test
475+ fun `installs ComposeGestureTargetLocator, if sentry-compose is available` () {
476+ fixture.initSutWithClassLoader(
477+ classesToLoad = listOf (
478+ AndroidOptionsInitializer .COMPOSE_CLASS_NAME ,
479+ AndroidOptionsInitializer .SENTRY_COMPOSE_INTEGRATION_CLASS_NAME
480+ )
481+ )
482+
483+ assertTrue { fixture.sentryOptions.gestureTargetLocators.size == 2 }
484+ assertTrue { fixture.sentryOptions.gestureTargetLocators[0 ] is AndroidViewGestureTargetLocator }
485+ assertTrue { fixture.sentryOptions.gestureTargetLocators[1 ] is ComposeGestureTargetLocator }
486+ }
458487}
0 commit comments