package testonly
import (
"net"
"github.com/golang/mock/gomock"
"github.com/google/trillian"
"github.com/google/trillian/testonly/tmock"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
type MockServer struct {
Admin *tmock.MockTrillianAdminServer
Log *tmock.MockTrillianLogServer
AdminClient trillian.TrillianAdminClient
LogClient trillian.TrillianLogClient
Addr string
}
func NewMockServer(ctrl *gomock.Controller) (*MockServer, func(), error) {
grpcServer := grpc.NewServer()
logServer := tmock.NewMockTrillianLogServer(ctrl)
adminServer := tmock.NewMockTrillianAdminServer(ctrl)
trillian.RegisterTrillianLogServer(grpcServer, logServer)
trillian.RegisterTrillianAdminServer(grpcServer, adminServer)
lis, err := net.Listen("tcp", ":0")
if err != nil {
return nil, nil, err
}
go func() { _ = grpcServer.Serve(lis) }()
cc, err := grpc.Dial(lis.Addr().String(), grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
grpcServer.Stop()
_ = lis.Close()
return nil, nil, err
}
stopFn := func() {
_ = cc.Close()
grpcServer.Stop()
_ = lis.Close()
}
return &MockServer{
Log: logServer,
Admin: adminServer,
LogClient: trillian.NewTrillianLogClient(cc),
AdminClient: trillian.NewTrillianAdminClient(cc),
Addr: lis.Addr().String(),
}, stopFn, nil
}