Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ dependencies {
implementation 'androidx.annotation:annotation:1.5.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4'
implementation 'androidx.compose.runtime:runtime'
api 'com.rokt:roktsdk:4.14.2'
api 'com.rokt:roktsdk:4.14.3'

testImplementation files('libs/java-json.jar')
testImplementation 'com.squareup.assertj:assertj-android:1.2.0'
Expand Down
19 changes: 19 additions & 0 deletions src/main/kotlin/com/mparticle/kits/RoktKit.kt
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.launch
import java.lang.ref.WeakReference
import java.math.BigDecimal
import java.net.URL

const val ROKT_ATTRIBUTE_SANDBOX_MODE: String = "sandbox"

Expand Down Expand Up @@ -90,6 +91,8 @@ class RoktKit :
val mappedLogLevel = Logger.getMinLogLevel().toRoktLogLevel()
Rokt.setLogLevel(mappedLogLevel)

applyCustomBaseURLIfSet()

Rokt.init(
roktTagId = roktTagId,
appVersion = info.versionName,
Expand Down Expand Up @@ -176,6 +179,22 @@ class RoktKit :

private fun throwOnKitCreateError(message: String): Unit = throw IllegalArgumentException(message)

/**
* Reads `customBaseURL` from the mParticle network options and forwards it to the
* Rokt SDK as a CNAME override. No-op if MParticle is uninitialized, the host is
* absent, or it's an empty string.
*/
private fun applyCustomBaseURLIfSet() {
val customBaseURL = MParticle.getInstance()
?.Internal()
?.configManager
?.networkOptions
?.customBaseURL
if (!customBaseURL.isNullOrEmpty()) {
Rokt.setCustomBaseURL(URL("https://$customBaseURL"))
}
}

/*
For more details, visit the official documentation:
https://docs.rokt.com/developers/integration-guides/android/how-to/adding-a-placement/
Expand Down
102 changes: 102 additions & 0 deletions src/test/kotlin/com/mparticle/kits/RoktKitTests.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@ import io.mockk.every
import io.mockk.just
import io.mockk.mockk
import io.mockk.mockkObject
import io.mockk.mockkStatic
import io.mockk.runs
import io.mockk.slot
import io.mockk.unmockkObject
import io.mockk.unmockkStatic
import io.mockk.verify
import io.mockk.verifyOrder
import kotlinx.coroutines.flow.first
Expand Down Expand Up @@ -1503,4 +1505,104 @@ class RoktKitTests {
method.isAccessible = true
assertEquals(RoktLogLevel.NONE, method.invoke(roktKit, MParticle.LogLevel.NONE))
}

// MARK: - applyCustomBaseURLIfSet

private fun invokeApplyCustomBaseURLIfSet() {
val method = RoktKit::class.java.getDeclaredMethod("applyCustomBaseURLIfSet")
method.isAccessible = true
method.invoke(roktKit)
}

private fun stubNetworkOptionsCustomBaseURL(customBaseURL: String?): com.mparticle.networking.NetworkOptions {
val mockInternal = mock(MParticle.Internal::class.java)
val mockConfigManager = mock(com.mparticle.internal.ConfigManager::class.java)
val mockNetworkOptions = mock(com.mparticle.networking.NetworkOptions::class.java)
Mockito.`when`(MParticle.getInstance()?.Internal()).thenReturn(mockInternal)
Mockito.`when`(mockInternal.configManager).thenReturn(mockConfigManager)
Mockito.`when`(mockConfigManager.networkOptions).thenReturn(mockNetworkOptions)
Mockito.`when`(mockNetworkOptions.customBaseURL).thenReturn(customBaseURL)
return mockNetworkOptions
}

@Test
fun applyCustomBaseURLIfSet_whenHostIsSet_forwardsHttpsURLToRokt() {
stubNetworkOptionsCustomBaseURL("rkt.example.com")
mockkStatic(Rokt::class)
every { Rokt.setCustomBaseURL(any()) } just runs

invokeApplyCustomBaseURLIfSet()

verify(exactly = 1) {
Rokt.setCustomBaseURL(java.net.URL("https://rkt.example.com"))
}
unmockkStatic(Rokt::class)
}

@Test
fun applyCustomBaseURLIfSet_whenHostHasPort_preservesPortInURL() {
stubNetworkOptionsCustomBaseURL("rkt.example.com:8443")
mockkStatic(Rokt::class)
every { Rokt.setCustomBaseURL(any()) } just runs

invokeApplyCustomBaseURLIfSet()

verify(exactly = 1) {
Rokt.setCustomBaseURL(java.net.URL("https://rkt.example.com:8443"))
}
unmockkStatic(Rokt::class)
}

@Test
fun applyCustomBaseURLIfSet_whenHostIsNull_doesNotCallRokt() {
stubNetworkOptionsCustomBaseURL(null)
mockkStatic(Rokt::class)
every { Rokt.setCustomBaseURL(any()) } just runs

invokeApplyCustomBaseURLIfSet()

verify(exactly = 0) { Rokt.setCustomBaseURL(any()) }
unmockkStatic(Rokt::class)
}

@Test
fun applyCustomBaseURLIfSet_whenHostIsEmpty_doesNotCallRokt() {
stubNetworkOptionsCustomBaseURL("")
mockkStatic(Rokt::class)
every { Rokt.setCustomBaseURL(any()) } just runs

invokeApplyCustomBaseURLIfSet()

verify(exactly = 0) { Rokt.setCustomBaseURL(any()) }
unmockkStatic(Rokt::class)
}

@Test
fun applyCustomBaseURLIfSet_whenNetworkOptionsIsNull_doesNotCallRokt() {
val mockInternal = mock(MParticle.Internal::class.java)
val mockConfigManager = mock(com.mparticle.internal.ConfigManager::class.java)
Mockito.`when`(MParticle.getInstance()?.Internal()).thenReturn(mockInternal)
Mockito.`when`(mockInternal.configManager).thenReturn(mockConfigManager)
Mockito.`when`(mockConfigManager.networkOptions).thenReturn(null)

mockkStatic(Rokt::class)
every { Rokt.setCustomBaseURL(any()) } just runs

invokeApplyCustomBaseURLIfSet()

verify(exactly = 0) { Rokt.setCustomBaseURL(any()) }
unmockkStatic(Rokt::class)
}

@Test
fun applyCustomBaseURLIfSet_whenMParticleInstanceIsNull_doesNotCallRokt() {
MParticle.setInstance(null)
mockkStatic(Rokt::class)
every { Rokt.setCustomBaseURL(any()) } just runs

invokeApplyCustomBaseURLIfSet()

verify(exactly = 0) { Rokt.setCustomBaseURL(any()) }
unmockkStatic(Rokt::class)
}
}
Loading