// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package exec import ( "io" "io/ioutil" "testing" "os" "runtime" ) func run(argv []string, stdin, stdout, stderr int) (p *Cmd, err os.Error) { if runtime.GOOS == "windows" { argv = append([]string{"cmd", "/c"}, argv...) } exe, err := LookPath(argv[0]) if err != nil { return nil, err } p, err = Run(exe, argv, nil, "", stdin, stdout, stderr) return p, err } func TestRunCat(t *testing.T) { cmd, err := run([]string{"cat"}, Pipe, Pipe, DevNull) if err != nil { t.Fatal("run:", err) } io.WriteString(cmd.Stdin, "hello, world\n") cmd.Stdin.Close() buf, err := ioutil.ReadAll(cmd.Stdout) if err != nil { t.Fatal("read:", err) } if string(buf) != "hello, world\n" { t.Fatalf("read: got %q", buf) } if err = cmd.Close(); err != nil { t.Fatal("close:", err) } } func TestRunEcho(t *testing.T) { cmd, err := run([]string{"sh", "-c", "echo hello world"}, DevNull, Pipe, DevNull) if err != nil { t.Fatal("run:", err) } buf, err := ioutil.ReadAll(cmd.Stdout) if err != nil { t.Fatal("read:", err) } if string(buf) != "hello world\n" { t.Fatalf("read: got %q", buf) } if err = cmd.Close(); err != nil { t.Fatal("close:", err) } } func TestStderr(t *testing.T) { cmd, err := run([]string{"sh", "-c", "echo hello world 1>&2"}, DevNull, DevNull, Pipe) if err != nil { t.Fatal("run:", err) } buf, err := ioutil.ReadAll(cmd.Stderr) if err != nil { t.Fatal("read:", err) } if string(buf) != "hello world\n" { t.Fatalf("read: got %q", buf) } if err = cmd.Close(); err != nil { t.Fatal("close:", err) } } func TestMergeWithStdout(t *testing.T) { cmd, err := run([]string{"sh", "-c", "echo hello world 1>&2"}, DevNull, Pipe, MergeWithStdout) if err != nil { t.Fatal("run:", err) } buf, err := ioutil.ReadAll(cmd.Stdout) if err != nil { t.Fatal("read:", err) } if string(buf) != "hello world\n" { t.Fatalf("read: got %q", buf) } if err = cmd.Close(); err != nil { t.Fatal("close:", err) } } func TestAddEnvVar(t *testing.T) { err := os.Setenv("NEWVAR", "hello world") if err != nil { t.Fatal("setenv:", err) } cmd, err := run([]string{"sh", "-c", "echo $NEWVAR"}, DevNull, Pipe, DevNull) if err != nil { t.Fatal("run:", err) } buf, err := ioutil.ReadAll(cmd.Stdout) if err != nil { t.Fatal("read:", err) } if string(buf) != "hello world\n" { t.Fatalf("read: got %q", buf) } if err = cmd.Close(); err != nil { t.Fatal("close:", err) } } var tryargs = []string{ `2`, `2 `, "2 \t", `2" "`, `2 ab `, `2 "ab" `, `2 \ `, `2 \\ `, `2 \" `, `2 \`, `2\`, `2"`, `2\"`, `2 "`, `2 \"`, ``, `2 ^ `, `2 \^`, } func TestArgs(t *testing.T) { for _, a := range tryargs { argv := []string{ "awk", `BEGIN{printf("%s|%s|%s",ARGV[1],ARGV[2],ARGV[3])}`, "/dev/null", a, "EOF", } exe, err := LookPath(argv[0]) if err != nil { t.Fatal("run:", err) } cmd, err := Run(exe, argv, nil, "", DevNull, Pipe, DevNull) if err != nil { t.Fatal("run:", err) } buf, err := ioutil.ReadAll(cmd.Stdout) if err != nil { t.Fatal("read:", err) } expect := "/dev/null|" + a + "|EOF" if string(buf) != expect { t.Errorf("read: got %q expect %q", buf, expect) } if err = cmd.Close(); err != nil { t.Fatal("close:", err) } } }