summaryrefslogtreecommitdiff
path: root/test/e2e/run_signal_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/e2e/run_signal_test.go')
-rw-r--r--test/e2e/run_signal_test.go101
1 files changed, 101 insertions, 0 deletions
diff --git a/test/e2e/run_signal_test.go b/test/e2e/run_signal_test.go
new file mode 100644
index 000000000..095288277
--- /dev/null
+++ b/test/e2e/run_signal_test.go
@@ -0,0 +1,101 @@
+package integration
+
+import (
+ "fmt"
+ "os"
+ "os/exec"
+ "strings"
+ "syscall"
+
+ "github.com/onsi/gomega/gexec"
+ "golang.org/x/sys/unix"
+
+ . "github.com/onsi/ginkgo"
+ . "github.com/onsi/gomega"
+)
+
+// PodmanPID execs podman and returns its PID
+func (p *PodmanTest) PodmanPID(args []string) (*PodmanSession, int) {
+ podmanOptions := p.MakeOptions()
+ podmanOptions = append(podmanOptions, strings.Split(p.StorageOptions, " ")...)
+ podmanOptions = append(podmanOptions, args...)
+ fmt.Printf("Running: %s %s\n", p.PodmanBinary, strings.Join(podmanOptions, " "))
+ command := exec.Command(p.PodmanBinary, podmanOptions...)
+ session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter)
+ if err != nil {
+ Fail(fmt.Sprintf("unable to run podman command: %s", strings.Join(podmanOptions, " ")))
+ }
+ return &PodmanSession{session}, command.Process.Pid
+}
+
+const sigCatch = "for NUM in `seq 1 64`; do trap \"echo Received $NUM\" $NUM; done; echo READY; while :; do sleep 0.1; done"
+
+var _ = Describe("Podman run with --sig-proxy", func() {
+ var (
+ tmpdir string
+ err error
+ podmanTest PodmanTest
+ )
+
+ BeforeEach(func() {
+ tmpdir, err = CreateTempDirInTempDir()
+ if err != nil {
+ os.Exit(1)
+ }
+ podmanTest = PodmanCreate(tmpdir)
+ podmanTest.RestoreAllArtifacts()
+ podmanTest.RestoreArtifact(fedoraMinimal)
+ })
+
+ AfterEach(func() {
+ podmanTest.Cleanup()
+
+ })
+
+ Specify("signals are forwarded to container using sig-proxy", func() {
+ signal := syscall.SIGPOLL
+ session, pid := podmanTest.PodmanPID([]string{"run", "--name", "test1", fedoraMinimal, "bash", "-c", sigCatch})
+
+ ok := WaitForContainer(&podmanTest)
+ Expect(ok).To(BeTrue())
+
+ // Kill with given signal
+ if err := unix.Kill(pid, signal); err != nil {
+ Fail(fmt.Sprintf("error killing podman process %d: %v", pid, err))
+ }
+
+ // Kill with -9 to guarantee the container dies
+ killSession := podmanTest.Podman([]string{"kill", "-s", "9", "test1"})
+ killSession.WaitWithDefaultTimeout()
+ Expect(killSession.ExitCode()).To(Equal(0))
+
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ ok, _ = session.GrepString(fmt.Sprintf("Received %d", signal))
+ Expect(ok).To(BeTrue())
+ })
+
+ Specify("signals are not forwarded to container with sig-proxy false", func() {
+ signal := syscall.SIGPOLL
+ session, pid := podmanTest.PodmanPID([]string{"run", "--name", "test2", "--sig-proxy=false", fedoraMinimal, "bash", "-c", sigCatch})
+
+ ok := WaitForContainer(&podmanTest)
+ Expect(ok).To(BeTrue())
+
+ // Kill with given signal
+ // Should be no output, SIGPOLL is usually ignored
+ if err := unix.Kill(pid, signal); err != nil {
+ Fail(fmt.Sprintf("error killing podman process %d: %v", pid, err))
+ }
+
+ // Kill with -9 to guarantee the container dies
+ killSession := podmanTest.Podman([]string{"kill", "-s", "9", "test2"})
+ killSession.WaitWithDefaultTimeout()
+ Expect(killSession.ExitCode()).To(Equal(0))
+
+ session.WaitWithDefaultTimeout()
+ Expect(session.ExitCode()).To(Equal(0))
+ ok, _ = session.GrepString(fmt.Sprintf("Received %d", signal))
+ Expect(ok).To(BeFalse())
+ })
+})