diff --git a/Provider/src/main/java/com/spotify/confidence/ConfidenceFlagEvaluation.kt b/Provider/src/main/java/com/spotify/confidence/ConfidenceFlagEvaluation.kt index b64c390e..5c8569a0 100644 --- a/Provider/src/main/java/com/spotify/confidence/ConfidenceFlagEvaluation.kt +++ b/Provider/src/main/java/com/spotify/confidence/ConfidenceFlagEvaluation.kt @@ -36,15 +36,6 @@ internal fun FlagResolution?.getEvaluation( ) } - // handle stale case - if (this.context != context) { - return Evaluation( - value = defaultValue, - reason = resolvedFlag.reason, - errorCode = ErrorCode.RESOLVE_STALE - ) - } - // handle flag found val flagValue = resolvedFlag.value val resolvedValue: ConfidenceValue = @@ -61,9 +52,14 @@ internal fun FlagResolution?.getEvaluation( return when (resolvedFlag.reason) { ResolveReason.RESOLVE_REASON_MATCH -> { val value = getTyped(resolvedValue) ?: defaultValue + val resolveReason = if (this.context != context) { + ResolveReason.RESOLVE_REASON_STALE + } else { + resolvedFlag.reason + } return Evaluation( value = value, - reason = resolvedFlag.reason, + reason = resolveReason, variant = resolvedFlag.variant ) } diff --git a/Provider/src/test/java/com/spotify/confidence/ConfidenceFeatureProviderTests.kt b/Provider/src/test/java/com/spotify/confidence/ConfidenceFeatureProviderTests.kt index a02402c4..f5744ffc 100644 --- a/Provider/src/test/java/com/spotify/confidence/ConfidenceFeatureProviderTests.kt +++ b/Provider/src/test/java/com/spotify/confidence/ConfidenceFeatureProviderTests.kt @@ -543,6 +543,52 @@ internal class ConfidenceFeatureProviderTests { assertNull(evalString2.errorCode) } + @Test + fun testStaleValueReturnValueAndStaleReason() = runTest { + val testDispatcher = UnconfinedTestDispatcher(testScheduler) + val mockConfidence = getConfidence(testDispatcher) + val eventHandler = EventHandler(testDispatcher) + val confidenceFeatureProvider = ConfidenceFeatureProvider.create( + context = mockContext, + eventHandler = eventHandler, + confidence = mockConfidence, + dispatcher = testDispatcher + ) + val context = ImmutableContext("foo").toConfidenceContext().map + whenever(flagResolverClient.resolve(eq(listOf()), eq(context))).thenReturn( + Result.Success( + FlagResolution( + context, + resolvedFlags.list, + "token1" + ) + ) + ) + + val evaluationContext = ImmutableContext("foo") + confidenceFeatureProvider.initialize(evaluationContext) + advanceUntilIdle() + + verify(flagResolverClient, times(1)).resolve(any(), eq(context)) + + val evalString = confidenceFeatureProvider.getStringEvaluation( + "test-kotlin-flag-1.mystring", + "default", + evaluationContext + ) + assertEquals(evalString.reason, Reason.TARGETING_MATCH.name) + assertEquals(evalString.value, "red") + + mockConfidence.putContext("hello", ConfidenceValue.String("new context")) + val newContextEval = confidenceFeatureProvider.getStringEvaluation( + "test-kotlin-flag-1.mystring", + "default", + evaluationContext + ) + assertEquals(newContextEval.reason, Reason.STALE.name) + assertEquals(newContextEval.value, "red") + } + @Test fun testApplyFromStoredCache() = runTest { val cacheFile = File(mockContext.filesDir, APPLY_FILE_NAME)