@@ -289,22 +289,40 @@ func TestPtyResize(t *testing.T) {
289
289
func TestSignals (t * testing.T ) {
290
290
t .Parallel ()
291
291
292
+ // errChan lets us get errors back from the session
293
+ errChan := make (chan error , 5 )
294
+
295
+ // doneChan lets us specify that we should exit.
296
+ doneChan := make (chan interface {})
297
+
292
298
session , _ , cleanup := newTestSession (t , & Server {
293
299
Handler : func (s Session ) {
294
300
// We need to use a buffered channel here, otherwise it's possible for the
295
301
// second call to Signal to get discarded.
296
302
signals := make (chan Signal , 2 )
297
303
s .Signals (signals )
298
- if sig := <- signals ; sig != SIGINT {
299
- t .Fatalf ("expected signal %v but got %v" , SIGINT , sig )
304
+
305
+ select {
306
+ case sig := <- signals :
307
+ if sig != SIGINT {
308
+ errChan <- fmt .Errorf ("expected signal %v but got %v" , SIGINT , sig )
309
+ return
310
+ }
311
+ case <- doneChan :
312
+ errChan <- fmt .Errorf ("Unexpected done" )
313
+ return
300
314
}
301
- exiter := make (chan bool )
302
- go func () {
303
- if sig := <- signals ; sig == SIGKILL {
304
- close (exiter )
315
+
316
+ select {
317
+ case sig := <- signals :
318
+ if sig != SIGKILL {
319
+ errChan <- fmt .Errorf ("expected signal %v but got %v" , SIGKILL , sig )
320
+ return
305
321
}
306
- }()
307
- <- exiter
322
+ case <- doneChan :
323
+ errChan <- fmt .Errorf ("Unexpected done" )
324
+ return
325
+ }
308
326
},
309
327
}, nil )
310
328
defer cleanup ()
@@ -314,7 +332,13 @@ func TestSignals(t *testing.T) {
314
332
session .Signal (gossh .SIGKILL )
315
333
}()
316
334
317
- err := session .Run ("" )
335
+ go func () {
336
+ errChan <- session .Run ("" )
337
+ }()
338
+
339
+ err := <- errChan
340
+ close (doneChan )
341
+
318
342
if err != nil {
319
343
t .Fatalf ("expected nil but got %v" , err )
320
344
}
0 commit comments