37 lines
992 B
Go
37 lines
992 B
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
"os"
|
|
"syscall"
|
|
"testing"
|
|
)
|
|
|
|
func TestRunCommandBuildsCancelableSignalContext(t *testing.T) {
|
|
var signals []os.Signal
|
|
stopped := false
|
|
signalContext := func(parent context.Context, requested ...os.Signal) (context.Context, context.CancelFunc) {
|
|
signals = append([]os.Signal(nil), requested...)
|
|
ctx, cancel := context.WithCancel(parent)
|
|
cancel()
|
|
return ctx, func() {
|
|
stopped = true
|
|
}
|
|
}
|
|
|
|
err := runCommandWithSignalContext(nil, io.Discard, io.Discard, func(ctx context.Context, _ []string, _, _ io.Writer) error {
|
|
return ctx.Err()
|
|
}, signalContext)
|
|
if !errors.Is(err, context.Canceled) {
|
|
t.Fatalf("runCommandWithSignalContext() error = %v, want context cancellation", err)
|
|
}
|
|
if len(signals) != 2 || signals[0] != os.Interrupt || signals[1] != syscall.SIGTERM {
|
|
t.Fatalf("requested signals = %#v, want Interrupt and SIGTERM", signals)
|
|
}
|
|
if !stopped {
|
|
t.Fatal("signal context stop function was not called")
|
|
}
|
|
}
|