Skip to content

Commit 8f50206

Browse files
Updated router and added jsonrpc integration tests (#274)
* Updated router and added jsonrpc integration tests * disabled new tests
1 parent c6cea42 commit 8f50206

File tree

4 files changed

+509
-3
lines changed

4 files changed

+509
-3
lines changed

src/Shared/LspRequestRouter.cs

+12-2
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,21 @@ private IRequestDescriptor<ILspHandlerDescriptor> FindDescriptor(string method,
5858
return new RequestDescriptor<ILspHandlerDescriptor>();
5959
}
6060

61-
if (@params == null || descriptor.Params == null) return new RequestDescriptor<ILspHandlerDescriptor>(new [] { descriptor });
61+
if (@params == null || descriptor.Params == null) return new RequestDescriptor<ILspHandlerDescriptor>(new[] { descriptor });
62+
63+
object paramsValue = null;
64+
if (descriptor.IsDelegatingHandler)
65+
{
66+
var o = @params?.ToObject(descriptor.Params.GetGenericArguments()[0], _serializer.JsonSerializer);
67+
paramsValue = Activator.CreateInstance(descriptor.Params, new object[] { o });
68+
}
69+
else
70+
{
71+
paramsValue = @params?.ToObject(descriptor.Params, _serializer.JsonSerializer);
72+
}
6273

6374
var lspHandlerDescriptors = _collection.Where(handler => handler.Method == method).ToList();
6475

65-
var paramsValue = @params.ToObject(descriptor.Params, _serializer.JsonSerializer);
6676
var matchDescriptor = _handlerMatchers.SelectMany(strat => strat.FindHandler(paramsValue, lspHandlerDescriptors)).ToArray();
6777
if (matchDescriptor.Length > 0) return new RequestDescriptor<ILspHandlerDescriptor>(matchDescriptor);
6878
// execute command is a special case
+247
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
// using System;
2+
// using System.Linq;
3+
// using System.Reactive.Subjects;
4+
// using System.Threading;
5+
// using System.Threading.Tasks;
6+
// using FluentAssertions;
7+
// using MediatR;
8+
// using NSubstitute;
9+
// using OmniSharp.Extensions.DebugAdapter.Testing;
10+
// using OmniSharp.Extensions.JsonRpc;
11+
// using OmniSharp.Extensions.JsonRpc.Server;
12+
// using OmniSharp.Extensions.JsonRpc.Testing;
13+
// using Xunit;
14+
// using Xunit.Abstractions;
15+
16+
// namespace Dap.Tests
17+
// {
18+
// public class JsonRpcIntegrationTests : DebugAdapterProtocolTestBase
19+
// {
20+
// public JsonRpcIntegrationTests(ITestOutputHelper outputHelper) : base(new JsonRpcTestOptions().ConfigureForXUnit(outputHelper))
21+
// {
22+
// }
23+
24+
// class Request : IRequest<Data>
25+
// {
26+
27+
// }
28+
29+
// class Data
30+
// {
31+
// public string Value { get; set; }
32+
// }
33+
34+
// [Fact]
35+
// public async Task Should_Send_and_receive_requests()
36+
// {
37+
// var (client, server) = await Initialize(
38+
// client => { client.OnRequest("myrequest", async () => new Data() {Value = "myresponse"}); },
39+
// server => { server.OnRequest("myrequest", async () => new Data() {Value = string.Join("", "myresponse".Reverse())}); }
40+
// );
41+
42+
// var serverResponse = await client.SendRequest("myrequest").Returning<Data>(CancellationToken);
43+
// serverResponse.Value.Should().Be("esnopserym");
44+
45+
// var clientResponse = await server.SendRequest("myrequest").Returning<Data>(CancellationToken);
46+
// clientResponse.Value.Should().Be("myresponse");
47+
// }
48+
49+
// [Fact(Skip = "DAP does not define invalid parameters semantics")]
50+
// public async Task Should_throw_when_sending_requests()
51+
// {
52+
// var (client, server) = await Initialize(
53+
// client => { client.OnRequest("myrequest", async (Request request) => new Data() {Value = "myresponse"}); },
54+
// server => { server.OnRequest("myrequest", async (Request request) => new Data() {Value = string.Join("", "myresponse".Reverse())}); }
55+
// );
56+
57+
// Func<Task> clientRequest = () => client.SendRequest("myrequest", (Request)null).Returning<Data>(CancellationToken);
58+
// clientRequest.Should().Throw<InvalidParametersException>();
59+
60+
// Func<Task> serverRequest = () => server.SendRequest("myrequest", (Request)null).Returning<Data>(CancellationToken);
61+
// serverRequest.Should().Throw<InvalidParametersException>();
62+
// }
63+
64+
// [Fact]
65+
// public async Task Should_throw_when_receiving_requests()
66+
// {
67+
// var (client, server) = await Initialize(
68+
// client => { client.OnRequest("myrequest", async (Request request) => (Data)null); },
69+
// server => { server.OnRequest("myrequest", async (Request request) => (Data)null); }
70+
// );
71+
72+
// Func<Task> clientRequest = () => client.SendRequest("myrequest", new Request()).Returning<Data>(CancellationToken);
73+
// clientRequest.Should().Throw<InternalErrorException>();
74+
75+
// Func<Task> serverRequest = () => server.SendRequest("myrequest", new Request()).Returning<Data>(CancellationToken);
76+
// serverRequest.Should().Throw<InternalErrorException>();
77+
// }
78+
79+
// [Fact]
80+
// public async Task Should_Send_and_receive_notifications()
81+
// {
82+
// var clientNotification = new AsyncSubject<Data>();
83+
// var serverNotification = new AsyncSubject<Data>();
84+
// var (client, server) = await Initialize(
85+
// client => {
86+
// client.OnNotification("mynotification", (Data data) => {
87+
// clientNotification.OnNext(data);
88+
// clientNotification.OnCompleted();
89+
// });
90+
// },
91+
// server => {
92+
// server.OnNotification("mynotification", (Data data) => {
93+
// serverNotification.OnNext(data);
94+
// serverNotification.OnCompleted();
95+
// });
96+
// }
97+
// );
98+
99+
// client.SendNotification("mynotification", new Data() {Value = "myresponse"});
100+
// var serverResponse = await serverNotification;
101+
// serverResponse.Value.Should().Be("myresponse");
102+
103+
// server.SendNotification("mynotification", new Data() {Value = string.Join("", "myresponse".Reverse())});
104+
// var clientResponse = await clientNotification;
105+
// clientResponse.Value.Should().Be("esnopserym");
106+
// }
107+
108+
// [Fact]
109+
// public async Task Should_Send_and_cancel_requests_immediate()
110+
// {
111+
// var (client, server) = await Initialize(
112+
// client => {
113+
// client.OnRequest("myrequest", async (ct) => {
114+
// await Task.Delay(TimeSpan.FromMinutes(1), ct);
115+
// return new Data() {Value = "myresponse"};
116+
// });
117+
// },
118+
// server => {
119+
// server.OnRequest("myrequest", async (ct) => {
120+
// await Task.Delay(TimeSpan.FromMinutes(1), ct);
121+
// return new Data() {Value = string.Join("", "myresponse".Reverse())};
122+
// });
123+
// }
124+
// );
125+
126+
// var cts = new CancellationTokenSource();
127+
// cts.Cancel();
128+
129+
// {
130+
// Func<Task> action = () => client.SendRequest("myrequest").Returning<Data>(cts.Token);
131+
// await action.Should().ThrowAsync<OperationCanceledException>();
132+
// }
133+
134+
// {
135+
// Func<Task> action = () => server.SendRequest("myrequest").Returning<Data>(cts.Token);
136+
// await action.Should().ThrowAsync<OperationCanceledException>();
137+
// }
138+
// }
139+
140+
// [Fact]
141+
// public async Task Should_Send_and_cancel_requests_from_otherside()
142+
// {
143+
// var (client, server) = await Initialize(
144+
// client => {
145+
// client.OnRequest("myrequest", async (ct) => {
146+
// await Task.Delay(TimeSpan.FromMinutes(1), ct);
147+
// return new Data() {Value = "myresponse"};
148+
// });
149+
// },
150+
// server => {
151+
// server.OnRequest("myrequest", async (ct) => {
152+
// await Task.Delay(TimeSpan.FromMinutes(1), ct);
153+
// return new Data() {Value = string.Join("", "myresponse".Reverse())};
154+
// });
155+
// }
156+
// );
157+
158+
// {
159+
// var cts = new CancellationTokenSource();
160+
// Func<Task> action = () => client.SendRequest("myrequest").Returning<Data>(cts.Token);
161+
// cts.CancelAfter(10);
162+
// await action.Should().ThrowAsync<RequestCancelledException>();
163+
// }
164+
165+
// {
166+
// var cts = new CancellationTokenSource();
167+
// Func<Task> action = () => server.SendRequest("myrequest").Returning<Data>(cts.Token);
168+
// cts.CancelAfter(10);
169+
// await action.Should().ThrowAsync<RequestCancelledException>();
170+
// }
171+
// }
172+
173+
// [Fact(Skip = "Not supported by the DAP")]
174+
// public async Task Should_Cancel_Parallel_Requests_When_Options_Are_Given()
175+
// {
176+
// var (client, server) = await Initialize(
177+
// client => {
178+
// client.OnRequest(
179+
// "parallelrequest",
180+
// async (ct) => {
181+
// await Task.Delay(TimeSpan.FromSeconds(10), ct);
182+
// return new Data() {Value = "myresponse"};
183+
// },
184+
// new JsonRpcHandlerOptions() {RequestProcessType = RequestProcessType.Parallel});
185+
// client.OnRequest(
186+
// "serialrequest",
187+
// async (ct) => new Data() {Value = "myresponse"},
188+
// new JsonRpcHandlerOptions() {RequestProcessType = RequestProcessType.Serial}
189+
// );
190+
// },
191+
// server => {
192+
// server.OnRequest(
193+
// "parallelrequest",
194+
// async (ct) => {
195+
// await Task.Delay(TimeSpan.FromSeconds(10), ct);
196+
// return new Data() {Value = "myresponse"};
197+
// },
198+
// new JsonRpcHandlerOptions() {RequestProcessType = RequestProcessType.Parallel});
199+
// server.OnRequest(
200+
// "serialrequest",
201+
// async (ct) => new Data() {Value = "myresponse"},
202+
// new JsonRpcHandlerOptions() {RequestProcessType = RequestProcessType.Serial}
203+
// );
204+
// }
205+
// );
206+
207+
// {
208+
// var task = client.SendRequest("parallelrequest").Returning<Data>(CancellationToken);
209+
// await client.SendRequest("serialrequest").Returning<Data>(CancellationToken);
210+
// Func<Task> action = () => task;
211+
// await action.Should().ThrowAsync<ContentModifiedException>();
212+
// }
213+
214+
// {
215+
// var task = server.SendRequest("parallelrequest").Returning<Data>(CancellationToken);
216+
// await server.SendRequest("serialrequest").Returning<Data>(CancellationToken);
217+
// Func<Task> action = () => task;
218+
// await action.Should().ThrowAsync<ContentModifiedException>();
219+
// }
220+
// }
221+
222+
// [Fact]
223+
// public async Task Should_Link_Request_A_to_Request_B()
224+
// {
225+
// var (client, server) = await Initialize(
226+
// client => {
227+
// client
228+
// .OnRequest("myrequest", async () => new Data() {Value = "myresponse"})
229+
// .WithLink("myrequest", "myrequest2")
230+
// ;
231+
// },
232+
// server => {
233+
// server
234+
// .OnRequest("myrequest", async () => new Data() {Value = string.Join("", "myresponse".Reverse())})
235+
// .WithLink("myrequest", "myrequest2")
236+
// ;
237+
// }
238+
// );
239+
240+
// var serverResponse = await client.SendRequest("myrequest2").Returning<Data>(CancellationToken);
241+
// serverResponse.Value.Should().Be("esnopserym");
242+
243+
// var clientResponse = await server.SendRequest("myrequest2").Returning<Data>(CancellationToken);
244+
// clientResponse.Value.Should().Be("myresponse");
245+
// }
246+
// }
247+
// }

test/Lsp.Tests/Integration/DynamicRegistrationTests.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Linq;
33
using System.Reactive.Linq;
44
using System.Reactive.Threading.Tasks;
@@ -61,6 +61,8 @@ public async Task Should_Register_Dynamically_While_Server_Is_Running()
6161

6262
await SettleNext();
6363

64+
await SettleNext();
65+
6466
client.RegistrationManager.CurrentRegistrations.Should().Contain(x =>
6567
x.Method == TextDocumentNames.Completion && SelectorMatches(x, z=> z.HasLanguage && z.Language == "vb")
6668
);

0 commit comments

Comments
 (0)