Quellcode durchsuchen

Merge pull request #26514 from AkihiroSuda/fix-pkg-integration-race

[test] fix races in pkg/integration/cmd
Vincent Demeester vor 9 Jahren
Ursprung
Commit
675144ff8d
1 geänderte Dateien mit 22 neuen und 4 gelöschten Zeilen
  1. 22 4
      pkg/integration/cmd/command.go

+ 22 - 4
pkg/integration/cmd/command.go

@@ -8,6 +8,7 @@ import (
 	"path/filepath"
 	"runtime"
 	"strings"
+	"sync"
 	"syscall"
 	"time"
 
@@ -49,6 +50,23 @@ func ProcessExitCode(err error) (exitCode int) {
 	return
 }
 
+type lockedBuffer struct {
+	m   sync.RWMutex
+	buf bytes.Buffer
+}
+
+func (buf *lockedBuffer) Write(b []byte) (int, error) {
+	buf.m.Lock()
+	defer buf.m.Unlock()
+	return buf.buf.Write(b)
+}
+
+func (buf *lockedBuffer) String() string {
+	buf.m.RLock()
+	defer buf.m.RUnlock()
+	return buf.buf.String()
+}
+
 // Result stores the result of running a command
 type Result struct {
 	Cmd      *exec.Cmd
@@ -56,8 +74,8 @@ type Result struct {
 	Error    error
 	// Timeout is true if the command was killed because it ran for too long
 	Timeout   bool
-	outBuffer *bytes.Buffer
-	errBuffer *bytes.Buffer
+	outBuffer *lockedBuffer
+	errBuffer *lockedBuffer
 }
 
 // Assert compares the Result against the Expected struct, and fails the test if
@@ -255,8 +273,8 @@ func buildCmd(cmd Cmd) *Result {
 	default:
 		execCmd = exec.Command(cmd.Command[0], cmd.Command[1:]...)
 	}
-	outBuffer := new(bytes.Buffer)
-	errBuffer := new(bytes.Buffer)
+	outBuffer := new(lockedBuffer)
+	errBuffer := new(lockedBuffer)
 
 	execCmd.Stdin = cmd.Stdin
 	execCmd.Dir = cmd.Dir