.. _chapter-test-server:

.. default-domain:: go

.. highlight:: go

--
Go
--

Server
------

.. TODO(frolv): Build and host documentation using godoc and link to it.

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.

.. code::

  package main

  import (
  	"flag"
  	"log"

  	pb "pigweed.dev/module/pw_test_server/gen"
  	"pigweed.dev/module/pw_test_server/server"
  )

  // 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)
  	}
  }
