StartupConcurrencyGuardTests.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using Xunit;
  2. namespace Admin.NET.Plugin.AiDOP.Tests.Infrastructure;
  3. /// <summary>
  4. /// 启动期并发守卫。ISqlSugarClient 是单例 SqlSugarScope,其 AsyncLocal 上下文在 Host 启动阶段
  5. /// 会被 Configure 管道与任何火忘任务共享,共享即同一个 MySqlConnection;后执行的 ApprovalFlow
  6. /// 插件同步 InitTables 没有容错,撞上就是进程退出。
  7. /// 2026-09-26 事故复盘:doc/plan/天缘对接/20260926问题描述.md
  8. /// </summary>
  9. public class StartupConcurrencyGuardTests
  10. {
  11. private static string PluginStartupSource()
  12. {
  13. var dir = new DirectoryInfo(AppContext.BaseDirectory);
  14. while (dir != null && !File.Exists(Path.Combine(dir.FullName, "AGENTS.md")))
  15. dir = dir.Parent;
  16. Assert.NotNull(dir);
  17. return File.ReadAllText(Path.Combine(
  18. dir!.FullName, "server", "Plugins", "Admin.NET.Plugin.AiDOP", "Startup.cs"));
  19. }
  20. /// <summary>去掉注释,否则「不要改成 Task.Run」这类说明文字会被误判为违规调用。</summary>
  21. private static string StripComments(string source)
  22. {
  23. var noBlock = System.Text.RegularExpressions.Regex.Replace(source, @"/\*.*?\*/", "",
  24. System.Text.RegularExpressions.RegexOptions.Singleline);
  25. return System.Text.RegularExpressions.Regex.Replace(noBlock, @"//.*?$", "",
  26. System.Text.RegularExpressions.RegexOptions.Multiline);
  27. }
  28. [Fact]
  29. public void AiDopStartup_DoesNotFireAndForgetDatabaseWork()
  30. {
  31. var code = StripComments(PluginStartupSource());
  32. Assert.DoesNotContain("Task.Run", code);
  33. Assert.DoesNotContain("Task.Factory.StartNew", code);
  34. }
  35. }