|
| 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 | +// } |
0 commit comments