mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
integration-cli: remove timeout dependency on TestEventsUntag
TestEventsUntag requires a `timeout` command which does not exist on OS X or Windows (in fact, windows has a totally different timeout program and this test was accidentally using it). - Created runCommandWithOutputForDuration. This entirely replaces runDockerCommandWithTimeout and removes dependency to `timeout` command. - Made runDockerCommandWithTimeout reuse runDockerCommandForDuration. TestEventsUntag works now on Windows. Signed-off-by: Ahmet Alp Balkan <ahmetalpbalkan@gmail.com>
This commit is contained in:
parent
99ca215c65
commit
5dbaea1ca9
2 changed files with 45 additions and 19 deletions
|
@ -3,6 +3,7 @@ package main
|
|||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand"
|
||||
|
@ -63,27 +64,49 @@ func runCommandWithStdoutStderr(cmd *exec.Cmd) (stdout string, stderr string, ex
|
|||
return
|
||||
}
|
||||
|
||||
func runCommandWithOutputForDuration(cmd *exec.Cmd, duration time.Duration) (output string, exitCode int, timedOut bool, err error) {
|
||||
var outputBuffer bytes.Buffer
|
||||
if cmd.Stdout != nil {
|
||||
err = errors.New("cmd.Stdout already set")
|
||||
return
|
||||
}
|
||||
cmd.Stdout = &outputBuffer
|
||||
|
||||
if cmd.Stderr != nil {
|
||||
err = errors.New("cmd.Stderr already set")
|
||||
return
|
||||
}
|
||||
cmd.Stderr = &outputBuffer
|
||||
|
||||
done := make(chan error)
|
||||
go func() {
|
||||
exitErr := cmd.Run()
|
||||
exitCode = processExitCode(exitErr)
|
||||
done <- exitErr
|
||||
}()
|
||||
|
||||
select {
|
||||
case <-time.After(duration):
|
||||
killErr := cmd.Process.Kill()
|
||||
if killErr != nil {
|
||||
fmt.Printf("failed to kill (pid=%d): %v\n", cmd.Process.Pid, killErr)
|
||||
}
|
||||
timedOut = true
|
||||
break
|
||||
case err = <-done:
|
||||
break
|
||||
}
|
||||
output = outputBuffer.String()
|
||||
return
|
||||
}
|
||||
|
||||
var ErrCmdTimeout = fmt.Errorf("command timed out")
|
||||
|
||||
func runCommandWithOutputAndTimeout(cmd *exec.Cmd, timeout time.Duration) (output string, exitCode int, err error) {
|
||||
done := make(chan error)
|
||||
go func() {
|
||||
output, exitCode, err = runCommandWithOutput(cmd)
|
||||
if err != nil || exitCode != 0 {
|
||||
done <- fmt.Errorf("failed to run command: %s", err)
|
||||
return
|
||||
}
|
||||
done <- nil
|
||||
}()
|
||||
select {
|
||||
case <-time.After(timeout):
|
||||
killFailed := cmd.Process.Kill()
|
||||
if killFailed == nil {
|
||||
fmt.Printf("failed to kill (pid=%d): %v\n", cmd.Process.Pid, err)
|
||||
}
|
||||
var timedOut bool
|
||||
output, exitCode, timedOut, err = runCommandWithOutputForDuration(cmd, timeout)
|
||||
if timedOut {
|
||||
err = ErrCmdTimeout
|
||||
case <-done:
|
||||
break
|
||||
}
|
||||
return
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue