diff --git a/pkg/expect/expect.go b/pkg/expect/expect.go index 21af7a2ac..d5256a3dd 100644 --- a/pkg/expect/expect.go +++ b/pkg/expect/expect.go @@ -113,6 +113,11 @@ func (ep *ExpectProcess) LineCount() int { // Stop kills the expect process and waits for it to exit. func (ep *ExpectProcess) Stop() error { return ep.close(true) } +// Signal sends a signal to the expect process +func (ep *ExpectProcess) Signal(sig os.Signal) error { + return ep.cmd.Process.Signal(sig) +} + // Close waits for the expect process to exit. func (ep *ExpectProcess) Close() error { return ep.close(false) } diff --git a/pkg/expect/expect_test.go b/pkg/expect/expect_test.go index e7afa0dd2..95b89e489 100644 --- a/pkg/expect/expect_test.go +++ b/pkg/expect/expect_test.go @@ -16,7 +16,11 @@ package expect -import "testing" +import ( + "os" + "testing" + "time" +) func TestExpectFunc(t *testing.T) { ep, err := NewExpect("/bin/echo", "hello world") @@ -93,3 +97,24 @@ func TestSend(t *testing.T) { t.Fatal(err) } } + +func TestSignal(t *testing.T) { + ep, err := NewExpect("/bin/sleep", "100") + if err != nil { + t.Fatal(err) + } + ep.Signal(os.Interrupt) + donec := make(chan struct{}) + go func() { + defer close(donec) + werr := "signal: interrupt" + if cerr := ep.Close(); cerr == nil || cerr.Error() != werr { + t.Fatalf("got error %v, wanted error %s", cerr, werr) + } + }() + select { + case <-time.After(5 * time.Second): + t.Fatalf("signal test timed out") + case <-donec: + } +}