Skip to content

Commit a913a5c

Browse files
committed
hasFlags and tests
1 parent 4478372 commit a913a5c

File tree

3 files changed

+118
-1
lines changed

3 files changed

+118
-1
lines changed

features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/repository/DefaultFlagsRepository.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ internal class DefaultFlagsRepository(
8787
return atomicState.get()?.context
8888
}
8989

90-
@Suppress("ReturnCount")
90+
override fun hasFlags(): Boolean = atomicState.get()?.flags?.isNotEmpty() ?: false
91+
9192
override fun getPrecomputedFlagWithContext(key: String): Pair<PrecomputedFlag, EvaluationContext>? {
9293
waitForPersistenceLoad()
9394
val state = atomicState.get() ?: return null

features/dd-sdk-android-flags/src/main/kotlin/com/datadog/android/flags/internal/repository/FlagsRepository.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,5 @@ internal interface FlagsRepository {
1616
fun getEvaluationContext(): EvaluationContext?
1717
fun setFlagsAndContext(context: EvaluationContext, flags: Map<String, PrecomputedFlag>)
1818
fun getPrecomputedFlagWithContext(key: String): Pair<PrecomputedFlag, EvaluationContext>?
19+
fun hasFlags(): Boolean
1920
}

features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/repository/DefaultFlagsRepositoryTest.kt

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,4 +184,119 @@ internal class DefaultFlagsRepositoryTest {
184184
// Then
185185
assertThat(result?.variationValue).isEqualTo(flagValue)
186186
}
187+
188+
// region hasFlags
189+
190+
@Test
191+
fun `M return expected value W hasFlags() { for various states }`(forge: Forge) {
192+
data class TestCase(
193+
val given: () -> Unit,
194+
val then: Boolean
195+
)
196+
197+
val testCases = listOf(
198+
TestCase(
199+
given = { /* no state set */ },
200+
then = false
201+
),
202+
TestCase(
203+
given = {
204+
testedRepository.setFlagsAndContext(
205+
EvaluationContext(forge.anAlphabeticalString(), emptyMap()),
206+
emptyMap()
207+
)
208+
},
209+
then = false
210+
),
211+
TestCase(
212+
given = {
213+
testedRepository.setFlagsAndContext(
214+
EvaluationContext(forge.anAlphabeticalString(), emptyMap()),
215+
mapOf(
216+
forge.anAlphabeticalString() to PrecomputedFlag(
217+
variationType = "string",
218+
variationValue = forge.anAlphabeticalString(),
219+
doLog = false,
220+
allocationKey = forge.anAlphabeticalString(),
221+
variationKey = forge.anAlphabeticalString(),
222+
extraLogging = JSONObject(),
223+
reason = "DEFAULT"
224+
)
225+
)
226+
)
227+
},
228+
then = true
229+
),
230+
TestCase(
231+
given = {
232+
testedRepository.setFlagsAndContext(
233+
EvaluationContext(forge.anAlphabeticalString(), emptyMap()),
234+
mapOf(
235+
forge.anAlphabeticalString() to PrecomputedFlag(
236+
variationType = "string",
237+
variationValue = forge.anAlphabeticalString(),
238+
doLog = false,
239+
allocationKey = forge.anAlphabeticalString(),
240+
variationKey = forge.anAlphabeticalString(),
241+
extraLogging = JSONObject(),
242+
reason = "DEFAULT"
243+
),
244+
forge.anAlphabeticalString() to PrecomputedFlag(
245+
variationType = "boolean",
246+
variationValue = "true",
247+
doLog = false,
248+
allocationKey = forge.anAlphabeticalString(),
249+
variationKey = forge.anAlphabeticalString(),
250+
extraLogging = JSONObject(),
251+
reason = "TARGETING_MATCH"
252+
)
253+
)
254+
)
255+
},
256+
then = true
257+
)
258+
)
259+
260+
testCases.forEach { testCase ->
261+
// Given
262+
testCase.given()
263+
264+
// When
265+
val result = testedRepository.hasFlags()
266+
267+
// Then
268+
assertThat(result).isEqualTo(testCase.then)
269+
}
270+
}
271+
272+
@Test
273+
fun `M not block W hasFlags() { persistence still loading }`() {
274+
// Given
275+
val startTime = System.currentTimeMillis()
276+
doAnswer {
277+
// Never call the callback - simulate slow persistence
278+
null
279+
}.whenever(mockDataStore).value<FlagsStateEntry>(
280+
key = any(),
281+
version = any(),
282+
callback = any(),
283+
deserializer = any()
284+
)
285+
val slowRepository = DefaultFlagsRepository(
286+
featureSdkCore = mockFeatureSdkCore,
287+
dataStore = mockDataStore,
288+
instanceName = "slow",
289+
persistenceLoadTimeoutMs = 1000L // Long timeout
290+
)
291+
292+
// When
293+
val result = slowRepository.hasFlags()
294+
val elapsedTime = System.currentTimeMillis() - startTime
295+
296+
// Then
297+
assertThat(result).isFalse
298+
assertThat(elapsedTime).isLessThan(100L) // Should not wait for persistence
299+
}
300+
301+
// endregion
187302
}

0 commit comments

Comments
 (0)