package nsenter import ( "encoding/json" "fmt" "os" "os/exec" "strings" "testing" ) type pid struct { Pid int `json:"Pid"` } func TestNsenterAlivePid(t *testing.T) { args := []string{"nsenter-exec"} r, w, err := os.Pipe() if err != nil { t.Fatalf("failed to create pipe %v", err) } cmd := &exec.Cmd{ Path: os.Args[0], Args: args, ExtraFiles: []*os.File{w}, Env: []string{fmt.Sprintf("_LIBCONTAINER_INITPID=%d", os.Getpid()), "_LIBCONTAINER_INITPIPE=3"}, } if err := cmd.Start(); err != nil { t.Fatalf("nsenter failed to start %v", err) } w.Close() decoder := json.NewDecoder(r) var pid *pid if err := decoder.Decode(&pid); err != nil { t.Fatalf("%v", err) } if err := cmd.Wait(); err != nil { t.Fatalf("nsenter exits with a non-zero exit status") } p, err := os.FindProcess(pid.Pid) if err != nil { t.Fatalf("%v", err) } p.Wait() } func TestNsenterInvalidPid(t *testing.T) { args := []string{"nsenter-exec"} cmd := &exec.Cmd{ Path: os.Args[0], Args: args, Env: []string{"_LIBCONTAINER_INITPID=-1"}, } err := cmd.Run() if err == nil { t.Fatal("nsenter exits with a zero exit status") } } func TestNsenterDeadPid(t *testing.T) { dead_cmd := exec.Command("true") if err := dead_cmd.Run(); err != nil { t.Fatal(err) } args := []string{"nsenter-exec"} cmd := &exec.Cmd{ Path: os.Args[0], Args: args, Env: []string{fmt.Sprintf("_LIBCONTAINER_INITPID=%d", dead_cmd.Process.Pid)}, } err := cmd.Run() if err == nil { t.Fatal("nsenter exits with a zero exit status") } } func init() { if strings.HasPrefix(os.Args[0], "nsenter-") { os.Exit(0) } return }