mirror of https://github.com/golang/go.git
55 lines
1.6 KiB
Go
55 lines
1.6 KiB
Go
// Copyright 2020 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Package servertest provides utilities for running tests against a remote LSP
|
|
// server.
|
|
package servertest
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net"
|
|
|
|
"golang.org/x/tools/internal/jsonrpc2"
|
|
)
|
|
|
|
// Server is a helper for executing tests against a remote jsonrpc2 connection.
|
|
// Once initialized, its Addr field may be used to connect a jsonrpc2 client.
|
|
type Server struct {
|
|
Addr string
|
|
|
|
ln net.Listener
|
|
}
|
|
|
|
// NewServer returns a new test server listening on local tcp port and serving
|
|
// incoming jsonrpc2 streams using the provided stream server. It panics on any
|
|
// error.
|
|
func NewServer(ctx context.Context, server jsonrpc2.StreamServer) *Server {
|
|
ln, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
panic(fmt.Sprintf("servertest: failed to listen: %v", err))
|
|
}
|
|
go jsonrpc2.Serve(ctx, ln, server)
|
|
return &Server{Addr: ln.Addr().String(), ln: ln}
|
|
}
|
|
|
|
// Connect dials the test server and returns a jsonrpc2 Connection that is
|
|
// ready for use.
|
|
func (s *Server) Connect(ctx context.Context) *jsonrpc2.Conn {
|
|
netConn, err := net.Dial("tcp", s.Addr)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("servertest: failed to connect to test instance: %v", err))
|
|
}
|
|
conn := jsonrpc2.NewConn(jsonrpc2.NewHeaderStream(netConn, netConn))
|
|
go conn.Run(ctx)
|
|
return conn
|
|
}
|
|
|
|
// Close is a placeholder for proper test server shutdown.
|
|
// TODO: implement proper shutdown, which gracefully closes existing
|
|
// connections to the test server.
|
|
func (s *Server) Close() error {
|
|
return nil
|
|
}
|