github.com/tiagovtristao/plz@v13.4.0+incompatible/tools/build_langserver/langserver/handler_test.go (about)

     1  package langserver
     2  
     3  import (
     4  	"context"
     5  	"github.com/thought-machine/please/src/core"
     6  	"github.com/sourcegraph/jsonrpc2"
     7  	"github.com/stretchr/testify/assert"
     8  	"net"
     9  	"strings"
    10  	"testing"
    11  	"github.com/thought-machine/please/tools/build_langserver/lsp"
    12  )
    13  
    14  // TODO(bnm): cleanup
    15  
    16  var bindAddr = "127.0.0.1:4040"
    17  
    18  func TestHandle(t *testing.T) {
    19  	h := NewHandler()
    20  	lis := startServer(t, h)
    21  	defer lis.Close()
    22  	conn := dialServer(t, bindAddr)
    23  	defer func() {
    24  		if err := conn.Close(); err != nil {
    25  			t.Fatal("conn.Close:", err)
    26  		}
    27  	}()
    28  
    29  	ctx := context.Background()
    30  	tdCap := lsp.TextDocumentClientCapabilities{}
    31  
    32  	var result lsp.InitializeResult
    33  	if err := conn.Call(ctx, "initialize", lsp.InitializeParams{
    34  		RootURI:      lsp.DocumentURI(core.RepoRoot),
    35  		Capabilities: lsp.ClientCapabilities{TextDocument: tdCap},
    36  	}, &result); err != nil {
    37  		t.Fatal("initialize:", err)
    38  	}
    39  	t.Log(result)
    40  
    41  	var result2 lsp.Hover
    42  	uri := lsp.DocumentURI(exampleBuildURI)
    43  	openFile(ctx, t, conn, uri)
    44  
    45  	if err := conn.Call(ctx, "textDocument/hover", lsp.TextDocumentPositionParams{
    46  		TextDocument: lsp.TextDocumentIdentifier{
    47  			URI: lsp.DocumentURI(exampleBuildURI),
    48  		},
    49  		Position: lsp.Position{Line: 0, Character: 3},
    50  	}, &result2); err != nil {
    51  		t.Fatal("hover:", err)
    52  	}
    53  	t.Log(result2)
    54  }
    55  
    56  /*
    57   * Utilities function for tests in this file
    58   */
    59  func startServer(t testing.TB, h jsonrpc2.Handler) net.Listener {
    60  	listener, err := net.Listen("tcp", bindAddr)
    61  	if err != nil {
    62  		t.Fatal("Listen:", err)
    63  	}
    64  	go func() {
    65  		if err := serve(context.Background(), listener, h); err != nil && !strings.Contains(err.Error(), "use of closed network connection") {
    66  			t.Fatal("jsonrpc2.Serve:", err)
    67  		}
    68  	}()
    69  	return listener
    70  }
    71  
    72  func serve(ctx context.Context, lis net.Listener, h jsonrpc2.Handler) error {
    73  	for {
    74  		conn, err := lis.Accept()
    75  		if err != nil {
    76  			return err
    77  		}
    78  		jsonrpc2.NewConn(ctx, jsonrpc2.NewBufferedStream(conn, jsonrpc2.VSCodeObjectCodec{}), h)
    79  	}
    80  }
    81  
    82  func dialServer(t testing.TB, addr string) *jsonrpc2.Conn {
    83  	conn, err := (&net.Dialer{}).Dial("tcp", addr)
    84  	if err != nil {
    85  		t.Fatal(err)
    86  	}
    87  
    88  	handler := jsonrpc2.HandlerWithError(func(ctx context.Context, conn *jsonrpc2.Conn, req *jsonrpc2.Request) (interface{}, error) {
    89  		return nil, nil
    90  	})
    91  
    92  	return jsonrpc2.NewConn(
    93  		context.Background(),
    94  		jsonrpc2.NewBufferedStream(conn, jsonrpc2.VSCodeObjectCodec{}),
    95  		handler,
    96  	)
    97  }
    98  
    99  func openFile(ctx context.Context, t testing.TB, conn *jsonrpc2.Conn, uri lsp.DocumentURI) {
   100  	content, err := ReadFile(ctx, uri)
   101  	assert.Equal(t, nil, err)
   102  	text := strings.Join(content, "\n")
   103  
   104  	if err := conn.Call(ctx, "textDocument/didOpen", lsp.DidOpenTextDocumentParams{
   105  		TextDocument: lsp.TextDocumentItem{
   106  			URI:        uri,
   107  			LanguageID: "build",
   108  			Version:    1,
   109  			Text:       text,
   110  		},
   111  	}, nil); err != nil {
   112  		t.Fatal("open failure:", err)
   113  	}
   114  }