From 8d8242aa8a3e5869ceab2b2240e4d7001ca8d33e Mon Sep 17 00:00:00 2001 From: Andrey Vagin Date: Mon, 26 Jan 2015 14:05:29 +0300 Subject: [PATCH] nsenter: add tests Signed-off-by: Andrey Vagin --- namespaces/nsenter/nsenter_test.go | 99 ++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 namespaces/nsenter/nsenter_test.go diff --git a/namespaces/nsenter/nsenter_test.go b/namespaces/nsenter/nsenter_test.go new file mode 100644 index 000000000..274d67d04 --- /dev/null +++ b/namespaces/nsenter/nsenter_test.go @@ -0,0 +1,99 @@ +package nsenter + +import ( + "encoding/json" + "fmt" + "os" + "os/exec" + "os/signal" + "strings" + "syscall" + "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())}, + } + + 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) { + + c := make(chan os.Signal) + signal.Notify(c, syscall.SIGCHLD) + dead_cmd := exec.Command("true") + if err := dead_cmd.Start(); err != nil { + t.Fatal(err) + } + defer dead_cmd.Wait() + <-c // dead_cmd is zombie + + 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 +}