@@ -22,6 +22,40 @@ import (
2222 "github.com/calyptia/plugin/metric"
2323)
2424
25+ // TestMain wraps all tests to clean up any calls that mutated globals via
26+ // public FLB* functions.
27+ func TestMain (m * testing.M ) {
28+ cleanupDone := make (chan struct {})
29+ defer func () {
30+ go func () {
31+ defer close (cleanupDone )
32+
33+ setupInstanceForTesting = nil
34+
35+ currInstanceMu .Lock ()
36+ defer currInstanceMu .Unlock ()
37+
38+ if currInstance != nil {
39+ if currInstance .meta .output != nil {
40+ FLBPluginOutputPreExit ()
41+ }
42+ FLBPluginExit ()
43+ }
44+ if pluginMeta .Load () != nil {
45+ pluginMeta .Store (nil )
46+ }
47+ }()
48+
49+ select {
50+ case <- cleanupDone :
51+ case <- time .After (2 * time .Second ):
52+ panic ("timed out cleaning up global plugin instance" )
53+ }
54+ }()
55+
56+ m .Run ()
57+ }
58+
2559func newTestInputInstance (t testing.TB , input InputPlugin ) * pluginInstance {
2660 inst := pluginInstanceWithFakes (newPluginInstance (pluginMetadata {
2761 name : "test-plugin" ,
@@ -66,6 +100,69 @@ func pluginInstanceWithFakes(inst *pluginInstance) *pluginInstance {
66100 })
67101}
68102
103+ func TestGlobalCallbacks (t * testing.T ) {
104+ plugin := newTestInputPlugin ()
105+ //inst := newTestInputInstance(t, plugin)
106+
107+ // Registration
108+ RegisterInput ("test-name" , "test-desc" , plugin )
109+ FLBPluginRegister (unsafe .Pointer (& input.FLBPluginProxyDef {}))
110+
111+ require .Equal (t , & pluginMetadata {
112+ name : "test-name" ,
113+ desc : "test-desc" ,
114+ input : plugin ,
115+ }, pluginMeta .Load ())
116+
117+ // Initialization
118+ setupInstanceForTesting = func (inst * pluginInstance ) {
119+ pluginInstanceWithFakes (inst )
120+ }
121+ FLBPluginInit (nil )
122+ require .Equal (t , int64 (1 ), plugin .initCount .Load ())
123+
124+ currInstanceMu .Lock ()
125+ inst := currInstance
126+ currInstanceMu .Unlock ()
127+ require .NotNil (t , inst )
128+
129+ // Pre-run
130+ FLBPluginInputPreRun (0 )
131+ require .Eventually (t , plugin .collectRunning .Load , time .Second , time .Millisecond ,
132+ "collect background loop should have started running" )
133+ m1 := testMessage (map [string ]any {"name" : "m1" })
134+ plugin .enqueue (m1 )()
135+
136+ // Callback
137+ callbackBytes , callbackResp := testCallback (FLBPluginInputCallback )
138+ require .Equal (t , input .FLB_OK , callbackResp )
139+ require .Equal (t , []Message {m1 }, decodeMessages (t , callbackBytes ))
140+ require .True (t , plugin .collectRunning .Load ())
141+
142+ // Pause
143+ FLBPluginInputPause ()
144+ require .False (t , plugin .collectRunning .Load ())
145+ FLBPluginInputPause () // Idempotent
146+
147+ callbackBytes , callbackResp = testCallback (FLBPluginInputCallback )
148+ require .Equal (t , input .FLB_RETRY , callbackResp )
149+ assert .Empty (t , callbackBytes )
150+
151+ // Resume stopped pipeline
152+ FLBPluginInputResume ()
153+ callbackBytes , callbackResp = testCallback (FLBPluginInputCallback )
154+ require .Equal (t , input .FLB_OK , callbackResp )
155+ m4 := testMessage (map [string ]any {"name" : "m4" })
156+ plugin .enqueue (m4 )()
157+ callbackBytes , callbackResp = testCallback (FLBPluginInputCallback )
158+ require .Equal (t , input .FLB_OK , callbackResp )
159+ require .Equal (t , []Message {m4 }, decodeMessages (t , callbackBytes ))
160+
161+ // Stop again
162+ FLBPluginExit ()
163+ require .False (t , plugin .collectRunning .Load ())
164+ }
165+
69166func TestInputCallbackLifecycle (t * testing.T ) {
70167 plugin := newTestInputPlugin ()
71168 inst := newTestInputInstance (t , plugin )
@@ -78,7 +175,7 @@ func TestInputCallbackLifecycle(t *testing.T) {
78175 require .Equal (t , int64 (1 ), plugin .initCount .Load (), "initialization should only run once" )
79176
80177 // Early attempt to callback
81- _ , callbackResp := testCallback (inst )
178+ _ , callbackResp := testCallback (inst . inputCallback )
82179 require .Equal (t , input .FLB_RETRY , callbackResp , "pre-run must be called before callback" )
83180
84181 // Pre-run
@@ -93,7 +190,7 @@ func TestInputCallbackLifecycle(t *testing.T) {
93190 require .ErrorContains (t , inst .resume (), `invalid plugin state "runnable"` )
94191
95192 // Callback
96- callbackBytes , callbackResp := testCallback (inst )
193+ callbackBytes , callbackResp := testCallback (inst . inputCallback )
97194 require .Equal (t , input .FLB_OK , callbackResp )
98195 require .Equal (t , []Message {m1 , m2 }, decodeMessages (t , callbackBytes ))
99196 require .True (t , plugin .collectRunning .Load ())
@@ -108,21 +205,21 @@ func TestInputCallbackLifecycle(t *testing.T) {
108205 require .False (t , plugin .collectRunning .Load ())
109206 require .NoError (t , inst .stop (), "stop should be idempotent" )
110207
111- callbackBytes , callbackResp = testCallback (inst )
208+ callbackBytes , callbackResp = testCallback (inst . inputCallback )
112209 require .Equal (t , input .FLB_RETRY , callbackResp )
113210 assert .Empty (t , callbackBytes )
114211
115212 // Resume stopped pipeline
116213 require .NoError (t , inst .resume ())
117214 require .ErrorContains (t , inst .resume (), `invalid plugin state "runnable"` )
118- callbackBytes , callbackResp = testCallback (inst )
215+ callbackBytes , callbackResp = testCallback (inst . inputCallback )
119216 require .Equal (t , input .FLB_OK , callbackResp )
120217 assert .Empty (t , callbackBytes , "m3 message from earlier not dequeued" )
121218 require .Eventually (t , plugin .collectRunning .Load , time .Second , time .Millisecond ,
122219 "collect background loop should have started running" )
123220 m4 := testMessage (map [string ]any {"name" : "m4" })
124221 plugin .enqueue (m4 )()
125- callbackBytes , callbackResp = testCallback (inst )
222+ callbackBytes , callbackResp = testCallback (inst . inputCallback )
126223 require .Equal (t , input .FLB_OK , callbackResp )
127224 require .Equal (t , []Message {m4 }, decodeMessages (t , callbackBytes ))
128225
@@ -232,7 +329,7 @@ func TestInputCallbackCtrlC(t *testing.T) {
232329 timeout := time .After (1 * time .Second )
233330
234331 go func () {
235- testCallback (inst )
332+ testCallback (inst . inputCallback )
236333 close (cdone )
237334 }()
238335
@@ -281,11 +378,11 @@ func TestInputCallbackDangle(t *testing.T) {
281378 ticker := time .NewTicker (collectInterval )
282379 defer ticker .Stop ()
283380
284- testCallback (inst )
381+ testCallback (inst . inputCallback )
285382 for {
286383 select {
287384 case <- ticker .C :
288- testCallback (inst )
385+ testCallback (inst . inputCallback )
289386 case <- cdone :
290387 return
291388 }
@@ -349,7 +446,7 @@ func TestInputCallbackInfinite(t *testing.T) {
349446 for {
350447 select {
351448 case <- ticker .C :
352- testCallback (inst )
449+ testCallback (inst . inputCallback )
353450 if ptr != nil {
354451 close (cdone )
355452 return
@@ -421,7 +518,7 @@ func TestInputCallbackLatency(t *testing.T) {
421518 ticker := time .NewTicker (collectInterval )
422519 defer ticker .Stop ()
423520
424- buf , _ := testCallback (inst )
521+ buf , _ := testCallback (inst . inputCallback )
425522 if len (buf ) > 0 {
426523 cmsg <- buf
427524 }
@@ -433,7 +530,7 @@ func TestInputCallbackLatency(t *testing.T) {
433530 t .Log ("---- collect done" )
434531 return
435532 case <- ticker .C :
436- buf , _ := testCallback (inst )
533+ buf , _ := testCallback (inst . inputCallback )
437534 if len (buf ) > 0 {
438535 cmsg <- buf
439536 }
@@ -537,13 +634,13 @@ func TestInputCallbackInfiniteConcurrent(t *testing.T) {
537634 ticker := time .NewTicker (time .Second * 1 )
538635 defer ticker .Stop ()
539636
540- testCallback (inst )
637+ testCallback (inst . inputCallback )
541638 close (cstarted )
542639
543640 for {
544641 select {
545642 case <- ticker .C :
546- testCallback (inst )
643+ testCallback (inst . inputCallback )
547644 case <- inst .runCtx .Done ():
548645 return
549646 }
0 commit comments