| package integration |
| |
| import ( |
| "fmt" |
| "os/exec" |
| "strings" |
| "time" |
| |
| "github.com/go-check/check" |
| ) |
| |
| // We use the elongated quote mechanism for quoting error returns as |
| // the use of strconv.Quote or %q in fmt.Errorf will escape characters. This |
| // has a big downside on Windows where the args include paths, so instead |
| // of something like c:\directory\file.txt, the output would be |
| // c:\\directory\\file.txt. This is highly misleading. |
| const quote = `"` |
| |
| var execCommand = exec.Command |
| |
| // DockerCmdWithError executes a docker command that is supposed to fail and returns |
| // the output, the exit code and the error. |
| func DockerCmdWithError(dockerBinary string, args ...string) (string, int, error) { |
| return RunCommandWithOutput(execCommand(dockerBinary, args...)) |
| } |
| |
| // DockerCmdWithStdoutStderr executes a docker command and returns the content of the |
| // stdout, stderr and the exit code. If a check.C is passed, it will fail and stop tests |
| // if the error is not nil. |
| func DockerCmdWithStdoutStderr(dockerBinary string, c *check.C, args ...string) (string, string, int) { |
| stdout, stderr, status, err := RunCommandWithStdoutStderr(execCommand(dockerBinary, args...)) |
| if c != nil { |
| c.Assert(err, check.IsNil, check.Commentf(quote+"%v"+quote+" failed with errors: %s, %v", strings.Join(args, " "), stderr, err)) |
| } |
| return stdout, stderr, status |
| } |
| |
| // DockerCmd executes a docker command and returns the output and the exit code. If the |
| // command returns an error, it will fail and stop the tests. |
| func DockerCmd(dockerBinary string, c *check.C, args ...string) (string, int) { |
| out, status, err := RunCommandWithOutput(execCommand(dockerBinary, args...)) |
| c.Assert(err, check.IsNil, check.Commentf(quote+"%v"+quote+" failed with errors: %s, %v", strings.Join(args, " "), out, err)) |
| return out, status |
| } |
| |
| // DockerCmdWithTimeout executes a docker command with a timeout, and returns the output, |
| // the exit code and the error (if any). |
| func DockerCmdWithTimeout(dockerBinary string, timeout time.Duration, args ...string) (string, int, error) { |
| out, status, err := RunCommandWithOutputAndTimeout(execCommand(dockerBinary, args...), timeout) |
| if err != nil { |
| return out, status, fmt.Errorf(quote+"%v"+quote+" failed with errors: %v : %q", strings.Join(args, " "), err, out) |
| } |
| return out, status, err |
| } |
| |
| // DockerCmdInDir executes a docker command in a directory and returns the output, the |
| // exit code and the error (if any). |
| func DockerCmdInDir(dockerBinary string, path string, args ...string) (string, int, error) { |
| dockerCommand := execCommand(dockerBinary, args...) |
| dockerCommand.Dir = path |
| out, status, err := RunCommandWithOutput(dockerCommand) |
| if err != nil { |
| return out, status, fmt.Errorf(quote+"%v"+quote+" failed with errors: %v : %q", strings.Join(args, " "), err, out) |
| } |
| return out, status, err |
| } |
| |
| // DockerCmdInDirWithTimeout executes a docker command in a directory with a timeout and |
| // returns the output, the exit code and the error (if any). |
| func DockerCmdInDirWithTimeout(dockerBinary string, timeout time.Duration, path string, args ...string) (string, int, error) { |
| dockerCommand := execCommand(dockerBinary, args...) |
| dockerCommand.Dir = path |
| out, status, err := RunCommandWithOutputAndTimeout(dockerCommand, timeout) |
| if err != nil { |
| return out, status, fmt.Errorf(quote+"%v"+quote+" failed with errors: %v : %q", strings.Join(args, " "), err, out) |
| } |
| return out, status, err |
| } |