mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Merge pull request #10798 from ahmetalpbalkan/win-cli/TestEventsUntag-fix
integration-cli: Remove timeout dependency on TestEventsUntag
This commit is contained in:
commit
a8b699f5d9
2 changed files with 44 additions and 19 deletions
|
@ -16,8 +16,11 @@ func TestEventsUntag(t *testing.T) {
|
||||||
dockerCmd(t, "tag", image, "utest:tag2")
|
dockerCmd(t, "tag", image, "utest:tag2")
|
||||||
dockerCmd(t, "rmi", "utest:tag1")
|
dockerCmd(t, "rmi", "utest:tag1")
|
||||||
dockerCmd(t, "rmi", "utest:tag2")
|
dockerCmd(t, "rmi", "utest:tag2")
|
||||||
eventsCmd := exec.Command("timeout", "0.2", dockerBinary, "events", "--since=1")
|
eventsCmd := exec.Command(dockerBinary, "events", "--since=1")
|
||||||
out, _, _ := runCommandWithOutput(eventsCmd)
|
out, exitCode, _, err := runCommandWithOutputForDuration(eventsCmd, time.Duration(time.Millisecond*200))
|
||||||
|
if exitCode != 0 || err != nil {
|
||||||
|
t.Fatalf("Failed to get events - exit code %d: %s", exitCode, err)
|
||||||
|
}
|
||||||
events := strings.Split(out, "\n")
|
events := strings.Split(out, "\n")
|
||||||
nEvents := len(events)
|
nEvents := len(events)
|
||||||
// The last element after the split above will be an empty string, so we
|
// The last element after the split above will be an empty string, so we
|
||||||
|
|
|
@ -65,27 +65,49 @@ func runCommandWithStdoutStderr(cmd *exec.Cmd) (stdout string, stderr string, ex
|
||||||
return
|
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")
|
var ErrCmdTimeout = fmt.Errorf("command timed out")
|
||||||
|
|
||||||
func runCommandWithOutputAndTimeout(cmd *exec.Cmd, timeout time.Duration) (output string, exitCode int, err error) {
|
func runCommandWithOutputAndTimeout(cmd *exec.Cmd, timeout time.Duration) (output string, exitCode int, err error) {
|
||||||
done := make(chan error)
|
var timedOut bool
|
||||||
go func() {
|
output, exitCode, timedOut, err = runCommandWithOutputForDuration(cmd, timeout)
|
||||||
output, exitCode, err = runCommandWithOutput(cmd)
|
if timedOut {
|
||||||
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)
|
|
||||||
}
|
|
||||||
err = ErrCmdTimeout
|
err = ErrCmdTimeout
|
||||||
case <-done:
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue