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