forked from microsoft/vs-streamjsonrpc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMessagePackFormatterTests.cs
122 lines (104 loc) · 3.73 KB
/
MessagePackFormatterTests.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.Threading;
using Nerdbank.Streams;
using StreamJsonRpc;
using StreamJsonRpc.Protocol;
using Xunit;
using Xunit.Abstractions;
public class MessagePackFormatterTests : TestBase
{
private readonly MessagePackFormatter formatter = new MessagePackFormatter();
public MessagePackFormatterTests(ITestOutputHelper logger)
: base(logger)
{
}
[Fact]
public void JsonRpcRequest_ArgsArray()
{
var original = new JsonRpcRequest
{
Id = 5,
Method = "test",
ArgumentsList = new object[] { 5, "hi", new CustomType { Age = 8 } },
};
var actual = this.Roundtrip(original);
Assert.Equal(original.Id, actual.Id);
Assert.Equal(original.Method, actual.Method);
Assert.Equal(original.ArgumentsList[0], actual.ArgumentsList[0]);
Assert.Equal(original.ArgumentsList[1], actual.ArgumentsList[1]);
Assert.Equal(((CustomType)original.ArgumentsList[2]).Age, ((CustomType)actual.ArgumentsList[2]).Age);
}
[Fact]
public void JsonRpcResult()
{
var original = new JsonRpcResult
{
Id = 5,
Result = new CustomType { Age = 7 },
};
var actual = this.Roundtrip(original);
Assert.Equal(original.Id, actual.Id);
Assert.Equal(((CustomType)original.Result).Age, ((CustomType)actual.Result).Age);
}
[Fact]
public void JsonRpcError()
{
var original = new JsonRpcError
{
Id = 5,
Error = new JsonRpcError.ErrorDetail
{
Code = JsonRpcErrorCode.InvocationError,
Message = "Oops",
Data = new CustomType { Age = 15 },
},
};
var actual = this.Roundtrip(original);
Assert.Equal(original.Id, actual.Id);
Assert.Equal(original.Error.Code, actual.Error.Code);
Assert.Equal(original.Error.Message, actual.Error.Message);
Assert.Equal(((CustomType)original.Error.Data).Age, ((CustomType)actual.Error.Data).Age);
}
[Fact]
public async Task BasicJsonRpc()
{
var (clientStream, serverStream) = FullDuplexStream.CreatePair();
var formatter = new MessagePackFormatter(compress: false);
var clientHandler = new LengthHeaderMessageHandler(clientStream.UsePipe(), formatter);
var serverHandler = new LengthHeaderMessageHandler(serverStream.UsePipe(), formatter);
var clientRpc = new JsonRpc(clientHandler);
var serverRpc = new JsonRpc(serverHandler, new Server());
serverRpc.TraceSource = new TraceSource("Server", SourceLevels.Verbose);
clientRpc.TraceSource = new TraceSource("Client", SourceLevels.Verbose);
serverRpc.TraceSource.Listeners.Add(new XunitTraceListener(this.Logger));
clientRpc.TraceSource.Listeners.Add(new XunitTraceListener(this.Logger));
clientRpc.StartListening();
serverRpc.StartListening();
int result = await clientRpc.InvokeAsync<int>(nameof(Server.Add), 3, 5).WithCancellation(this.TimeoutToken);
Assert.Equal(8, result);
}
private T Roundtrip<T>(T value)
where T : JsonRpcMessage
{
var sequence = new Sequence<byte>();
this.formatter.Serialize(sequence, value);
var actual = (T)this.formatter.Deserialize(sequence);
return actual;
}
[DataContract]
public class CustomType
{
[DataMember]
public int Age { get; set; }
}
private class Server
{
public int Add(int a, int b) => a + b;
}
}