xref: /llvm-project/clang-tools-extra/clangd/test/protocol.test (revision ff7b5bac04fa4946935ea45214e29f267d6c1d7b)
1# RUN: not clangd -pretty -sync -enable-test-uri-scheme < %s | FileCheck -strict-whitespace %s
2# RUN: not clangd -pretty -sync -enable-test-uri-scheme < %s 2>&1 | FileCheck -check-prefix=STDERR %s
3# vim: fileformat=dos
4# It is absolutely vital that this file has CRLF line endings.
5#
6# Note that we invert the test because we intent to let clangd exit prematurely.
7#
8# Test protocol parsing
9Content-Length: 125
10Content-Type: application/vscode-jsonrpc; charset-utf-8
11
12{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}}
13# Test message with Content-Type after Content-Length
14#
15#      CHECK:  "jsonrpc": "2.0",
16# CHECK-NEXT:  "result": {
17#      CHECK:  }
18Content-Length: 246
19
20{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"test:///main.cpp","languageId":"cpp","version":1,"text":"struct fake { int a, bb, ccc; int f(int i, const float f) const; };\nint main() {\n  fake f;\n  f.\n}\n"}}}
21
22Content-Length: 104
23
24{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"test:///main.cpp"}}}
25
26Content-Type: application/vscode-jsonrpc; charset-utf-8
27Content-Length: 146
28
29{"jsonrpc":"2.0","id":1,"method":"textDocument/completion","params":{"textDocument":{"uri":"test:/main.cpp"},"position":{"line":3,"character":5}}}
30# Test message with Content-Type before Content-Length
31#
32#      CHECK:  "id": 1,
33# CHECK-NEXT:  "jsonrpc": "2.0",
34# CHECK-NEXT:  "result": {
35# CHECK-NEXT:    "isIncomplete": false,
36# CHECK-NEXT:    "items": [
37#      CHECK:        "filterText": "a",
38# CHECK-NEXT:        "insertText": "a",
39# CHECK-NEXT:        "insertTextFormat": 1,
40# CHECK-NEXT:        "kind": 5,
41# CHECK-NEXT:        "label": " a",
42# CHECK-NEXT:        "score": {{[0-9]+.[0-9]+}},
43# CHECK-NEXT:        "sortText": "{{.*}}"
44#      CHECK:    ]
45# CHECK-NEXT:  }
46
47X-Test: Testing
48Content-Type: application/vscode-jsonrpc; charset-utf-8
49Content-Length: 146
50Content-Type: application/vscode-jsonrpc; charset-utf-8
51X-Testing: Test
52
53{"jsonrpc":"2.0","id":2,"method":"textDocument/completion","params":{"textDocument":{"uri":"test:/main.cpp"},"position":{"line":3,"character":5}}}
54
55Content-Type: application/vscode-jsonrpc; charset-utf-8
56Content-Length: 10
57Content-Length: 146
58
59{"jsonrpc":"2.0","id":3,"method":"textDocument/completion","params":{"textDocument":{"uri":"test:/main.cpp"},"position":{"line":3,"character":5}}}
60# Test message with duplicate Content-Length headers
61#
62#      CHECK:  "id": 3,
63# CHECK-NEXT:  "jsonrpc": "2.0",
64# CHECK-NEXT:  "result": {
65# CHECK-NEXT:    "isIncomplete": false,
66# CHECK-NEXT:    "items": [
67#      CHECK:        "filterText": "a",
68# CHECK-NEXT:        "insertText": "a",
69# CHECK-NEXT:        "insertTextFormat": 1,
70# CHECK-NEXT:        "kind": 5,
71# CHECK-NEXT:        "label": " a",
72# CHECK-NEXT:        "score": {{[0-9]+.[0-9]+}},
73# CHECK-NEXT:        "sortText": "{{.*}}"
74#      CHECK:    ]
75# CHECK-NEXT:  }
76# STDERR: Warning: Duplicate Content-Length header received. The previous value for this message (10) was ignored.
77
78Content-Type: application/vscode-jsonrpc; charset-utf-8
79Content-Length: 10
80
81{"jsonrpc":"2.0","id":4,"method":"textDocument/completion","params":{"textDocument":{"uri":"test:/main.cpp"},"position":{"line":3,"character":5}}}
82# Test message with malformed Content-Length
83#
84# STDERR: JSON parse error
85# Ensure we recover by sending another (valid) message
86
87Content-Length: 146
88
89{"jsonrpc":"2.0","id":5,"method":"textDocument/completion","params":{"textDocument":{"uri":"test:/main.cpp"},"position":{"line":3,"character":5}}}
90# Test message with Content-Type before Content-Length
91#
92#      CHECK:  "id": 5,
93# CHECK-NEXT:  "jsonrpc": "2.0",
94# CHECK-NEXT:  "result": {
95# CHECK-NEXT:    "isIncomplete": false,
96# CHECK-NEXT:    "items": [
97#      CHECK:        "filterText": "a",
98# CHECK-NEXT:        "insertText": "a",
99# CHECK-NEXT:        "insertTextFormat": 1,
100# CHECK-NEXT:        "kind": 5,
101# CHECK-NEXT:        "label": " a",
102# CHECK-NEXT:        "score": {{[0-9]+.[0-9]+}},
103# CHECK-NEXT:        "sortText": "{{.*}}"
104#      CHECK:    ]
105# CHECK-NEXT:  }
106Content-Length: 1024
107
108{"jsonrpc":"2.0","id":5,"method":"textDocument/completion","params":{"textDocument":{"uri":"test:/main.cpp"},"position":{"line":3,"character":5}}}
109# Test message which reads beyond the end of the stream.
110#
111# Ensure this is the last test in the file!
112# STDERR: Input was aborted. Read only {{[0-9]+}} bytes of expected {{[0-9]+}}.
113
114