Browse Source

pkg/expect: support sending Signals to expect process

Anthony Romano 9 years ago
parent
commit
fcb5ba98d0
2 changed files with 31 additions and 1 deletions
  1. 5 0
      pkg/expect/expect.go
  2. 26 1
      pkg/expect/expect_test.go

+ 5 - 0
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) }
 

+ 26 - 1
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:
+	}
+}