trap_linux_test.go 1.6 KB

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