节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
1.37 KiB
Stardust
using System;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
using NewLife.Security;
using Stardust.Data;
using Stardust.Data.Monitors;
using Xunit;

namespace ServerTest.Monitors;

/// <summary>应用跟踪器测试</summary>
public class AppTracerTests
{
    [Fact]
    [DisplayName("并发创建同一跟踪项不会抛唯一索引异常")]
    public async Task GetOrAddItem_Concurrent_ReturnsSameItem()
    {
        var name = "tga_" + Rand.NextString(8);
        var app = new App { Name = name, Secret = "tga-secret", Enable = true };
        app.Insert();
        var tracer = new AppTracer { Name = name, AppId = app.Id, Enable = true };
        tracer.Insert();

        var itemName = "/api/concurrent-" + Rand.NextString(6);
        try
        {
            var tasks = Enumerable.Range(0, 8).Select(_ => Task.Run(() => tracer.GetOrAddItem(itemName))).ToArray();
            var items = await Task.WhenAll(tasks);

            Assert.All(items, e => Assert.NotNull(e));
            Assert.Single(items.Select(e => e.Id).Distinct());
            Assert.Single(TraceItem.FindAllByApp(tracer.ID), e => e.Name == itemName);
        }
        finally
        {
            foreach (var item in TraceItem.FindAllByApp(tracer.ID))
            {
                item.Delete();
            }
            tracer.Delete();
            app.Delete();
        }
    }
}