trap_linux_test.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //go:build linux
  2. package trap // import "github.com/docker/docker/cmd/dockerd/trap"
  3. import (
  4. "os"
  5. "os/exec"
  6. "syscall"
  7. "testing"
  8. "gotest.tools/v3/assert"
  9. is "gotest.tools/v3/assert/cmp"
  10. )
  11. func buildTestBinary(t *testing.T, tmpdir string, prefix string) (string, string) {
  12. t.Helper()
  13. tmpDir, err := os.MkdirTemp(tmpdir, prefix)
  14. assert.NilError(t, err)
  15. exePath := tmpDir + "/" + prefix
  16. wd, _ := os.Getwd()
  17. testHelperCode := wd + "/testfiles/main.go"
  18. cmd := exec.Command("go", "build", "-o", exePath, testHelperCode)
  19. err = cmd.Run()
  20. assert.NilError(t, err)
  21. return exePath, tmpDir
  22. }
  23. func TestTrap(t *testing.T) {
  24. sigmap := []struct {
  25. name string
  26. signal os.Signal
  27. multiple bool
  28. }{
  29. {"TERM", syscall.SIGTERM, false},
  30. {"INT", os.Interrupt, false},
  31. {"TERM", syscall.SIGTERM, true},
  32. {"INT", os.Interrupt, true},
  33. }
  34. exePath, tmpDir := buildTestBinary(t, "", "main")
  35. defer os.RemoveAll(tmpDir)
  36. for _, v := range sigmap {
  37. t.Run(v.name, func(t *testing.T) {
  38. cmd := exec.Command(exePath)
  39. cmd.Env = append(os.Environ(), "SIGNAL_TYPE="+v.name)
  40. if v.multiple {
  41. cmd.Env = append(cmd.Env, "IF_MULTIPLE=1")
  42. }
  43. err := cmd.Start()
  44. assert.NilError(t, err)
  45. err = cmd.Wait()
  46. e, ok := err.(*exec.ExitError)
  47. assert.Assert(t, ok, "expected exec.ExitError, got %T", e)
  48. code := e.Sys().(syscall.WaitStatus).ExitStatus()
  49. if v.multiple {
  50. assert.Check(t, is.DeepEqual(128+int(v.signal.(syscall.Signal)), code))
  51. } else {
  52. assert.Check(t, is.Equal(99, code))
  53. }
  54. })
  55. }
  56. }