Skip to content

Commit 022c342

Browse files
committed
feature(4890): updated synchronization in the tests
1 parent 8a18c93 commit 022c342

File tree

1 file changed

+59
-20
lines changed

1 file changed

+59
-20
lines changed

internal/pkg/agent/cmd/upgrade_test.go

Lines changed: 59 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"context"
99
"log"
1010
"net"
11+
"sync"
1112
"sync/atomic"
1213
"testing"
1314
"time"
@@ -83,13 +84,13 @@ func TestUpgradeCmd(t *testing.T) {
8384
<-clientCh
8485
})
8586
t.Run("fail if fleet managed and unprivileged", func(t *testing.T) {
87+
var wg sync.WaitGroup
8688
// Set up mock TCP server for gRPC connection
8789
tcpServer, err := net.Listen("tcp", "127.0.0.1:")
8890
require.NoError(t, err)
8991
defer tcpServer.Close()
9092

9193
s := grpc.NewServer()
92-
defer s.Stop()
9394

9495
// Define mock server and agent information
9596
upgradeCh := make(chan struct{})
@@ -99,7 +100,9 @@ func TestUpgradeCmd(t *testing.T) {
99100
mockAgentInfo.On("Unprivileged").Return(true) // Simulate unprivileged mode
100101
cproto.RegisterElasticAgentControlServer(s, mock)
101102

103+
wg.Add(1)
102104
go func() {
105+
defer wg.Done()
103106
err := s.Serve(tcpServer)
104107
assert.NoError(t, err)
105108
}()
@@ -120,10 +123,11 @@ func TestUpgradeCmd(t *testing.T) {
120123
nil,
121124
}
122125

123-
clientCh := make(chan struct{})
124-
126+
term := make(chan int)
127+
wg.Add(1)
125128
// Execute upgrade command and validate shouldUpgrade error
126129
go func() {
130+
defer wg.Done()
127131
err = upgradeCmdWithClient(commandInput)
128132

129133
// Expect an error due to unprivileged fleet-managed mode
@@ -133,21 +137,27 @@ func TestUpgradeCmd(t *testing.T) {
133137
// Verify counter has not incremented since upgrade should not proceed
134138
counter := atomic.LoadInt32(&mock.upgrades)
135139
assert.Equal(t, int32(0), counter, "server should not have handled any upgrades")
140+
close(term)
141+
}()
136142

137-
close(clientCh)
143+
wg.Add(1)
144+
go func() {
145+
defer wg.Done()
146+
<-term
147+
s.Stop()
138148
}()
139149

140-
<-clientCh // Ensure goroutine completes before ending test
150+
wg.Wait()
141151
})
142152

143153
t.Run("fail if fleet managed privileged but no force flag", func(t *testing.T) {
154+
var wg sync.WaitGroup
144155
// Set up mock TCP server for gRPC connection
145156
tcpServer, err := net.Listen("tcp", "127.0.0.1:")
146157
require.NoError(t, err)
147158
defer tcpServer.Close()
148159

149160
s := grpc.NewServer()
150-
defer s.Stop()
151161

152162
// Define mock server and agent information
153163
mock := &mockServer{}
@@ -156,7 +166,9 @@ func TestUpgradeCmd(t *testing.T) {
156166
mockAgentInfo.On("Unprivileged").Return(false) // Simulate privileged mode
157167
cproto.RegisterElasticAgentControlServer(s, mock)
158168

169+
wg.Add(1)
159170
go func() {
171+
defer wg.Done()
160172
err := s.Serve(tcpServer)
161173
assert.NoError(t, err)
162174
}()
@@ -177,10 +189,11 @@ func TestUpgradeCmd(t *testing.T) {
177189
nil,
178190
}
179191

180-
clientCh := make(chan struct{})
181-
192+
term := make(chan int)
193+
wg.Add(1)
182194
// Execute upgrade command and validate shouldUpgrade error
183195
go func() {
196+
defer wg.Done()
184197
err = upgradeCmdWithClient(commandInput)
185198

186199
// Expect an error due to unprivileged fleet-managed mode
@@ -190,20 +203,26 @@ func TestUpgradeCmd(t *testing.T) {
190203
// Verify counter has not incremented since upgrade should not proceed
191204
counter := atomic.LoadInt32(&mock.upgrades)
192205
assert.Equal(t, int32(0), counter, "server should not have handled any upgrades")
206+
close(term)
207+
}()
193208

194-
close(clientCh)
209+
wg.Add(1)
210+
go func() {
211+
defer wg.Done()
212+
<-term
213+
s.Stop()
195214
}()
196215

197-
<-clientCh // Ensure goroutine completes before ending test
216+
wg.Wait()
198217
})
199218
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
200220
// Set up mock TCP server for gRPC connection
201221
tcpServer, err := net.Listen("tcp", "127.0.0.1:")
202222
require.NoError(t, err)
203223
defer tcpServer.Close()
204224

205225
s := grpc.NewServer()
206-
defer s.Stop()
207226

208227
// Define mock server and agent information
209228
mock := &mockServer{}
@@ -212,7 +231,9 @@ func TestUpgradeCmd(t *testing.T) {
212231
mockAgentInfo.On("Unprivileged").Return(false) // Simulate privileged mode
213232
cproto.RegisterElasticAgentControlServer(s, mock)
214233

234+
wg.Add(1)
215235
go func() {
236+
defer wg.Done()
216237
err := s.Serve(tcpServer)
217238
assert.NoError(t, err)
218239
}()
@@ -239,10 +260,11 @@ func TestUpgradeCmd(t *testing.T) {
239260
},
240261
}
241262

242-
clientCh := make(chan struct{})
243-
263+
term := make(chan int)
264+
wg.Add(1)
244265
// Execute upgrade command and validate shouldUpgrade error
245266
go func() {
267+
defer wg.Done()
246268
err = upgradeCmdWithClient(commandInput)
247269

248270
// Expect an error because user does not confirm the upgrade
@@ -253,19 +275,26 @@ func TestUpgradeCmd(t *testing.T) {
253275
counter := atomic.LoadInt32(&mock.upgrades)
254276
assert.Equal(t, int32(0), counter, "server should not have handled any upgrades")
255277

256-
close(clientCh)
278+
close(term)
257279
}()
258280

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()
260289
})
261290
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
262292
// Set up mock TCP server for gRPC connection
263293
tcpServer, err := net.Listen("tcp", "127.0.0.1:")
264294
require.NoError(t, err)
265295
defer tcpServer.Close()
266296

267297
s := grpc.NewServer()
268-
defer s.Stop()
269298

270299
// Define mock server and agent information
271300
upgradeCh := make(chan struct{})
@@ -275,7 +304,9 @@ func TestUpgradeCmd(t *testing.T) {
275304
mockAgentInfo.On("Unprivileged").Return(false) // Simulate privileged mode
276305
cproto.RegisterElasticAgentControlServer(s, mock)
277306

307+
wg.Add(1)
278308
go func() {
309+
defer wg.Done()
279310
err := s.Serve(tcpServer)
280311
assert.NoError(t, err)
281312
}()
@@ -302,10 +333,11 @@ func TestUpgradeCmd(t *testing.T) {
302333
},
303334
}
304335

305-
clientCh := make(chan struct{})
306-
336+
term := make(chan int)
337+
wg.Add(1)
307338
// Execute upgrade command and validate that there are no errors
308339
go func() {
340+
defer wg.Done()
309341
err = upgradeCmdWithClient(commandInput)
310342

311343
assert.NoError(t, err)
@@ -314,12 +346,19 @@ func TestUpgradeCmd(t *testing.T) {
314346
counter := atomic.LoadInt32(&mock.upgrades)
315347
assert.Equal(t, int32(1), counter, "server should handle exactly one upgrade")
316348

317-
close(clientCh)
349+
close(term)
318350
}()
319351

320352
close(upgradeCh)
321353

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()
323362
})
324363
}
325364

0 commit comments

Comments
 (0)