1
1
package libkflow_test
2
2
3
3
import (
4
+ "net/http"
5
+ "net/http/httptest"
4
6
"net/url"
7
+ "sync"
5
8
"sync/atomic"
6
9
"testing"
7
10
"time"
@@ -10,6 +13,7 @@ import (
10
13
"github.com/kentik/libkflow"
11
14
"github.com/kentik/libkflow/api"
12
15
"github.com/kentik/libkflow/api/test"
16
+ "github.com/kentik/libkflow/flow"
13
17
metrics2 "github.com/kentik/libkflow/metrics"
14
18
"github.com/stretchr/testify/assert"
15
19
"go.uber.org/goleak"
@@ -54,8 +58,170 @@ func TestNewSenderWithDeviceName(t *testing.T) {
54
58
assert .Nil (err )
55
59
}
56
60
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 {}
58
132
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 ) {
59
225
client , server , device , err := test .NewClientServer ()
60
226
if err != nil {
61
227
t .Fatal (err )
0 commit comments