Go#

pw_target_runner: gRPC server for running executables in parallel

Server#

Full API documentation for the server library can be found here.

Example program#

The code below implements a very basic test server with two test workers which print out the path of the tests they are scheduled to run.

package main

import (
     "flag"
     "log"

     pb "pigweed/proto/pw_target_runner/target_runner_pb"
     "pigweed/pw_target_runner"
)

// Custom test worker that implements the interface server.UnitTestRunner.
type MyWorker struct {
     id int
}

func (w *MyWorker) WorkerStart() error {
     log.Printf("Starting test worker %d\n", w.id)
     return nil
}

func (w *MyWorker) WorkerExit() {
     log.Printf("Exiting test worker %d\n", w.id)
}

func (w *MyWorker) HandleRunRequest(req *server.UnitTestRunRequest) *server.UnitTestRunResponse {
     log.Printf("Worker %d running unit test %s\n", w.id, req.Path)
     return &server.UnitTestRunResponse{
             Output: []byte("Success!"),
             Status: pb.TestStatus_SUCCESS,
     }
}

// To run:
//
//   $ go build -o server
//   $ ./server -port 80
//
func main() {
     port := flag.Int("port", 8080, "Port on which to run server")
      flag.Parse()

     s := server.New()

     // Create and register as many unit test workers as you need.
     s.RegisterWorker(&MyWorker{id: 0})
     s.RegisterWorker(&MyWorker{id: 1})

     if err := s.Bind(*port); err != nil {
             log.Fatalf("Failed to bind to port %d: %v", *port, err)
     }

     if err := s.Serve(); err != nil {
             log.Fatalf("Failed to start server: %v", err)
     }
}