@@ -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
@@ -223,8 +227,84 @@ func TestAttachHandler(t *testing.T) {
223
227
assert .Equal (t , "test!" , resp .Body .String ())
224
228
}
225
229
230
+ func TestOrdering (t * testing.T ) {
231
+ monitorSocket := genSocketPath ()
232
+ var monitorHost string
233
+ if runtime .GOOS == "windows" {
234
+ monitorHost = "npipe:///" + filepath .Base (monitorSocket )
235
+ } else {
236
+ monitorHost = "unix://" + monitorSocket
237
+ }
238
+ cfg := config .MustNewConfigFrom (map [string ]any {
239
+ "host" : monitorHost ,
240
+ })
241
+
242
+ t .Run ("NewStartStop" , func (t * testing.T ) {
243
+ defer goleak .VerifyNone (t )
244
+ logger := logptest .NewTestingLogger (t , "" )
245
+ s , err := New (logger , cfg )
246
+ require .NoError (t , err )
247
+ s .Start ()
248
+ err = s .Stop ()
249
+ require .NoError (t , err )
250
+ s .wg .Wait ()
251
+ })
252
+ t .Run ("NewStopStart" , func (t * testing.T ) {
253
+ defer goleak .VerifyNone (t )
254
+ logger := logptest .NewTestingLogger (t , "" )
255
+ s , err := New (logger , cfg )
256
+ require .NoError (t , err )
257
+ err = s .Stop ()
258
+ require .NoError (t , err )
259
+ s .Start ()
260
+ s .wg .Wait ()
261
+ })
262
+ t .Run ("NewStop" , func (t * testing.T ) {
263
+ defer goleak .VerifyNone (t )
264
+ logger := logptest .NewTestingLogger (t , "" )
265
+ s , err := New (logger , cfg )
266
+ require .NoError (t , err )
267
+ err = s .Stop ()
268
+ require .NoError (t , err )
269
+ s .wg .Wait ()
270
+ })
271
+ t .Run ("NewStopStop" , func (t * testing.T ) {
272
+ defer goleak .VerifyNone (t )
273
+ logger := logptest .NewTestingLogger (t , "" )
274
+ s , err := New (logger , cfg )
275
+ require .NoError (t , err )
276
+ err = s .Stop ()
277
+ require .NoError (t , err )
278
+ err = s .Stop ()
279
+ require .NoError (t , err )
280
+ s .wg .Wait ()
281
+ })
282
+ t .Run ("NewStartStartStop" , func (t * testing.T ) {
283
+ defer goleak .VerifyNone (t )
284
+ logger := logptest .NewTestingLogger (t , "" )
285
+ s , err := New (logger , cfg )
286
+ require .NoError (t , err )
287
+ s .Start ()
288
+ s .Start ()
289
+ err = s .Stop ()
290
+ require .NoError (t , err )
291
+ s .wg .Wait ()
292
+ })
293
+ }
294
+
226
295
func newTestHandler (response string ) http.Handler {
227
296
return http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
228
297
_ , _ = io .WriteString (w , response )
229
298
})
230
299
}
300
+
301
+ func genSocketPath () string {
302
+ randData := make ([]byte , 16 )
303
+ for i := range len (randData ) {
304
+ randData [i ] = uint8 (rand .UintN (255 )) //nolint:gosec // 0-255 fits in a uint8
305
+ }
306
+ socketName := base64 .URLEncoding .EncodeToString (randData ) + ".sock"
307
+ // don't use t.TempDir() because it can be too long
308
+ socketDir := os .TempDir ()
309
+ return filepath .Join (socketDir , socketName )
310
+ }
0 commit comments