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 }