Skip to content

Commit c25feea

Browse files
RPC Tests for RequestReponse. Updates to signature of generated methods to inject the method name automatically and to use a class-level service name (like Java). striving for simplest possible generated code.
1 parent da2f78c commit c25feea

File tree

5 files changed

+31
-15
lines changed

5 files changed

+31
-15
lines changed

RSocket.Core/RSocketServer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public virtual void RequestStream(in RSocketProtocol.RequestStream message, Read
4141

4242
public virtual void RequestResponse(in RSocketProtocol.RequestResponse message, ReadOnlySequence<byte> metadata, ReadOnlySequence<byte> data)
4343
{
44+
Transport.Output.FlushAsync();
4445
}
4546

4647
public virtual void RequestFireAndForget(in RSocketProtocol.RequestFireAndForget message, ReadOnlySequence<byte> metadata, ReadOnlySequence<byte> data)

RSocket.RPC.Tests/RSocketServiceTests.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ public class RSocketServiceTests
2121
[TestMethod]
2222
public void ServerBasicTest()
2323
{
24-
//var data = new TestData();
25-
//var response = Service.RequestResponse(data).Result;
26-
//var result = new TestData(response);
24+
var data = new TestData();
25+
var response = Service.RequestResponse(data).Result;
26+
var result = new TestData(response);
2727

28-
//Assert.AreEqual(data, result, $"{nameof(Service.RequestResponse)} did not round trip on bytes.");
28+
Assert.AreEqual(data, result, $"{nameof(Service.RequestResponse)} did not round trip on bytes.");
2929

3030
//public Task<ReadOnlySequence<byte>> requestResponse(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata = default) => base.RequestResponse<ReadOnlySequence<byte>>(ServicePrefix + nameof(EchoService), nameof(requestResponse), data, metadata);
3131
//public Task<ReadOnlySequence<byte>> requestStream(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata = default) => base.RequestStream<ReadOnlySequence<byte>>(ServicePrefix + nameof(EchoService), nameof(requestStream), data, metadata);
@@ -38,10 +38,10 @@ public void ServerBasicTest()
3838
[System.Runtime.CompilerServices.CompilerGenerated]
3939
public class TestService : RSocketService<TestService>
4040
{
41-
private const string ServicePrefix = "";
41+
private const string SERVICE = nameof(TestService);
4242
public TestService(RSocketClient client) : base(client) { }
4343
//public void fireAndForget(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata = default) { Client.RequestFireAndForget(null, data, metadata); }
44-
//public Task<ReadOnlySequence<byte>> RequestResponse(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata = default) => base.__RequestResponse<ReadOnlySequence<byte>>(ServicePrefix + nameof(TestService), nameof(RequestResponse), data, metadata);
44+
public Task<ReadOnlySequence<byte>> RequestResponse(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata = default) => __RequestResponse(data, metadata, service: SERVICE);
4545
//public Task<ReadOnlySequence<byte>> RequestStream(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata = default) => base.__RequestStream<ReadOnlySequence<byte>>(ServicePrefix + nameof(TestService), nameof(RequestStream), data, metadata);
4646
//public void requestChannel(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata = default) { Client.RequestChannel(null, data, metadata); }
4747
}
@@ -52,8 +52,9 @@ public TestService(RSocketClient client) : base(client) { }
5252
public void SupportTests()
5353
{
5454
var data = new TestData();
55-
var result = new TestData(data);
56-
Assert.AreEqual(data, result, $"TestData did not round trip on bytes.");
55+
var bytecopy = new TestData(data);
56+
Assert.AreEqual(data.GetHashCode(), bytecopy.GetHashCode(), $"TestData byte constructor did not result in hascode equality.");
57+
Assert.AreEqual(data, bytecopy, $"TestData byte constructor did not result in equality.");
5758
}
5859

5960
public class TestData

RSocket.RPC/RSocketService.cs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using System.Collections.Generic;
55
using System.Threading.Tasks;
6+
using System.Runtime.CompilerServices;
67

78
namespace RSocket.RPC
89
{
@@ -14,14 +15,27 @@ public abstract class RSocketService<T> : IRSocketStream
1415

1516
protected void __RequestFireAndForget(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata = default) { Client.RequestFireAndForget(null, data, metadata); }
1617

18+
protected async Task<TResult> __RequestFireAndForget<TMessage, TResult>(string service, string method, TMessage message, Func<TMessage, byte[]> intransform, Func<byte[], TResult> outtransform, ReadOnlySequence<byte> metadata = default, ReadOnlySequence<byte> tracing = default) =>
19+
outtransform((await __RequestFireAndForget(service, method, new ReadOnlySequence<byte>(intransform(message)), metadata, tracing)).ToArray());
1720

18-
protected async Task<TResult> __RequestResponse<TMessage, TResult>(string service, string method, TMessage message, Func<TMessage, byte[]> intransform, Func<byte[], TResult> outtransform, ReadOnlySequence<byte> metadata = default, ReadOnlySequence<byte> tracing = default) =>
19-
outtransform((await __RequestResponse(service, method, new ReadOnlySequence<byte>(intransform(message)), metadata, tracing)).ToArray());
21+
protected async Task<TResult> __RequestFireAndForget<TMessage, TResult>(string service, string method, TMessage message, Func<TMessage, ReadOnlySequence<byte>> intransform, Func<ReadOnlySequence<byte>, TResult> outtransform, ReadOnlySequence<byte> metadata = default, ReadOnlySequence<byte> tracing = default) =>
22+
outtransform(await __RequestFireAndForget(service, method, intransform(message), metadata, tracing));
2023

21-
protected async Task<TResult> __RequestResponse<TMessage, TResult>(string service, string method, TMessage message, Func<TMessage, ReadOnlySequence<byte>> intransform, Func<ReadOnlySequence<byte>, TResult> outtransform, ReadOnlySequence<byte> metadata = default, ReadOnlySequence<byte> tracing = default) =>
22-
outtransform(await __RequestResponse(service, method, intransform(message), metadata, tracing));
24+
protected async Task<ReadOnlySequence<byte>> __RequestFireAndForget(string service, string method, ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata = default, ReadOnlySequence<byte> tracing = default)
25+
{
26+
var receiver = new Receiver();
27+
await Client.RequestResponse(receiver, data, new RemoteProcedureCall.RemoteProcedureCallMetadata(service, method, metadata, tracing));
28+
return await receiver.Task.ConfigureAwait(false);
29+
}
30+
31+
32+
protected async Task<TResult> __RequestResponse<TMessage, TResult>(TMessage message, Func<TMessage, byte[]> intransform, Func<byte[], TResult> outtransform, ReadOnlySequence<byte> metadata = default, ReadOnlySequence<byte> tracing = default, string service = default, [CallerMemberName]string method = default) =>
33+
outtransform((await __RequestResponse(new ReadOnlySequence<byte>(intransform(message)), metadata, tracing, service: service, method: method)).ToArray());
34+
35+
protected async Task<TResult> __RequestResponse<TMessage, TResult>(TMessage message, Func<TMessage, ReadOnlySequence<byte>> intransform, Func<ReadOnlySequence<byte>, TResult> outtransform, ReadOnlySequence<byte> metadata = default, ReadOnlySequence<byte> tracing = default, string service = default, [CallerMemberName]string method = default) =>
36+
outtransform(await __RequestResponse(intransform(message), metadata, tracing, service: service, method: method));
2337

24-
protected async Task<ReadOnlySequence<byte>> __RequestResponse(string service, string method, ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata = default, ReadOnlySequence<byte> tracing = default)
38+
protected async Task<ReadOnlySequence<byte>> __RequestResponse(ReadOnlySequence<byte> data, ReadOnlySequence<byte> metadata = default, ReadOnlySequence<byte> tracing = default, string service = default, [CallerMemberName]string method = default)
2539
{
2640
var receiver = new Receiver();
2741
await Client.RequestResponse(receiver, data, new RemoteProcedureCall.RemoteProcedureCallMetadata(service, method, metadata, tracing));

RSocketRPCSample/EchoService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class EchoService : RSocketService<EchoService>, IEchoService
3030
public EchoService(RSocketClient client) : base(client) { }
3131

3232
//TODO Consider CallerMemberName because the servicename is basically fixed. Also, consider static class...
33-
public Task<BytesValue> requestResponse(BytesValue message, ReadOnlySequence<byte> metadata = default) => __RequestResponse(SERVICE, nameof(requestResponse), message, Google.Protobuf.MessageExtensions.ToByteArray, BytesValue.Parser.ParseFrom, metadata);
33+
public Task<BytesValue> requestResponse(BytesValue message, ReadOnlySequence<byte> metadata = default) => __RequestResponse(message, Google.Protobuf.MessageExtensions.ToByteArray, BytesValue.Parser.ParseFrom, metadata, service: SERVICE);
3434

3535

3636

RSocketRPCSample/SimpleService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public class SimpleService : RSocketService<SimpleService>, ISimpleService
3535

3636
public SimpleService(RSocketClient client) : base(client) { }
3737

38-
public Task<SimpleResponse> RequestReply(SimpleRequest message, ReadOnlySequence<byte> metadata = default) => __RequestResponse(SERVICE, nameof(RequestReply), message, Google.Protobuf.MessageExtensions.ToByteArray, SimpleResponse.Parser.ParseFrom, metadata);
38+
public Task<SimpleResponse> RequestReply(SimpleRequest message, ReadOnlySequence<byte> metadata = default) => __RequestResponse(message, Google.Protobuf.MessageExtensions.ToByteArray, SimpleResponse.Parser.ParseFrom, metadata, service: SERVICE);
3939

4040

4141
//rpc RequestReply(SimpleRequest) returns(SimpleResponse) { }

0 commit comments

Comments
 (0)