@@ -743,3 +743,102 @@ func Test_DisableNotifierOnInit(t *testing.T) {
743
743
})
744
744
}
745
745
}
746
+
747
+ func TestMultipleDataExporters (t * testing.T ) {
748
+ // Create a client with multiple exporters
749
+ config := ffclient.Config {
750
+ PollingInterval : 5 * time .Second ,
751
+ Retriever : & fileretriever.Retriever {Path : "testdata/flag-config.yaml" },
752
+ LeveledLogger : slog .Default (),
753
+ // Main exporter (bulk)
754
+ DataExporter : ffclient.DataExporter {
755
+ FlushInterval : 2 * time .Second ,
756
+ MaxEventInMemory : 3 ,
757
+ Exporter : & mock.Exporter {
758
+ Bulk : true ,
759
+ },
760
+ },
761
+ // Additional exporters
762
+ DataExporters : []ffclient.DataExporter {
763
+ {
764
+ // Bulk exporter with different settings
765
+ FlushInterval : 5 * time .Second ,
766
+ MaxEventInMemory : 5 ,
767
+ Exporter : & mock.Exporter {
768
+ Bulk : true ,
769
+ },
770
+ },
771
+ {
772
+ // Non-bulk exporter
773
+ FlushInterval : 1 * time .Second , // Should be ignored
774
+ MaxEventInMemory : 1 , // Should be ignored
775
+ Exporter : & mock.Exporter {
776
+ Bulk : false ,
777
+ },
778
+ },
779
+ {
780
+ // Another bulk exporter
781
+ FlushInterval : 3 * time .Second ,
782
+ MaxEventInMemory : 4 ,
783
+ Exporter : & mock.Exporter {
784
+ Bulk : true ,
785
+ },
786
+ },
787
+ },
788
+ }
789
+
790
+ gffClient , err := ffclient .New (config )
791
+ assert .NoError (t , err )
792
+ defer gffClient .Close ()
793
+
794
+ // Create test user
795
+ user := ffcontext .NewEvaluationContext ("test-user" )
796
+
797
+ // Generate events to test exporters
798
+ // Phase 1: Generate 3 events (should trigger main exporter's MaxEventInMemory)
799
+ _ , _ = gffClient .BoolVariation ("test-flag" , user , false )
800
+ _ , _ = gffClient .BoolVariation ("test-flag" , user , false )
801
+ _ , _ = gffClient .BoolVariation ("test-flag" , user , false )
802
+
803
+ // Wait 1 second
804
+ time .Sleep (1 * time .Second )
805
+
806
+ // Phase 2: Generate 2 more events (should trigger secondary exporter's MaxEventInMemory)
807
+ _ , _ = gffClient .StringVariation ("unknown-flag" , user , "default1" )
808
+ _ , _ = gffClient .StringVariation ("unknown-flag" , user , "default2" )
809
+
810
+ // Wait 2 seconds (should trigger main exporter's FlushInterval)
811
+ time .Sleep (2 * time .Second )
812
+
813
+ // Phase 3: Generate 2 more events
814
+ _ , _ = gffClient .JSONVariation ("json-flag" , user , map [string ]interface {}{"test" : "value1" })
815
+ _ , _ = gffClient .JSONVariation ("json-flag" , user , map [string ]interface {}{"test" : "value2" })
816
+
817
+ // Wait 3 seconds (should trigger tertiary exporter's FlushInterval)
818
+ time .Sleep (3 * time .Second )
819
+
820
+ // Phase 4: Generate 1 final event
821
+ _ , _ = gffClient .JSONVariation ("json-flag" , user , map [string ]interface {}{"test" : "value3" })
822
+
823
+ // Wait 5 seconds (should trigger secondary exporter's FlushInterval)
824
+ time .Sleep (5 * time .Second )
825
+
826
+ // Verify that all exporters received events
827
+ for _ , de := range config .GetDataExporters () {
828
+ mockExporter , ok := de .Exporter .(* mock.Exporter )
829
+ assert .True (t , ok , "Exporter should be a mock exporter" )
830
+
831
+ if ! mockExporter .IsBulk () {
832
+ // Non-bulk exporter should have received each event immediately
833
+ assert .Equal (t , 8 , len (mockExporter .GetExportedEvents ()), "Non-bulk exporter should have received all events" )
834
+ } else {
835
+ // Bulk exporters should have received events in batches
836
+ events := mockExporter .GetExportedEvents ()
837
+ assert .Greater (t , len (events ), 0 , "Bulk exporter should have received some events" )
838
+ // Each batch should respect the MaxEventInMemory limit
839
+ for _ , event := range events {
840
+ assert .NotNil (t , event )
841
+ }
842
+ }
843
+ }
844
+ }
0 commit comments