trap_linux_test.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // +build linux
  2. package signal // import "github.com/docker/docker/pkg/signal"
  3. import (
  4. "fmt"
  5. "io/ioutil"
  6. "os"
  7. "os/exec"
  8. "syscall"
  9. "testing"
  10. "gotest.tools/assert"
  11. is "gotest.tools/assert/cmp"
  12. )
  13. func buildTestBinary(t *testing.T, tmpdir string, prefix string) (string, string) {
  14. tmpDir, err := ioutil.TempDir(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. cmd := exec.Command(exePath)
  40. cmd.Env = append(os.Environ(), fmt.Sprintf("SIGNAL_TYPE=%s", v.name))
  41. if v.multiple {
  42. cmd.Env = append(cmd.Env, "IF_MULTIPLE=1")
  43. }
  44. err := cmd.Start()
  45. assert.NilError(t, err)
  46. err = cmd.Wait()
  47. if e, ok := err.(*exec.ExitError); ok {
  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. continue
  55. }
  56. t.Fatal("process didn't end with any error")
  57. }
  58. }
  59. func TestDumpStacks(t *testing.T) {
  60. directory, err := ioutil.TempDir("", "test-dump-tasks")
  61. assert.Check(t, err)
  62. defer os.RemoveAll(directory)
  63. dumpPath, err := DumpStacks(directory)
  64. assert.Check(t, err)
  65. readFile, _ := ioutil.ReadFile(dumpPath)
  66. fileData := string(readFile)
  67. assert.Check(t, is.Contains(fileData, "goroutine"))
  68. }
  69. func TestDumpStacksWithEmptyInput(t *testing.T) {
  70. path, err := DumpStacks("")
  71. assert.Check(t, err)
  72. assert.Check(t, is.Equal(os.Stderr.Name(), path))
  73. }