@@ -19,16 +19,20 @@ package api
19
19
20
20
import (
21
21
"context"
22
+ "encoding/base64"
22
23
"io"
24
+ "math/rand/v2"
23
25
"net"
24
26
"net/http"
25
27
"net/http/httptest"
26
28
"os"
29
+ "path/filepath"
27
30
"runtime"
28
31
"testing"
29
32
30
33
"github.com/stretchr/testify/assert"
31
34
"github.com/stretchr/testify/require"
35
+ "go.uber.org/goleak"
32
36
33
37
"github.com/elastic/elastic-agent-libs/config"
34
38
"github.com/elastic/elastic-agent-libs/logp/logptest"
@@ -41,7 +45,7 @@ func TestConfiguration(t *testing.T) {
41
45
return
42
46
}
43
47
t .Run ("when user is set" , func (t * testing.T ) {
44
- cfg := config .MustNewConfigFrom (map [string ]interface {} {
48
+ cfg := config .MustNewConfigFrom (map [string ]any {
45
49
"host" : "unix:///tmp/ok" ,
46
50
"user" : "admin" ,
47
51
})
@@ -51,7 +55,7 @@ func TestConfiguration(t *testing.T) {
51
55
})
52
56
53
57
t .Run ("when security descriptor is set" , func (t * testing.T ) {
54
- cfg := config .MustNewConfigFrom (map [string ]interface {} {
58
+ cfg := config .MustNewConfigFrom (map [string ]any {
55
59
"host" : "unix:///tmp/ok" ,
56
60
"security_descriptor" : "D:P(A;;GA;;;1234)" ,
57
61
})
@@ -87,7 +91,7 @@ func TestSocket(t *testing.T) {
87
91
sockFile := tmpDir + "/test.sock"
88
92
t .Log (sockFile )
89
93
90
- cfg := config .MustNewConfigFrom (map [string ]interface {} {
94
+ cfg := config .MustNewConfigFrom (map [string ]any {
91
95
"host" : "unix://" + sockFile ,
92
96
})
93
97
@@ -130,7 +134,7 @@ func TestSocket(t *testing.T) {
130
134
require .NoError (t , err )
131
135
f .Close ()
132
136
133
- cfg := config .MustNewConfigFrom (map [string ]interface {} {
137
+ cfg := config .MustNewConfigFrom (map [string ]any {
134
138
"host" : "unix://" + sockFile ,
135
139
})
136
140
@@ -167,7 +171,7 @@ func TestHTTP(t *testing.T) {
167
171
// select a random free port.
168
172
url := "http://localhost:0"
169
173
170
- cfg := config .MustNewConfigFrom (map [string ]interface {} {
174
+ cfg := config .MustNewConfigFrom (map [string ]any {
171
175
"host" : url ,
172
176
})
173
177
logger := logptest .NewTestingLogger (t , "" )
@@ -198,7 +202,7 @@ func attachEchoHelloHandler(t *testing.T, s *Server) {
198
202
}
199
203
200
204
func TestAttachHandler (t * testing.T ) {
201
- cfg := config .MustNewConfigFrom (map [string ]interface {} {
205
+ cfg := config .MustNewConfigFrom (map [string ]any {
202
206
"host" : "http://localhost:0" ,
203
207
})
204
208
@@ -222,8 +226,84 @@ func TestAttachHandler(t *testing.T) {
222
226
assert .Equal (t , http .StatusMovedPermanently , resp .Result ().StatusCode )
223
227
}
224
228
229
+ func TestOrdering (t * testing.T ) {
230
+ monitorSocket := genSocketPath ()
231
+ var monitorHost string
232
+ if runtime .GOOS == "windows" {
233
+ monitorHost = "npipe:///" + filepath .Base (monitorSocket )
234
+ } else {
235
+ monitorHost = "unix://" + monitorSocket
236
+ }
237
+ cfg := config .MustNewConfigFrom (map [string ]any {
238
+ "host" : monitorHost ,
239
+ })
240
+
241
+ t .Run ("NewStartStop" , func (t * testing.T ) {
242
+ defer goleak .VerifyNone (t )
243
+ logger := logptest .NewTestingLogger (t , "" )
244
+ s , err := New (logger , cfg )
245
+ require .NoError (t , err )
246
+ s .Start ()
247
+ err = s .Stop ()
248
+ require .NoError (t , err )
249
+ s .wg .Wait ()
250
+ })
251
+ t .Run ("NewStopStart" , func (t * testing.T ) {
252
+ defer goleak .VerifyNone (t )
253
+ logger := logptest .NewTestingLogger (t , "" )
254
+ s , err := New (logger , cfg )
255
+ require .NoError (t , err )
256
+ err = s .Stop ()
257
+ require .NoError (t , err )
258
+ s .Start ()
259
+ s .wg .Wait ()
260
+ })
261
+ t .Run ("NewStop" , func (t * testing.T ) {
262
+ defer goleak .VerifyNone (t )
263
+ logger := logptest .NewTestingLogger (t , "" )
264
+ s , err := New (logger , cfg )
265
+ require .NoError (t , err )
266
+ err = s .Stop ()
267
+ require .NoError (t , err )
268
+ s .wg .Wait ()
269
+ })
270
+ t .Run ("NewStopStop" , func (t * testing.T ) {
271
+ defer goleak .VerifyNone (t )
272
+ logger := logptest .NewTestingLogger (t , "" )
273
+ s , err := New (logger , cfg )
274
+ require .NoError (t , err )
275
+ err = s .Stop ()
276
+ require .NoError (t , err )
277
+ err = s .Stop ()
278
+ require .NoError (t , err )
279
+ s .wg .Wait ()
280
+ })
281
+ t .Run ("NewStartStartStop" , func (t * testing.T ) {
282
+ defer goleak .VerifyNone (t )
283
+ logger := logptest .NewTestingLogger (t , "" )
284
+ s , err := New (logger , cfg )
285
+ require .NoError (t , err )
286
+ s .Start ()
287
+ s .Start ()
288
+ err = s .Stop ()
289
+ require .NoError (t , err )
290
+ s .wg .Wait ()
291
+ })
292
+ }
293
+
225
294
func newTestHandler (response string ) http.Handler {
226
295
return http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
227
296
_ , _ = io .WriteString (w , response )
228
297
})
229
298
}
299
+
300
+ func genSocketPath () string {
301
+ randData := make ([]byte , 16 )
302
+ for i := range len (randData ) {
303
+ randData [i ] = uint8 (rand .UintN (255 )) //nolint:gosec // 0-255 fits in a uint8
304
+ }
305
+ socketName := base64 .URLEncoding .EncodeToString (randData ) + ".sock"
306
+ // don't use t.TempDir() because it can be too long
307
+ socketDir := os .TempDir ()
308
+ return filepath .Join (socketDir , socketName )
309
+ }
0 commit comments