github.com/ssdev-go/moby@v17.12.1-ce-rc2+incompatible/pkg/signal/trap_linux_test.go (about) 1 // +build linux 2 3 package signal 4 5 import ( 6 "fmt" 7 "io/ioutil" 8 "os" 9 "os/exec" 10 "syscall" 11 "testing" 12 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func buildTestBinary(t *testing.T, tmpdir string, prefix string) (string, string) { 18 tmpDir, err := ioutil.TempDir(tmpdir, prefix) 19 require.NoError(t, err) 20 exePath := tmpDir + "/" + prefix 21 wd, _ := os.Getwd() 22 testHelperCode := wd + "/testfiles/main.go" 23 cmd := exec.Command("go", "build", "-o", exePath, testHelperCode) 24 err = cmd.Run() 25 require.NoError(t, err) 26 return exePath, tmpDir 27 } 28 29 func TestTrap(t *testing.T) { 30 var sigmap = []struct { 31 name string 32 signal os.Signal 33 multiple bool 34 }{ 35 {"TERM", syscall.SIGTERM, false}, 36 {"QUIT", syscall.SIGQUIT, true}, 37 {"INT", os.Interrupt, false}, 38 {"TERM", syscall.SIGTERM, true}, 39 {"INT", os.Interrupt, true}, 40 } 41 exePath, tmpDir := buildTestBinary(t, "", "main") 42 defer os.RemoveAll(tmpDir) 43 44 for _, v := range sigmap { 45 cmd := exec.Command(exePath) 46 cmd.Env = append(os.Environ(), fmt.Sprintf("SIGNAL_TYPE=%s", v.name)) 47 if v.multiple { 48 cmd.Env = append(cmd.Env, "IF_MULTIPLE=1") 49 } 50 err := cmd.Start() 51 require.NoError(t, err) 52 err = cmd.Wait() 53 if e, ok := err.(*exec.ExitError); ok { 54 code := e.Sys().(syscall.WaitStatus).ExitStatus() 55 if v.multiple { 56 assert.Equal(t, 128+int(v.signal.(syscall.Signal)), code) 57 } else { 58 assert.Equal(t, 99, code) 59 } 60 continue 61 } 62 t.Fatal("process didn't end with any error") 63 } 64 65 } 66 67 func TestDumpStacks(t *testing.T) { 68 directory, err := ioutil.TempDir("", "test-dump-tasks") 69 assert.NoError(t, err) 70 defer os.RemoveAll(directory) 71 dumpPath, err := DumpStacks(directory) 72 assert.NoError(t, err) 73 readFile, _ := ioutil.ReadFile(dumpPath) 74 fileData := string(readFile) 75 assert.Contains(t, fileData, "goroutine") 76 } 77 78 func TestDumpStacksWithEmptyInput(t *testing.T) { 79 path, err := DumpStacks("") 80 assert.NoError(t, err) 81 assert.Equal(t, os.Stderr.Name(), path) 82 }