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

namespace Stardust.Tests;

/// <summary>应用服务管理测试。覆盖服务集合的增删、配置拷贝与按进程查询,不启动真实进程</summary>
public class ServiceManagerTests
{
    [Fact(DisplayName = "添加服务后可查询,同名服务覆盖且不计新增")]
    public void Add_And_Replace()
    {
        using var manager = new ServiceManager();

        Assert.Empty(manager.Services ?? []);
        Assert.Empty(manager.RunningServices);

        var count = manager.Add(
            new ServiceInfo { Name = "app1", FileName = "a.dll" },
            new ServiceInfo { Name = "app2", FileName = "b.dll" });
        Assert.Equal(2, count);
        Assert.Equal(2, manager.Services!.Length);

        // 名称不区分大小写,同名覆盖不增加数量
        var added = manager.Add(new ServiceInfo { Name = "APP1", FileName = "c.dll" });
        Assert.Equal(0, added);
        Assert.Equal(2, manager.Services!.Length);
        Assert.Equal("c.dll", manager.Services!.First(e => e.Name.EqualIgnoreCase("app1")).FileName);

        // 名称为空的服务被忽略
        manager.Add(new ServiceInfo { Name = "", FileName = "d.dll" });
        Assert.Equal(2, manager.Services!.Length);
    }

    [Fact(DisplayName = "移除服务返回删除数量,不存在时返回0")]
    public void Remove_Works()
    {
        using var manager = new ServiceManager();
        manager.Add(new ServiceInfo { Name = "app1" }, new ServiceInfo { Name = "app2" });

        Assert.Equal(1, manager.Remove("app1"));
        Assert.Single(manager.Services!);
        Assert.Equal(0, manager.Remove("app1"));
        Assert.Equal(0, manager.Remove(""));
    }

    [Fact(DisplayName = "SetServices 克隆配置,外部对象修改不影响内部")]
    public void SetServices_Clones()
    {
        using var manager = new ServiceManager();
        var services = new[] { new ServiceInfo { Name = "app1", FileName = "a.dll" } };

        manager.SetServices(services);
        services[0].FileName = "changed.dll";

        Assert.Single(manager.Services!);
        Assert.Equal("a.dll", manager.Services![0].FileName);
    }

    [Fact(DisplayName = "按进程编号查询控制器,非法编号或未托管进程返回空")]
    public void QueryByProcess_ReturnsNull()
    {
        using var manager = new ServiceManager();

        Assert.Null(manager.QueryByProcess(0));
        Assert.Null(manager.QueryByProcess(-1));
        Assert.Null(manager.QueryByProcess(Environment.ProcessId));
    }
}