Skip to content

Commit 8a0762a

Browse files
committed
update tests
1 parent 1f0327d commit 8a0762a

File tree

3 files changed

+25
-40
lines changed

3 files changed

+25
-40
lines changed

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,7 @@ internal class FlagsStateManager(
7474
synchronized(currentState) {
7575
subscription.addListener(listener)
7676

77-
// Capture current state before submitting to executor to avoid race condition
7877
val stateToEmit = currentState
79-
80-
// Emit current state to new listener
8178
executorService.executeSafe(
8279
operationName = NOTIFY_NEW_LISTENER_OPERATION_NAME,
8380
internalLogger = internalLogger

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

Lines changed: 23 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -170,56 +170,42 @@ internal class FlagsStateManagerTest {
170170

171171
val executionOrder = mutableListOf<String>()
172172

173-
val listener1 = object : FlagsStateListener {
174-
override fun onStateChanged(newState: FlagsClientState) {
175-
if (newState is FlagsClientState.Ready) {
176-
synchronized(executionOrder) {
177-
executionOrder.add("listener1")
178-
}
179-
}
173+
// Creates a listener that adds start/end markers to the execution order and calls the additional block.
174+
fun createListener(
175+
name: String,
176+
additionalBlock: () -> Unit = {
180177
}
181-
}
182-
183-
val listener2 = object : FlagsStateListener {
178+
): FlagsStateListener = object : FlagsStateListener {
184179
override fun onStateChanged(newState: FlagsClientState) {
185180
if (newState is FlagsClientState.Ready) {
186181
synchronized(executionOrder) {
187-
executionOrder.add("listener2")
182+
executionOrder.add(name)
183+
additionalBlock()
184+
executionOrder.add("$name ended")
188185
}
189-
// Simulate a long-running listener
190-
Thread.sleep(5)
191186
}
192187
}
193188
}
194189

195-
val listener3 = object : FlagsStateListener {
196-
override fun onStateChanged(newState: FlagsClientState) {
197-
if (newState is FlagsClientState.Ready) {
198-
synchronized(executionOrder) {
199-
executionOrder.add("listener3")
200-
}
201-
throw RuntimeException("Listener 3 intentionally throws")
202-
}
203-
}
190+
val listener1 = createListener("listener1")
191+
val listener2 = createListener("listener2") {
192+
Thread.sleep(5)
204193
}
205-
206-
val listener4 = object : FlagsStateListener {
207-
override fun onStateChanged(newState: FlagsClientState) {
208-
if (newState is FlagsClientState.Ready) {
209-
synchronized(executionOrder) {
210-
executionOrder.add("listener4")
211-
}
212-
}
213-
}
194+
val listener3 = createListener("listener3") {
195+
throw RuntimeException("Listener 3 intentionally throws")
214196
}
197+
val listener4 = createListener("listener4")
215198

216199
managerWithRealExecutor.addListener(listener1)
217200
managerWithRealExecutor.addListener(listener2)
218201
managerWithRealExecutor.addListener(listener3)
219202
managerWithRealExecutor.addListener(listener4)
220203

221204
// When
222-
managerWithRealExecutor.updateState(FlagsClientState.Ready)
205+
synchronized(executionOrder) {
206+
managerWithRealExecutor.updateState(FlagsClientState.Ready)
207+
executionOrder.add("updateState")
208+
}
223209

224210
// Then - immediately check that state is correct (even while listeners are running)
225211
assertThat(managerWithRealExecutor.getCurrentState()).isEqualTo(FlagsClientState.Ready)
@@ -231,10 +217,14 @@ internal class FlagsStateManagerTest {
231217
// Then - all listeners should have been called in order, despite listener3 throwing
232218
synchronized(executionOrder) {
233219
assertThat(executionOrder).containsExactly(
220+
"updateState",
234221
"listener1",
222+
"listener1 ended",
235223
"listener2",
224+
"listener2 ended",
236225
"listener3",
237-
"listener4"
226+
"listener4",
227+
"listener4 ended"
238228
)
239229
}
240230
}

features/dd-sdk-android-flags/src/test/kotlin/com/datadog/android/flags/internal/evaluation/EvaluationsManagerTest.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,15 +363,14 @@ internal class EvaluationsManagerTest {
363363

364364
@Test
365365
fun `M have state READY when callback invoked W updateEvaluationsForContext() { success }`() {
366-
// Given - use a REAL FlagsStateManager to test actual behavior
366+
// Given
367367
val realExecutor = Executors.newSingleThreadExecutor()
368368
val realStateManager = FlagsStateManager(
369369
DDCoreSubscription.create(),
370370
realExecutor,
371371
mockInternalLogger
372372
)
373373

374-
// Create EvaluationsManager with real state manager
375374
val evaluationsManagerWithRealState = EvaluationsManager(
376375
executorService = mockExecutorService,
377376
internalLogger = mockInternalLogger,
@@ -389,7 +388,6 @@ internal class EvaluationsManagerTest {
389388

390389
val callback = object : EvaluationContextCallback {
391390
override fun onSuccess() {
392-
// Capture the ACTUAL state at the moment the callback is invoked
393391
stateWhenCallbackInvoked = realStateManager.getCurrentState()
394392
}
395393

@@ -404,7 +402,7 @@ internal class EvaluationsManagerTest {
404402
// When
405403
evaluationsManagerWithRealState.updateEvaluationsForContext(publicContext, callback = callback)
406404

407-
// Then - verify the ACTUAL state was READY when the callback was invoked
405+
// Then
408406
assertThat(stateWhenCallbackInvoked).isEqualTo(FlagsClientState.Ready)
409407

410408
// Cleanup

0 commit comments

Comments
 (0)