@@ -2600,6 +2600,174 @@ def _ready_callback(self, metadata):
26002600 def _timeout_callback (self , metadata ):
26012601 self .timeout_flag = True
26022602
2603+ class InMemoryEventsNotificationAsyncTests (object ):
2604+ """Inmemory storage-based events notification tests."""
2605+
2606+ ready_flag = False
2607+ timeout_flag = False
2608+
2609+ @pytest .mark .asyncio
2610+ async def test_sdk_timeout_fire (self ):
2611+ """Prepare storages with test data."""
2612+ factory2 = await get_factory_async ('some_api_key' )
2613+ client = factory2 .client ()
2614+ await client .on (SdkEvent .SDK_READY_TIMED_OUT , self ._timeout_callback )
2615+ try :
2616+ await factory2 .block_until_ready (1 )
2617+ except Exception as e :
2618+ pass
2619+
2620+ await asyncio .sleep (1 )
2621+ assert self .timeout_flag
2622+
2623+ """Shut down the factory."""
2624+ await factory2 .destroy ()
2625+
2626+ @pytest .mark .asyncio
2627+ async def test_sdk_ready (self ):
2628+ """Prepare storages with test data."""
2629+ events_queue = asyncio .Queue ()
2630+ split_storage = InMemorySplitStorageAsync (events_queue )
2631+ segment_storage = InMemorySegmentStorageAsync (events_queue )
2632+ rb_segment_storage = InMemoryRuleBasedSegmentStorageAsync (events_queue )
2633+
2634+ split_fn = os .path .join (os .path .dirname (__file__ ), 'files' , 'splitChanges.json' )
2635+ with open (split_fn , 'r' ) as flo :
2636+ data = json .loads (flo .read ())
2637+ for split in data ['ff' ]['d' ]:
2638+ await split_storage .update ([splits .from_raw (split )], [], 0 )
2639+
2640+ for rbs in data ['rbs' ]['d' ]:
2641+ await rb_segment_storage .update ([rule_based_segments .from_raw (rbs )], [], 0 )
2642+
2643+ segment_fn = os .path .join (os .path .dirname (__file__ ), 'files' , 'segmentEmployeesChanges.json' )
2644+ with open (segment_fn , 'r' ) as flo :
2645+ data = json .loads (flo .read ())
2646+ await segment_storage .put (segments .from_raw (data ))
2647+
2648+ segment_fn = os .path .join (os .path .dirname (__file__ ), 'files' , 'segmentHumanBeignsChanges.json' )
2649+ with open (segment_fn , 'r' ) as flo :
2650+ data = json .loads (flo .read ())
2651+ await segment_storage .put (segments .from_raw (data ))
2652+
2653+ telemetry_storage = await InMemoryTelemetryStorageAsync .create ()
2654+ telemetry_producer = TelemetryStorageProducerAsync (telemetry_storage )
2655+ telemetry_runtime_producer = telemetry_producer .get_telemetry_runtime_producer ()
2656+ telemetry_evaluation_producer = telemetry_producer .get_telemetry_evaluation_producer ()
2657+
2658+ storages = {
2659+ 'splits' : split_storage ,
2660+ 'segments' : segment_storage ,
2661+ 'rule_based_segments' : rb_segment_storage ,
2662+ 'impressions' : InMemoryImpressionStorageAsync (5000 , telemetry_runtime_producer ),
2663+ 'events' : InMemoryEventStorageAsync (5000 , telemetry_runtime_producer ),
2664+ }
2665+ impmanager = ImpressionsManager (StrategyDebugMode (), StrategyNoneMode (), telemetry_runtime_producer ) # no listener
2666+ recorder = StandardRecorderAsync (impmanager , storages ['events' ], storages ['impressions' ], telemetry_evaluation_producer , telemetry_runtime_producer , imp_counter = ImpressionsCounter ())
2667+ events_manager = EventsManagerAsync (EventsManagerConfig (), EventsDelivery ())
2668+ internal_events_task = EventsTaskAsync (events_manager .notify_internal_event , events_queue )
2669+
2670+ # Since we are passing None as SDK_Ready event, the factory will use the Redis telemetry call, using try catch to ignore the exception.
2671+ try :
2672+ factory = SplitFactoryAsync ('some_api_key' ,
2673+ storages ,
2674+ True ,
2675+ recorder ,
2676+ events_queue ,
2677+ events_manager ,
2678+ None ,
2679+ telemetry_producer = telemetry_producer ,
2680+ telemetry_init_producer = telemetry_producer .get_telemetry_init_producer (),
2681+ fallback_treatment_calculator = FallbackTreatmentCalculator (FallbackTreatmentsConfiguration (None , {'fallback_feature' : FallbackTreatment ("on-local" , '{"prop": "val"}' )}))
2682+ ) # pylint:disable=attribute-defined-outside-init
2683+ internal_events_task .start ()
2684+ except :
2685+ pass
2686+
2687+ client = factory .client ()
2688+ await client .on (SdkEvent .SDK_READY , self ._ready_callback )
2689+ await factory .block_until_ready (5 )
2690+ assert self .ready_flag
2691+
2692+ """Shut down the factory."""
2693+ await internal_events_task .stop ()
2694+ await factory .destroy ()
2695+
2696+ @pytest .mark .asyncio
2697+ async def test_sdk_ready_fire_later (self ):
2698+ """Prepare storages with test data."""
2699+ events_queue = asyncio .Queue ()
2700+ split_storage = InMemorySplitStorageAsync (events_queue )
2701+ segment_storage = InMemorySegmentStorageAsync (events_queue )
2702+ rb_segment_storage = InMemoryRuleBasedSegmentStorageAsync (events_queue )
2703+
2704+ split_fn = os .path .join (os .path .dirname (__file__ ), 'files' , 'splitChanges.json' )
2705+ with open (split_fn , 'r' ) as flo :
2706+ data = json .loads (flo .read ())
2707+ for split in data ['ff' ]['d' ]:
2708+ await split_storage .update ([splits .from_raw (split )], [], 0 )
2709+
2710+ for rbs in data ['rbs' ]['d' ]:
2711+ await rb_segment_storage .update ([rule_based_segments .from_raw (rbs )], [], 0 )
2712+
2713+ segment_fn = os .path .join (os .path .dirname (__file__ ), 'files' , 'segmentEmployeesChanges.json' )
2714+ with open (segment_fn , 'r' ) as flo :
2715+ data = json .loads (flo .read ())
2716+ await segment_storage .put (segments .from_raw (data ))
2717+
2718+ segment_fn = os .path .join (os .path .dirname (__file__ ), 'files' , 'segmentHumanBeignsChanges.json' )
2719+ with open (segment_fn , 'r' ) as flo :
2720+ data = json .loads (flo .read ())
2721+ await segment_storage .put (segments .from_raw (data ))
2722+
2723+ telemetry_storage = await InMemoryTelemetryStorageAsync .create ()
2724+ telemetry_producer = TelemetryStorageProducerAsync (telemetry_storage )
2725+ telemetry_runtime_producer = telemetry_producer .get_telemetry_runtime_producer ()
2726+ telemetry_evaluation_producer = telemetry_producer .get_telemetry_evaluation_producer ()
2727+
2728+ storages = {
2729+ 'splits' : split_storage ,
2730+ 'segments' : segment_storage ,
2731+ 'rule_based_segments' : rb_segment_storage ,
2732+ 'impressions' : InMemoryImpressionStorageAsync (5000 , telemetry_runtime_producer ),
2733+ 'events' : InMemoryEventStorageAsync (5000 , telemetry_runtime_producer ),
2734+ }
2735+ impmanager = ImpressionsManager (StrategyDebugMode (), StrategyNoneMode (), telemetry_runtime_producer ) # no listener
2736+ recorder = StandardRecorderAsync (impmanager , storages ['events' ], storages ['impressions' ], telemetry_evaluation_producer , telemetry_runtime_producer , imp_counter = ImpressionsCounter ())
2737+ events_manager = EventsManagerAsync (EventsManagerConfig (), EventsDelivery ())
2738+ internal_events_task = EventsTaskAsync (events_manager .notify_internal_event , events_queue )
2739+
2740+ # Since we are passing None as SDK_Ready event, the factory will use the Redis telemetry call, using try catch to ignore the exception.
2741+ try :
2742+ factory = SplitFactoryAsync ('some_api_key' ,
2743+ storages ,
2744+ True ,
2745+ recorder ,
2746+ events_queue ,
2747+ events_manager ,
2748+ None ,
2749+ telemetry_producer = telemetry_producer ,
2750+ telemetry_init_producer = telemetry_producer .get_telemetry_init_producer (),
2751+ fallback_treatment_calculator = FallbackTreatmentCalculator (FallbackTreatmentsConfiguration (None , {'fallback_feature' : FallbackTreatment ("on-local" , '{"prop": "val"}' )}))
2752+ ) # pylint:disable=attribute-defined-outside-init
2753+ internal_events_task .start ()
2754+ except :
2755+ pass
2756+
2757+ client = factory .client ()
2758+ await factory .block_until_ready (5 )
2759+ await client .on (SdkEvent .SDK_READY , self ._ready_callback )
2760+
2761+ """Shut down the factory."""
2762+ await internal_events_task .stop ()
2763+ await factory .destroy ()
2764+
2765+ async def _ready_callback (self , metadata ):
2766+ self .ready_flag = True
2767+
2768+ async def _timeout_callback (self , metadata ):
2769+ self .timeout_flag = True
2770+
26032771class InMemoryIntegrationAsyncTests (object ):
26042772 """Inmemory storage-based integration tests."""
26052773
0 commit comments