8
8
"context"
9
9
"log"
10
10
"net"
11
+ "sync"
11
12
"sync/atomic"
12
13
"testing"
13
14
"time"
@@ -83,13 +84,13 @@ func TestUpgradeCmd(t *testing.T) {
83
84
<- clientCh
84
85
})
85
86
t .Run ("fail if fleet managed and unprivileged" , func (t * testing.T ) {
87
+ var wg sync.WaitGroup
86
88
// Set up mock TCP server for gRPC connection
87
89
tcpServer , err := net .Listen ("tcp" , "127.0.0.1:" )
88
90
require .NoError (t , err )
89
91
defer tcpServer .Close ()
90
92
91
93
s := grpc .NewServer ()
92
- defer s .Stop ()
93
94
94
95
// Define mock server and agent information
95
96
upgradeCh := make (chan struct {})
@@ -99,7 +100,9 @@ func TestUpgradeCmd(t *testing.T) {
99
100
mockAgentInfo .On ("Unprivileged" ).Return (true ) // Simulate unprivileged mode
100
101
cproto .RegisterElasticAgentControlServer (s , mock )
101
102
103
+ wg .Add (1 )
102
104
go func () {
105
+ defer wg .Done ()
103
106
err := s .Serve (tcpServer )
104
107
assert .NoError (t , err )
105
108
}()
@@ -120,10 +123,11 @@ func TestUpgradeCmd(t *testing.T) {
120
123
nil ,
121
124
}
122
125
123
- clientCh := make (chan struct {} )
124
-
126
+ term := make (chan int )
127
+ wg . Add ( 1 )
125
128
// Execute upgrade command and validate shouldUpgrade error
126
129
go func () {
130
+ defer wg .Done ()
127
131
err = upgradeCmdWithClient (commandInput )
128
132
129
133
// Expect an error due to unprivileged fleet-managed mode
@@ -133,21 +137,27 @@ func TestUpgradeCmd(t *testing.T) {
133
137
// Verify counter has not incremented since upgrade should not proceed
134
138
counter := atomic .LoadInt32 (& mock .upgrades )
135
139
assert .Equal (t , int32 (0 ), counter , "server should not have handled any upgrades" )
140
+ close (term )
141
+ }()
136
142
137
- close (clientCh )
143
+ wg .Add (1 )
144
+ go func () {
145
+ defer wg .Done ()
146
+ <- term
147
+ s .Stop ()
138
148
}()
139
149
140
- <- clientCh // Ensure goroutine completes before ending test
150
+ wg . Wait ()
141
151
})
142
152
143
153
t .Run ("fail if fleet managed privileged but no force flag" , func (t * testing.T ) {
154
+ var wg sync.WaitGroup
144
155
// Set up mock TCP server for gRPC connection
145
156
tcpServer , err := net .Listen ("tcp" , "127.0.0.1:" )
146
157
require .NoError (t , err )
147
158
defer tcpServer .Close ()
148
159
149
160
s := grpc .NewServer ()
150
- defer s .Stop ()
151
161
152
162
// Define mock server and agent information
153
163
mock := & mockServer {}
@@ -156,7 +166,9 @@ func TestUpgradeCmd(t *testing.T) {
156
166
mockAgentInfo .On ("Unprivileged" ).Return (false ) // Simulate privileged mode
157
167
cproto .RegisterElasticAgentControlServer (s , mock )
158
168
169
+ wg .Add (1 )
159
170
go func () {
171
+ defer wg .Done ()
160
172
err := s .Serve (tcpServer )
161
173
assert .NoError (t , err )
162
174
}()
@@ -177,10 +189,11 @@ func TestUpgradeCmd(t *testing.T) {
177
189
nil ,
178
190
}
179
191
180
- clientCh := make (chan struct {} )
181
-
192
+ term := make (chan int )
193
+ wg . Add ( 1 )
182
194
// Execute upgrade command and validate shouldUpgrade error
183
195
go func () {
196
+ defer wg .Done ()
184
197
err = upgradeCmdWithClient (commandInput )
185
198
186
199
// Expect an error due to unprivileged fleet-managed mode
@@ -190,20 +203,26 @@ func TestUpgradeCmd(t *testing.T) {
190
203
// Verify counter has not incremented since upgrade should not proceed
191
204
counter := atomic .LoadInt32 (& mock .upgrades )
192
205
assert .Equal (t , int32 (0 ), counter , "server should not have handled any upgrades" )
206
+ close (term )
207
+ }()
193
208
194
- close (clientCh )
209
+ wg .Add (1 )
210
+ go func () {
211
+ defer wg .Done ()
212
+ <- term
213
+ s .Stop ()
195
214
}()
196
215
197
- <- clientCh // Ensure goroutine completes before ending test
216
+ wg . Wait ()
198
217
})
199
218
t .Run ("abort upgrade if fleet managed, privileged, --force is set, and user does not confirm" , func (t * testing.T ) {
219
+ var wg sync.WaitGroup
200
220
// Set up mock TCP server for gRPC connection
201
221
tcpServer , err := net .Listen ("tcp" , "127.0.0.1:" )
202
222
require .NoError (t , err )
203
223
defer tcpServer .Close ()
204
224
205
225
s := grpc .NewServer ()
206
- defer s .Stop ()
207
226
208
227
// Define mock server and agent information
209
228
mock := & mockServer {}
@@ -212,7 +231,9 @@ func TestUpgradeCmd(t *testing.T) {
212
231
mockAgentInfo .On ("Unprivileged" ).Return (false ) // Simulate privileged mode
213
232
cproto .RegisterElasticAgentControlServer (s , mock )
214
233
234
+ wg .Add (1 )
215
235
go func () {
236
+ defer wg .Done ()
216
237
err := s .Serve (tcpServer )
217
238
assert .NoError (t , err )
218
239
}()
@@ -239,10 +260,11 @@ func TestUpgradeCmd(t *testing.T) {
239
260
},
240
261
}
241
262
242
- clientCh := make (chan struct {} )
243
-
263
+ term := make (chan int )
264
+ wg . Add ( 1 )
244
265
// Execute upgrade command and validate shouldUpgrade error
245
266
go func () {
267
+ defer wg .Done ()
246
268
err = upgradeCmdWithClient (commandInput )
247
269
248
270
// Expect an error because user does not confirm the upgrade
@@ -253,19 +275,26 @@ func TestUpgradeCmd(t *testing.T) {
253
275
counter := atomic .LoadInt32 (& mock .upgrades )
254
276
assert .Equal (t , int32 (0 ), counter , "server should not have handled any upgrades" )
255
277
256
- close (clientCh )
278
+ close (term )
257
279
}()
258
280
259
- <- clientCh // Ensure goroutine completes before ending test
281
+ wg .Add (1 )
282
+ go func () {
283
+ defer wg .Done ()
284
+ <- term
285
+ s .Stop ()
286
+ }()
287
+
288
+ wg .Wait ()
260
289
})
261
290
t .Run ("proceed with upgrade if fleet managed, privileged, --force is set, and user confirms upgrade" , func (t * testing.T ) {
291
+ var wg sync.WaitGroup
262
292
// Set up mock TCP server for gRPC connection
263
293
tcpServer , err := net .Listen ("tcp" , "127.0.0.1:" )
264
294
require .NoError (t , err )
265
295
defer tcpServer .Close ()
266
296
267
297
s := grpc .NewServer ()
268
- defer s .Stop ()
269
298
270
299
// Define mock server and agent information
271
300
upgradeCh := make (chan struct {})
@@ -275,7 +304,9 @@ func TestUpgradeCmd(t *testing.T) {
275
304
mockAgentInfo .On ("Unprivileged" ).Return (false ) // Simulate privileged mode
276
305
cproto .RegisterElasticAgentControlServer (s , mock )
277
306
307
+ wg .Add (1 )
278
308
go func () {
309
+ defer wg .Done ()
279
310
err := s .Serve (tcpServer )
280
311
assert .NoError (t , err )
281
312
}()
@@ -302,10 +333,11 @@ func TestUpgradeCmd(t *testing.T) {
302
333
},
303
334
}
304
335
305
- clientCh := make (chan struct {} )
306
-
336
+ term := make (chan int )
337
+ wg . Add ( 1 )
307
338
// Execute upgrade command and validate that there are no errors
308
339
go func () {
340
+ defer wg .Done ()
309
341
err = upgradeCmdWithClient (commandInput )
310
342
311
343
assert .NoError (t , err )
@@ -314,12 +346,19 @@ func TestUpgradeCmd(t *testing.T) {
314
346
counter := atomic .LoadInt32 (& mock .upgrades )
315
347
assert .Equal (t , int32 (1 ), counter , "server should handle exactly one upgrade" )
316
348
317
- close (clientCh )
349
+ close (term )
318
350
}()
319
351
320
352
close (upgradeCh )
321
353
322
- <- clientCh // Ensure goroutine completes before ending test
354
+ wg .Add (1 )
355
+ go func () {
356
+ defer wg .Done ()
357
+ <- term
358
+ s .Stop ()
359
+ }()
360
+
361
+ wg .Wait ()
323
362
})
324
363
}
325
364
0 commit comments