v3.1 对标v11核心库,提升内存效率,降低GC
大石头 authored at 2024-09-11 18:50:36
1.94 KiB
NewLife.Remoting
using System;
using System.Threading;
using NewLife;
using NewLife.Data;
using NewLife.Log;
using NewLife.Messaging;
using NewLife.Remoting;
using NewLife.Security;
using NewLife.Serialization;
using Xunit;

namespace XUnitTest.Remoting;

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

    public ApiDownTests()
    {
        var port = Rand.Next(10000, 65535);

        _Server = new ApiServer(port)
        {
            Log = XTrace.Log,
            //EncoderLog = XTrace.Log,
            ShowError = true,
        };
        _Server.Start();

        _Uri = $"tcp://127.0.0.1:{port}";

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

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

        _Server.TryDispose();
    }

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

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

        Thread.Sleep(200);

        var msg = _Client.LastMessage;
        Assert.NotNull(msg);

        // 解码消息
        var messge = _Client.Encoder.Decode(msg);
        Assert.NotNull(messge);
        Assert.Equal("CustomCommand", messge.Action);
        Assert.Equal(0, messge.Code);
        Assert.Equal(JsonHelper.ToJson(args), messge.Data.ToStr());
    }

    private class MyClient : ApiClient
    {
        public IMessage LastMessage { get; set; }

        protected override void OnReceive(IMessage message, ApiReceivedEventArgs e) => LastMessage = message;
    }
}