@@ -541,7 +541,58 @@ func TestAgentRun(t *testing.T) {
541
541
ProcessorFactory : pf ,
542
542
SinkFactory : sf ,
543
543
Logger : utils .Logger ,
544
- StopOnSinkError : true ,
544
+ StopOnSinkError : false ,
545
+ Monitor : monitor ,
546
+ })
547
+
548
+ run := r .Run (ctx , validRecipe )
549
+ assert .False (t , run .Success )
550
+ assert .Error (t , run .Error )
551
+ })
552
+
553
+ t .Run ("should return error when sink fails to close" , func (t * testing.T ) {
554
+ data := []models.Record {
555
+ models .NewRecord (& v1beta2.Asset {}),
556
+ }
557
+
558
+ extr := mocks .NewExtractor ()
559
+ extr .SetEmit (data )
560
+ extr .On ("Init" , mockCtx , buildPluginConfig (validRecipe .Source )).Return (nil ).Once ()
561
+ extr .On ("Extract" , mockCtx , mock .AnythingOfType ("plugins.Emit" )).Return (nil )
562
+ ef := registry .NewExtractorFactory ()
563
+ if err := ef .Register ("test-extractor" , newExtractor (extr )); err != nil {
564
+ t .Fatal (err )
565
+ }
566
+
567
+ proc := mocks .NewProcessor ()
568
+ proc .On ("Init" , mockCtx , buildPluginConfig (validRecipe .Processors [0 ])).Return (nil ).Once ()
569
+ proc .On ("Process" , mockCtx , data [0 ]).Return (data [0 ], nil )
570
+ defer proc .AssertExpectations (t )
571
+ pf := registry .NewProcessorFactory ()
572
+ if err := pf .Register ("test-processor" , newProcessor (proc )); err != nil {
573
+ t .Fatal (err )
574
+ }
575
+
576
+ sink := mocks .NewSink ()
577
+ sink .On ("Init" , mockCtx , buildPluginConfig (validRecipe .Sinks [0 ])).Return (nil ).Once ()
578
+ sink .On ("Sink" , mockCtx , data ).Return (nil )
579
+ sink .On ("Close" ).Return (errors .New ("some error" ))
580
+ defer sink .AssertExpectations (t )
581
+ sf := registry .NewSinkFactory ()
582
+ if err := sf .Register ("test-sink" , newSink (sink )); err != nil {
583
+ t .Fatal (err )
584
+ }
585
+
586
+ monitor := newMockMonitor ()
587
+ monitor .On ("RecordRun" , mock .AnythingOfType ("agent.Run" )).Once ()
588
+ defer monitor .AssertExpectations (t )
589
+
590
+ r := agent .NewAgent (agent.Config {
591
+ ExtractorFactory : ef ,
592
+ ProcessorFactory : pf ,
593
+ SinkFactory : sf ,
594
+ Logger : utils .Logger ,
595
+ StopOnSinkError : false ,
545
596
Monitor : monitor ,
546
597
})
547
598
@@ -671,6 +722,61 @@ func TestAgentRun(t *testing.T) {
671
722
assert .Equal (t , validRecipe , run .Recipe )
672
723
})
673
724
725
+ t .Run ("should retry if extractor returns retry error" , func (t * testing.T ) {
726
+ err := errors .New ("some-error" )
727
+ data := []models.Record {
728
+ models .NewRecord (& v1beta2.Asset {}),
729
+ }
730
+
731
+ extr := mocks .NewExtractor ()
732
+ extr .SetEmit (data )
733
+ extr .On ("Init" , mockCtx , buildPluginConfig (validRecipe .Source )).Return (nil ).Once ()
734
+ extr .On ("Extract" , mockCtx , mock .AnythingOfType ("plugins.Emit" )).Return (plugins .NewRetryError (err )).Twice ()
735
+ extr .On ("Extract" , mockCtx , mock .AnythingOfType ("plugins.Emit" )).Return (nil )
736
+ ef := registry .NewExtractorFactory ()
737
+ if err := ef .Register ("test-extractor" , newExtractor (extr )); err != nil {
738
+ t .Fatal (err )
739
+ }
740
+
741
+ proc := mocks .NewProcessor ()
742
+ proc .On ("Init" , mockCtx , buildPluginConfig (validRecipe .Processors [0 ])).Return (nil ).Once ()
743
+ proc .On ("Process" , mockCtx , data [0 ]).Return (data [0 ], nil )
744
+ defer proc .AssertExpectations (t )
745
+ pf := registry .NewProcessorFactory ()
746
+ if err := pf .Register ("test-processor" , newProcessor (proc )); err != nil {
747
+ t .Fatal (err )
748
+ }
749
+
750
+ sink := mocks .NewSink ()
751
+ sink .On ("Init" , mockCtx , buildPluginConfig (validRecipe .Sinks [0 ])).Return (nil ).Once ()
752
+ sink .On ("Sink" , mockCtx , data ).Return (nil )
753
+ sink .On ("Close" ).Return (nil )
754
+ defer sink .AssertExpectations (t )
755
+
756
+ sf := registry .NewSinkFactory ()
757
+ if err := sf .Register ("test-sink" , newSink (sink )); err != nil {
758
+ t .Fatal (err )
759
+ }
760
+
761
+ monitor := newMockMonitor ()
762
+ monitor .On ("RecordRun" , mock .AnythingOfType ("agent.Run" )).Once ()
763
+ monitor .On ("RecordPlugin" , mock .AnythingOfType ("string" ), mock .AnythingOfType ("string" ), mock .AnythingOfType ("string" ), mock .AnythingOfType ("bool" ))
764
+ defer monitor .AssertExpectations (t )
765
+
766
+ r := agent .NewAgent (agent.Config {
767
+ ExtractorFactory : ef ,
768
+ ProcessorFactory : pf ,
769
+ SinkFactory : sf ,
770
+ Logger : utils .Logger ,
771
+ Monitor : monitor ,
772
+ MaxRetries : 2 , // need to retry "at least" 2 times since Extractor returns RetryError twice
773
+ RetryInitialInterval : 1 * time .Millisecond , // this is to override default retry interval to reduce test time
774
+ })
775
+ run := r .Run (ctx , validRecipe )
776
+ assert .NoError (t , run .Error )
777
+ assert .Equal (t , validRecipe , run .Recipe )
778
+ })
779
+
674
780
t .Run ("should retry if sink returns retry error" , func (t * testing.T ) {
675
781
err := errors .New ("some-error" )
676
782
data := []models.Record {
0 commit comments