RPC远程过程调用,二进制封装,提供高吞吐低延迟的高性能RPC框架
大石头 authored at 2022-08-10 13:26:19
2.58 KiB
NewLife.Remoting
using System;
using System.Threading.Tasks;
using NewLife;
using NewLife.Data;
using NewLife.Log;
using NewLife.Messaging;
using NewLife.Remoting;
using NewLife.Security;
using NewLife.Serialization;
using Xunit;

namespace XUnitTest.Integration;

/// <summary>RPC下行指令测试</summary>
public class ApiDownTests : DisposeBase
{
    private readonly ApiServer _Server;
    private readonly MyClient _Client;
    private readonly String _Uri;

    public ApiDownTests()
    {
        _Server = new ApiServer(0)
        {
            Multiplex = false,
            Log = XTrace.Log,
            EncoderLog = XTrace.Log,
            ShowError = true,
        };
        _Server.Start();

        _Uri = $"tcp://127.0.0.1:{_Server.Port}";

        var client = new MyClient
        {
            Servers = [_Uri],
            Log = XTrace.Log,
            EncoderLog = XTrace.Log,
        };
        _Client = client;
    }

    protected override void Dispose(Boolean disposing)
    {
        base.Dispose(disposing);

        _Server.TryDispose();
    }

    [Fact]
    public async Task Test1()
    {
        var apis = await _Client.InvokeAsync<String[]>("api/all");
        Assert.NotNull(apis);
        _Client.HasReceivedMessage = false;

        // 服务端主动下发
        var ss = _Server.Server.AllSessions[0];
        var args = new { name = "Stone", age = 36 };
        ss.InvokeOneWay("CustomCommand", args);

        // 等待消息到达
        for (var i = 0; i < 50 && !_Client.HasReceivedMessage; i++)
        {
            await Task.Delay(50);
        }
        await Task.Delay(50);

        Assert.True(_Client.HasReceivedMessage);
        Assert.Equal("CustomCommand", _Client.LastAction);
        Assert.Equal(0, _Client.LastCode);
        Assert.Equal(JsonHelper.ToJson(args), _Client.LastData);
    }

    private class MyClient : ApiClient
    {
        public Boolean HasReceivedMessage { get; set; }
        public String? LastAction { get; set; }
        public Int32 LastCode { get; set; }
        public String? LastData { get; set; }

        protected override void OnReceive(IMessage message, ApiReceivedEventArgs e)
        {
            XTrace.WriteLine("ApiDownTest收到:{0}", e.ApiMessage.Action);

            // OnReceive 退出后 message.Payload 和 e.ApiMessage 会被释放,必须在此处捕获数据
            if (e.ApiMessage != null)
            {
                LastAction = e.ApiMessage.Action;
                LastCode = e.ApiMessage.Code;
                LastData = e.ApiMessage.Data?.ToStr();
                HasReceivedMessage = true;
            }
        }
    }
}