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