11package libkflow_test
22
33import (
4+ "net/http"
5+ "net/http/httptest"
46 "net/url"
7+ "sync"
58 "sync/atomic"
69 "testing"
710 "time"
@@ -10,6 +13,7 @@ import (
1013 "github.com/kentik/libkflow"
1114 "github.com/kentik/libkflow/api"
1215 "github.com/kentik/libkflow/api/test"
16+ "github.com/kentik/libkflow/flow"
1317 metrics2 "github.com/kentik/libkflow/metrics"
1418 "github.com/stretchr/testify/assert"
1519 "go.uber.org/goleak"
@@ -54,8 +58,170 @@ func TestNewSenderWithDeviceName(t *testing.T) {
5458 assert .Nil (err )
5559}
5660
57- func TestNewSenderWithDeviceNameLeaks (t * testing.T ) {
61+ func TestNewSenderWithDeviceNameWithErrors_NoErrs (t * testing.T ) {
62+ client , server , device , err := test .NewClientServer ()
63+ if err != nil {
64+ t .Fatal (err )
65+ }
66+
67+ apiurl = server .URL (test .API )
68+ flowurl = server .URL (test .FLOW )
69+ metricsurl = server .URL (test .TSDB )
70+
71+ email = client .Email
72+ token = client .Token
73+
74+ config := libkflow .NewConfig (email , token , "test" , "0.0.1" )
75+ config .OverrideURLs (apiurl , flowurl , metricsurl )
76+
77+ l := stubLeveledLogger {}
78+
79+ registry := metrics .NewRegistry ()
80+ metrics2 .StartWithSetConf (registry , & l , metricsurl .String (), email , token , "chf" )
81+ config .OverrideRegistry (registry )
82+ config .WithInternalErrors ()
83+
84+ s , errors , err := libkflow .NewSenderWithDeviceNameWithErrors (device .Name , config )
85+ assert .NoError (t , err )
86+
87+ errorsFromChan := make ([]error , 0 )
88+
89+ wg := sync.WaitGroup {}
90+ wg .Add (1 )
91+ go func () {
92+ for err := range errors {
93+ errorsFromChan = append (errorsFromChan , err )
94+ }
95+ wg .Done ()
96+ }()
97+
98+ for i := 0 ; i < 5 ; i ++ {
99+ s .Send (& flow.Flow {
100+ TimestampNano : time .Now ().UnixNano (),
101+ })
102+ }
103+
104+ s .Stop (time .Second )
105+
106+ wg .Wait ()
107+
108+ assert .Len (t , errorsFromChan , 0 )
109+ }
110+
111+ func TestNewSenderWithDeviceNameWithErrors_WithErrs (t * testing.T ) {
112+ client , server , device , err := test .NewClientServer ()
113+ if err != nil {
114+ t .Fatal (err )
115+ }
116+
117+ flowServer := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
118+ w .WriteHeader (400 )
119+ }))
120+
121+ apiurl = server .URL (test .API )
122+ flowurl = server .URL (flowServer .URL )
123+ metricsurl = server .URL (test .TSDB )
124+
125+ email = client .Email
126+ token = client .Token
127+
128+ config := libkflow .NewConfig (email , token , "test" , "0.0.1" )
129+ config .OverrideURLs (apiurl , flowurl , metricsurl )
130+
131+ l := stubLeveledLogger {}
58132
133+ registry := metrics .NewRegistry ()
134+ metrics2 .StartWithSetConf (registry , & l , metricsurl .String (), email , token , "chf" )
135+ config .OverrideRegistry (registry )
136+ config .WithInternalErrors ()
137+
138+ s , errors , err := libkflow .NewSenderWithDeviceNameWithErrors (device .Name , config )
139+ assert .NoError (t , err )
140+
141+ errorsFromChan := make ([]error , 0 )
142+
143+ wg := sync.WaitGroup {}
144+ wg .Add (1 )
145+ go func () {
146+ for err := range errors {
147+ errorsFromChan = append (errorsFromChan , err )
148+ }
149+ wg .Done ()
150+ }()
151+
152+ s .Send (& flow.Flow {
153+ TimestampNano : time .Now ().UnixNano (),
154+ })
155+
156+ s .Stop (time .Second )
157+
158+ wg .Wait ()
159+
160+ assert .Len (t , errorsFromChan , 1 )
161+ }
162+
163+ func TestNewSenderWithDeviceName_WithErrs_NoPanic (t * testing.T ) {
164+ client , server , device , err := test .NewClientServer ()
165+ if err != nil {
166+ t .Fatal (err )
167+ }
168+
169+ flowServer := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
170+ w .WriteHeader (400 )
171+ time .Sleep (time .Second )
172+ }))
173+
174+ apiurl = server .URL (test .API )
175+ flowurl = server .URL (flowServer .URL )
176+ metricsurl = server .URL (test .TSDB )
177+
178+ email = client .Email
179+ token = client .Token
180+
181+ config := libkflow .NewConfig (email , token , "test" , "0.0.1" )
182+ config .OverrideURLs (apiurl , flowurl , metricsurl )
183+
184+ l := stubLeveledLogger {}
185+
186+ registry := metrics .NewRegistry ()
187+ metrics2 .StartWithSetConf (registry , & l , metricsurl .String (), email , token , "chf" )
188+ config .OverrideRegistry (registry )
189+
190+ errors := make (chan error )
191+
192+ s , err := libkflow .NewSenderWithDeviceName (device .Name , errors , config )
193+ assert .NoError (t , err )
194+
195+ errorsFromChan := make ([]error , 0 )
196+
197+ wg := sync.WaitGroup {}
198+ wg .Add (1 )
199+ go func () {
200+ defer wg .Done ()
201+ for {
202+ select {
203+ case <- time .After (time .Second ):
204+ return
205+ case err := <- errors :
206+ errorsFromChan = append (errorsFromChan , err )
207+ }
208+ }
209+ }()
210+
211+ for i := 0 ; i < 100000 ; i ++ {
212+ s .Send (& flow.Flow {
213+ TimestampNano : time .Now ().UnixNano (),
214+ })
215+ }
216+
217+ s .Stop (time .Second * 0 )
218+
219+ wg .Wait ()
220+
221+ assert .Len (t , errorsFromChan , 1 )
222+ }
223+
224+ func TestNewSenderWithDeviceNameLeaks (t * testing.T ) {
59225 client , server , device , err := test .NewClientServer ()
60226 if err != nil {
61227 t .Fatal (err )
0 commit comments