99use DDTrace \FeatureFlags \EvaluationReason ;
1010use DDTrace \FeatureFlags \EvaluationType ;
1111use DDTrace \FeatureFlags \Internal \Evaluator ;
12- use DDTrace \FeatureFlags \Internal \NativeEvaluator ;
1312use DDTrace \FeatureFlags \Internal \UnavailableEvaluator ;
1413use DDTrace \Log \LoggerInterface ;
1514use DDTrace \Log \LogLevel ;
@@ -101,7 +100,7 @@ public function testEvaluationContextIsNormalizedForDatadogClient(): void
101100 public function testUnavailableRuntimeReturnsDefaultDetailsAndOneWarning (): void
102101 {
103102 $ logger = new OpenFeatureRecordingLogger ();
104- $ client = $ this ->openFeatureClientFor (new DataDogProvider ( $ logger ));
103+ $ client = $ this ->openFeatureClientFor ($ this -> providerForEvaluator ( new UnavailableEvaluator (), $ logger ));
105104
106105 $ value = $ client ->getBooleanValue ('checkout.enabled ' , true );
107106 $ details = $ client ->getStringDetails ('checkout.copy ' , 'fallback ' );
@@ -110,10 +109,7 @@ public function testUnavailableRuntimeReturnsDefaultDetailsAndOneWarning(): void
110109 self ::assertSame ('fallback ' , $ details ->getValue ());
111110 self ::assertSame (Reason::ERROR , $ details ->getReason ());
112111 self ::assertSame (ErrorCode::PROVIDER_NOT_READY ()->getValue (), $ details ->getError ()->getResolutionErrorCode ()->getValue ());
113- self ::assertContains ($ details ->getError ()->getResolutionErrorMessage (), [
114- NativeEvaluator::WARNING_MESSAGE ,
115- UnavailableEvaluator::WARNING_MESSAGE ,
116- ]);
112+ self ::assertSame (UnavailableEvaluator::WARNING_MESSAGE , $ details ->getError ()->getResolutionErrorMessage ());
117113 self ::assertSame ([$ details ->getError ()->getResolutionErrorMessage ()], $ logger ->warnings ());
118114 }
119115
@@ -133,6 +129,26 @@ public function testProviderWarningIsEmittedOncePerProvider(): void
133129 self ::assertSame (['temporary unavailable ' ], $ logger ->warnings ());
134130 }
135131
132+ public function testThrowingLoggerDoesNotChangeProviderNotReadyEvaluation (): void
133+ {
134+ $ evaluator = new OpenFeatureTestEvaluator ();
135+ $ evaluator ->setUnavailable ('preview.flag ' , false , 'runtime unavailable ' );
136+ $ logger = new OpenFeatureThrowingLogger ();
137+ $ client = $ this ->openFeatureClientFor ($ this ->providerForEvaluator ($ evaluator , $ logger ));
138+
139+ $ firstDetails = $ client ->getBooleanDetails ('preview.flag ' , false );
140+ $ secondDetails = $ client ->getBooleanDetails ('preview.flag ' , false );
141+
142+ self ::assertFalse ($ firstDetails ->getValue ());
143+ self ::assertSame (Reason::ERROR , $ firstDetails ->getReason ());
144+ self ::assertSame (
145+ ErrorCode::PROVIDER_NOT_READY ()->getValue (),
146+ $ firstDetails ->getError ()->getResolutionErrorCode ()->getValue ()
147+ );
148+ self ::assertFalse ($ secondDetails ->getValue ());
149+ self ::assertSame (1 , $ logger ->warningCount ());
150+ }
151+
136152 public function testProviderErrorsMapToOpenFeatureDetails (): void
137153 {
138154 $ evaluator = new OpenFeatureTestEvaluator ();
@@ -186,13 +202,19 @@ public function setSuccess(
186202 string $ flagKey ,
187203 mixed $ value ,
188204 string $ reason = EvaluationReason::STATIC_REASON ,
189- ?string $ variant = null
205+ ?string $ variant = null ,
206+ array $ providerState = []
190207 ): self {
191208 $ this ->details [$ flagKey ] = new EvaluationDetails (
192209 $ value ,
193210 $ this ->typeForValue ($ value ),
194211 $ reason ,
195- $ variant
212+ $ variant ,
213+ null ,
214+ null ,
215+ [],
216+ [],
217+ $ providerState
196218 );
197219
198220 return $ this ;
@@ -336,4 +358,33 @@ public function warnings(): array
336358 return $ this ->warnings ;
337359 }
338360}
361+
362+ final class OpenFeatureThrowingLogger implements LoggerInterface
363+ {
364+ private int $ warningCount = 0 ;
365+
366+ public function debug ($ message , array $ context = [])
367+ {
368+ }
369+
370+ public function warning ($ message , array $ context = [])
371+ {
372+ ++$ this ->warningCount ;
373+ throw new \ErrorException ($ message );
374+ }
375+
376+ public function error ($ message , array $ context = [])
377+ {
378+ }
379+
380+ public function isLevelActive ($ level )
381+ {
382+ return true ;
383+ }
384+
385+ public function warningCount (): int
386+ {
387+ return $ this ->warningCount ;
388+ }
389+ }
339390}
0 commit comments