59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
//go:build unix
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
"os"
|
|
"syscall"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestRunCommandCancelsActionContextOnSignal(t *testing.T) {
|
|
for _, tt := range []struct {
|
|
name string
|
|
signal os.Signal
|
|
}{
|
|
{name: "Interrupt", signal: os.Interrupt},
|
|
{name: "Terminate", signal: syscall.SIGTERM},
|
|
} {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
started := make(chan struct{})
|
|
done := make(chan error, 1)
|
|
go func() {
|
|
done <- runCommand(nil, io.Discard, io.Discard, func(ctx context.Context, _ []string, _, _ io.Writer) error {
|
|
close(started)
|
|
<-ctx.Done()
|
|
return ctx.Err()
|
|
})
|
|
}()
|
|
|
|
select {
|
|
case <-started:
|
|
case <-time.After(time.Second):
|
|
t.Fatal("runner did not receive an action context")
|
|
}
|
|
|
|
process, err := os.FindProcess(os.Getpid())
|
|
if err != nil {
|
|
t.Fatalf("FindProcess() error = %v", err)
|
|
}
|
|
if err := process.Signal(tt.signal); err != nil {
|
|
t.Fatalf("Signal(%v) error = %v", tt.signal, err)
|
|
}
|
|
|
|
select {
|
|
case err := <-done:
|
|
if !errors.Is(err, context.Canceled) {
|
|
t.Fatalf("runCommand() error = %v, want context cancellation", err)
|
|
}
|
|
case <-time.After(time.Second):
|
|
t.Fatal("interrupt did not cancel the action context")
|
|
}
|
|
})
|
|
}
|
|
}
|