节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
2.27 KiB
Stardust
using NewLife.Security;
using Stardust.Data;
using Stardust.Server.Services;
using Xunit;

namespace ServerTest.Services;

/// <summary>热窗口事件发布者校验测试。验证仅平台管理端应用可发布热门应用通知,防止任意应用刷热窗口放大写量</summary>
public class HotAppEventServiceTests
{
    [Fact(DisplayName = "空标识与未知标识被拒绝")]
    public void IsAllowedPublisher_Invalid()
    {
        Assert.False(HotAppEventService.IsAllowedPublisher(null));
        Assert.False(HotAppEventService.IsAllowedPublisher(""));
        Assert.False(HotAppEventService.IsAllowedPublisher("10.99.99.99@999999"));
    }

    [Fact(DisplayName = "平台管理端应用在线时放行,普通应用拒绝")]
    public void IsAllowedPublisher_Whitelist()
    {
        // 普通应用:不在白名单
        var normal = new App { Name = "sva_" + Rand.NextString(8), Enable = true, Secret = Rand.NextString(16) };
        normal.Insert();
        var normalClient = $"10.88.88.89@{Rand.Next(10000, 99999)}";
        var normalOnline = new AppOnline { AppId = normal.Id, Name = normal.Name, Client = normalClient, CreateTime = DateTime.Now, UpdateTime = DateTime.Now };
        normalOnline.Insert();

        // 平台管理端应用:可能已存在,则复用
        var web = App.FindByName("StarWeb");
        var created = false;
        if (web == null)
        {
            web = new App { Name = "StarWeb", Enable = true, Secret = Rand.NextString(16) };
            web.Insert();
            created = true;
        }
        var webClient = $"10.88.88.88@{Rand.Next(10000, 99999)}";
        var webOnline = new AppOnline { AppId = web.Id, Name = web.Name, Client = webClient, CreateTime = DateTime.Now, UpdateTime = DateTime.Now };
        webOnline.Insert();

        // 插入后清理实体缓存,保证 FindByClient 立即可见
        AppOnline.Meta.Cache.Clear(nameof(HotAppEventServiceTests));

        try
        {
            Assert.True(HotAppEventService.IsAllowedPublisher(webClient));
            Assert.False(HotAppEventService.IsAllowedPublisher(normalClient));
        }
        finally
        {
            webOnline.Delete();
            normalOnline.Delete();
            normal.Delete();
            if (created) web.Delete();
        }
    }
}