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