节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
1.58 KiB
Stardust
using System;
using System.Linq;
using Stardust.Data.Nodes;
using XCode;
using Xunit;

namespace ServerTest.Nodes;

/// <summary>节点在线实体单元测试</summary>
public class NodeOnlineTests
{
    [Fact(DisplayName = "超长DNS与网关在Valid时被截断为字段长度,心跳保存不再抛长度超限异常")]
    public void Valid_ExtraLongDnsAndGateway_Trimmed()
    {
        // 多网卡机器上报的DNS地址列表很容易超过字段长度,心跳保存时曾抛 ArgumentOutOfRangeException
        var dns = String.Join(",", Enumerable.Range(0, 20).Select(e => $"223.5.5.{e}"));
        var gateway = String.Join(",", Enumerable.Range(0, 10).Select(e => $"192.168.1.{e}/00-11-22-33-44-{e:D2}"));
        var dnsLen = NodeOnline._.Dns.Length;
        var gatewayLen = NodeOnline._.Gateway.Length;
        Assert.True(dns.Length > dnsLen);
        Assert.True(gateway.Length > gatewayLen);

        var entity = new NodeOnline
        {
            NodeID = 1,
            Name = "TestLongDns",
            Dns = dns,
            Gateway = gateway,
            // 避免Valid内部回查Node实体,单元测试不依赖数据库
            MemoryUsed = 1,
            SpaceUsed = 1,
        };

        // 生产回归:Valid 内部先把超长字段截断,再校验字段长度,不应抛出 ArgumentOutOfRangeException
        entity.Valid(DataMethod.Update);

        Assert.Equal(dnsLen, entity.Dns.Length);
        Assert.Equal(dns[..dnsLen], entity.Dns);
        Assert.Equal(gatewayLen, entity.Gateway.Length);
        Assert.Equal(gateway[..gatewayLen], entity.Gateway);
    }
}