Skip to content

Commit 93e4ca0

Browse files
committed
refact appsec: prevent data race in tests
1 parent ee8fd08 commit 93e4ca0

File tree

1 file changed

+40
-17
lines changed

1 file changed

+40
-17
lines changed

pkg/acquisition/modules/appsec/appsec_test.go

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -181,29 +181,52 @@ func loadAppSecEngine(test appsecRuleTest, t *testing.T) {
181181

182182
input := test.input_request
183183
input.ResponseChannel = make(chan appsec.AppsecTempResponse)
184-
OutputEvents := make([]types.Event, 0)
185-
OutputResponses := make([]appsec.AppsecTempResponse, 0)
186-
go func() {
187-
for {
188-
//log.Printf("reading from %p", input.ResponseChannel)
189-
out := <-input.ResponseChannel
190-
OutputResponses = append(OutputResponses, out)
191-
//log.Errorf("response -> %s", spew.Sdump(out))
184+
185+
// collect both responses and events until no activity for idleDuration
186+
idleDuration := 50 * time.Millisecond
187+
idle := time.NewTimer(idleDuration)
188+
defer idle.Stop()
189+
190+
// when we receive something, drain and restart the idle timer
191+
reset := func() {
192+
if !idle.Stop() {
193+
select {
194+
case <-idle.C:
195+
default:
196+
}
192197
}
193-
}()
198+
idle.Reset(idleDuration)
199+
}
200+
201+
responses :=[]appsec.AppsecTempResponse{}
202+
events := []types.Event{}
203+
204+
done := make(chan struct{})
205+
206+
// collect in a goroutine so a receiver is ready
194207
go func() {
195208
for {
196-
out := <-OutChan
197-
OutputEvents = append(OutputEvents, out)
198-
//log.Errorf("outchan -> %s", spew.Sdump(out))
209+
select {
210+
case r := <-input.ResponseChannel:
211+
responses = append(responses, r)
212+
reset()
213+
case e := <-OutChan:
214+
events = append(events, e)
215+
reset()
216+
case <-idle.C:
217+
close(done)
218+
return
219+
}
199220
}
200221
}()
201222

202223
runner.handleRequest(&input)
203-
time.Sleep(50 * time.Millisecond)
204224

205-
http_status, appsecResponse := AppsecRuntime.GenerateResponse(OutputResponses[0], logger)
206-
log.Infof("events : %s", spew.Sdump(OutputEvents))
207-
log.Infof("responses : %s", spew.Sdump(OutputResponses))
208-
test.output_asserts(OutputEvents, OutputResponses, appsecResponse, http_status)
225+
// wait for the idle duration
226+
<-done
227+
228+
httpStatus, appsecResponse := AppsecRuntime.GenerateResponse(responses[0], logger)
229+
log.Infof("events : %s", spew.Sdump(events))
230+
log.Infof("responses : %s", spew.Sdump(responses))
231+
test.output_asserts(events, responses, appsecResponse, httpStatus)
209232
}

0 commit comments

Comments
 (0)