blob: 2dbc9d995c80fc18d3f7d4df6b12874dcf1eade9 [file] [log] [blame]
package db
import (
"fmt"
"io/ioutil"
"net"
"os"
"go.skia.org/infra/go/trace/db/perftypes"
traceservice "go.skia.org/infra/go/trace/service"
"go.skia.org/infra/go/util"
"google.golang.org/grpc"
)
const (
TMP_PREFIX = "tracedb_test"
)
type fatalf func(format string, args ...interface{})
type cleanup func()
// setupClientServerForTesting is a utility func used in tests.
//
// It starts a server running in a Go routine and then connects
// a client to that server, which is returned as DB. In addition it
// returns a func that should be called to clean up both the client
// and the server after they are done being used.
func setupClientServerForTesting(f fatalf) (DB, cleanup) {
file, err := ioutil.TempFile("", TMP_PREFIX)
if err != nil {
f("Could not create temporary file: %s", err)
}
// First spin up a traceservice server that we will talk to.
server, err := traceservice.NewTraceServiceServer(file.Name())
if err != nil {
f("Failed to initialize the tracestore server: %s", err)
}
// Start the server on an open port.
lis, err := net.Listen("tcp", "localhost:0")
if err != nil {
f("failed to listen: %v", err)
}
port := lis.Addr().String()
s := grpc.NewServer()
traceservice.RegisterTraceServiceServer(s, server)
go func() {
f("Failed while serving: %s", s.Serve(lis))
}()
// Set up a connection to the server.
conn, err := grpc.Dial(port, grpc.WithInsecure(), grpc.WithMaxMsgSize(MAX_MESSAGE_SIZE))
if err != nil {
f("did not connect: %v", err)
}
ts, err := NewTraceServiceDB(conn, perftypes.PerfTraceBuilder)
if err != nil {
f("Failed to create tracedb.DB: %s", err)
}
cl := func() {
util.Close(conn)
util.Close(ts)
if err := os.Remove(file.Name()); err != nil {
fmt.Printf("Failed to clean up %s: %s", file.Name(), err)
}
}
return ts, cl
}