@@ -343,3 +343,96 @@ func TestSignals(t *testing.T) {
343
343
t .Fatalf ("expected nil but got %v" , err )
344
344
}
345
345
}
346
+
347
+ func TestBreakWithChanRegistered (t * testing.T ) {
348
+ t .Parallel ()
349
+
350
+ // errChan lets us get errors back from the session
351
+ errChan := make (chan error , 5 )
352
+
353
+ // doneChan lets us specify that we should exit.
354
+ doneChan := make (chan interface {})
355
+
356
+ breakChan := make (chan bool )
357
+
358
+ readyToReceiveBreak := make (chan bool )
359
+
360
+ session , _ , cleanup := newTestSession (t , & Server {
361
+ Handler : func (s Session ) {
362
+ s .Break (breakChan ) // register a break channel with the session
363
+ readyToReceiveBreak <- true
364
+
365
+ select {
366
+ case <- breakChan :
367
+ io .WriteString (s , "break" )
368
+ case <- doneChan :
369
+ errChan <- fmt .Errorf ("Unexpected done" )
370
+ return
371
+ }
372
+ },
373
+ }, nil )
374
+ defer cleanup ()
375
+ var stdout bytes.Buffer
376
+ session .Stdout = & stdout
377
+ go func () {
378
+ errChan <- session .Run ("" )
379
+ }()
380
+
381
+ <- readyToReceiveBreak
382
+ ok , err := session .SendRequest ("break" , true , nil )
383
+ if err != nil {
384
+ t .Fatalf ("expected nil but got %v" , err )
385
+ }
386
+ if ok != true {
387
+ t .Fatalf ("expected true but got %v" , ok )
388
+ }
389
+
390
+ err = <- errChan
391
+ close (doneChan )
392
+
393
+ if err != nil {
394
+ t .Fatalf ("expected nil but got %v" , err )
395
+ }
396
+ if ! bytes .Equal (stdout .Bytes (), []byte ("break" )) {
397
+ t .Fatalf ("stdout = %#v, expected 'break'" , stdout .Bytes ())
398
+ }
399
+ }
400
+
401
+ func TestBreakWithoutChanRegistered (t * testing.T ) {
402
+ t .Parallel ()
403
+
404
+ // errChan lets us get errors back from the session
405
+ errChan := make (chan error , 5 )
406
+
407
+ // doneChan lets us specify that we should exit.
408
+ doneChan := make (chan interface {})
409
+
410
+ waitUntilAfterBreakSent := make (chan bool )
411
+
412
+ session , _ , cleanup := newTestSession (t , & Server {
413
+ Handler : func (s Session ) {
414
+ <- waitUntilAfterBreakSent
415
+ },
416
+ }, nil )
417
+ defer cleanup ()
418
+ var stdout bytes.Buffer
419
+ session .Stdout = & stdout
420
+ go func () {
421
+ errChan <- session .Run ("" )
422
+ }()
423
+
424
+ ok , err := session .SendRequest ("break" , true , nil )
425
+ if err != nil {
426
+ t .Fatalf ("expected nil but got %v" , err )
427
+ }
428
+ if ok != false {
429
+ t .Fatalf ("expected false but got %v" , ok )
430
+ }
431
+ waitUntilAfterBreakSent <- true
432
+
433
+ err = <- errChan
434
+ close (doneChan )
435
+ if err != nil {
436
+ t .Fatalf ("expected nil but got %v" , err )
437
+ }
438
+ }
0 commit comments