Refactor and cleanup of bazel handler

- Creation of a bazel command is independent of test/real implementation
- Use a custom struct instead of cmd.Exec
- Move mock bazel runner to the test

Bug: 270989498
Test: m nothing
Test: USE_PERSISTENT_BAZEL=0 m nothing
Test: Treehugger
Change-Id: Ieec35dad5e21aac644d5b8dc79a92397d42db861
This commit is contained in:
Chris Parsons
2023-04-24 16:21:27 +00:00
parent 03e6e00e60
commit c9089dcc7b
3 changed files with 136 additions and 116 deletions

View File

@@ -128,6 +128,24 @@ func NewProxyServer(logger ServerLogger, outDir string, workspaceDir string) *Pr
}
}
func ExecBazel(bazelPath string, workspaceDir string, request CmdRequest) (stdout []byte, stderr []byte, cmdErr error) {
bazelCmd := exec.Command(bazelPath, request.Argv...)
bazelCmd.Dir = workspaceDir
bazelCmd.Env = request.Env
stderrBuffer := &bytes.Buffer{}
bazelCmd.Stderr = stderrBuffer
if output, err := bazelCmd.Output(); err != nil {
cmdErr = fmt.Errorf("bazel command failed: %s\n---command---\n%s\n---env---\n%s\n---stderr---\n%s---",
err, bazelCmd, strings.Join(bazelCmd.Env, "\n"), stderrBuffer)
} else {
stdout = output
}
stderr = stderrBuffer.Bytes()
return
}
func (b *ProxyServer) handleRequest(conn net.Conn) error {
defer conn.Close()
@@ -137,23 +155,13 @@ func (b *ProxyServer) handleRequest(conn net.Conn) error {
return fmt.Errorf("Error decoding request: %s", err)
}
bazelCmd := exec.Command("./build/bazel/bin/bazel", req.Argv...)
bazelCmd.Dir = b.workspaceDir
bazelCmd.Env = req.Env
stderr := &bytes.Buffer{}
bazelCmd.Stderr = stderr
var stdout string
var bazelErrString string
if output, err := bazelCmd.Output(); err != nil {
bazelErrString = fmt.Sprintf("bazel command failed: %s\n---command---\n%s\n---env---\n%s\n---stderr---\n%s---",
err, bazelCmd, strings.Join(bazelCmd.Env, "\n"), stderr)
} else {
stdout = string(output)
stdout, stderr, cmdErr := ExecBazel("./build/bazel/bin/bazel", b.workspaceDir, req)
errorString := ""
if cmdErr != nil {
errorString = cmdErr.Error()
}
resp := CmdResponse{stdout, string(stderr.Bytes()), bazelErrString}
resp := CmdResponse{string(stdout), string(stderr), errorString}
enc := gob.NewEncoder(conn)
if err := enc.Encode(&resp); err != nil {
return fmt.Errorf("Error encoding response: %s", err)