using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using NewLife.Security;
using Stardust.Data.Deployment;
using Stardust.Data.Nodes;
using Stardust.Models;
using Stardust.Server.Services;
using Xunit;
namespace ServerTest.Deployment;
/// <summary>部署版本平å°åŒ¹é…测试。覆盖节点系统/架构归类与多版本ç›é€‰ï¼ˆPUB-10 / 版本匹é…)</summary>
public class DeployVersionMatchTests
{
/// <summary>创建åªç”¨äºŽç‰ˆæœ¬åŒ¹é…çš„æœåŠ¡å®žä¾‹ã€‚GetDeployVersion ä¸ä¾èµ–æ³¨å…¥å—æ®µ</summary>
private static DeployService CreateService() => (DeployService)RuntimeHelpers.GetUninitializedObject(typeof(DeployService));
private static Node CreateNode(OSKinds osKind, String arch, String frameworks = null) => new()
{
Code = "nd_" + Rand.NextString(8),
Name = "node-" + Rand.NextString(4),
Enable = true,
OSKind = osKind,
Architecture = arch,
Frameworks = frameworks,
};
[Fact(DisplayName = "多版本部署:glibc ç³» Linux èŠ‚ç‚¹é€‰ä¸ Linux ç‰ˆæœ¬è€Œä¸æ˜¯ musl 版本")]
public void GetDeployVersion_LinuxNode_PicksLinuxPackage()
{
var app = new AppDeploy { Name = "dep_" + Rand.NextString(6), Enable = true, MultiVersion = true };
app.Insert();
// å…ˆç”Ÿæˆ musl 版本(Id æ›´å°ï¼‰ï¼Œå†ç”Ÿæˆ Linux 版本(Id 更大,应优先且匹é…)
var musl = new AppDeployVersion { DeployId = app.Id, Version = "1.0.0", OS = OSKind.LinuxMusl, Arch = CpuArch.X64, Enable = true };
musl.Insert();
var linux = new AppDeployVersion { DeployId = app.Id, Version = "1.0.1", OS = OSKind.Linux, Arch = CpuArch.X64, Enable = true };
linux.Insert();
try
{
// Ubuntu 属于 glibc 系 Linux
var node = CreateNode(OSKinds.Ubuntu, "x64");
var ver = CreateService().GetDeployVersion(app, node);
Assert.NotNull(ver);
Assert.Equal(OSKind.Linux, ver.OS);
Assert.Equal("1.0.1", ver.Version);
}
finally
{
musl.Delete();
linux.Delete();
app.Delete();
}
}
[Fact(DisplayName = "多版本部署:Alpine èŠ‚ç‚¹é€‰ä¸ musl 版本")]
public void GetDeployVersion_AlpineNode_PicksMuslPackage()
{
var app = new AppDeploy { Name = "dep_" + Rand.NextString(6), Enable = true, MultiVersion = true };
app.Insert();
var linux = new AppDeployVersion { DeployId = app.Id, Version = "2.0.0", OS = OSKind.Linux, Arch = CpuArch.X64, Enable = true };
linux.Insert();
var musl = new AppDeployVersion { DeployId = app.Id, Version = "2.0.1", OS = OSKind.LinuxMusl, Arch = CpuArch.X64, Enable = true };
musl.Insert();
try
{
var node = CreateNode(OSKinds.Alpine, "x64");
var ver = CreateService().GetDeployVersion(app, node);
Assert.NotNull(ver);
Assert.Equal(OSKind.LinuxMusl, ver.OS);
}
finally
{
musl.Delete();
linux.Delete();
app.Delete();
}
}
[Fact(DisplayName = "æž¶æž„ä¸åŒ¹é…的版本被跳过")]
public void GetDeployVersion_ArchMismatch_Skip()
{
var app = new AppDeploy { Name = "dep_" + Rand.NextString(6), Enable = true, MultiVersion = true };
app.Insert();
var arm = new AppDeployVersion { DeployId = app.Id, Version = "3.0.0", OS = OSKind.Linux, Arch = CpuArch.Arm64, Enable = true };
arm.Insert();
try
{
var node = CreateNode(OSKinds.Ubuntu, "x64");
Assert.Null(CreateService().GetDeployVersion(app, node));
}
finally
{
arm.Delete();
app.Delete();
}
}
[Fact(DisplayName = "èŠ‚ç‚¹æ¡†æž¶ä¸æ»¡è¶³ç›®æ ‡æ¡†æž¶æ—¶è·³è¿‡è¯¥ç‰ˆæœ¬")]
public void GetDeployVersion_FrameworkMismatch_Skip()
{
var app = new AppDeploy { Name = "dep_" + Rand.NextString(6), Enable = true, MultiVersion = true };
app.Insert();
var ver = new AppDeployVersion { DeployId = app.Id, Version = "4.0.0", OS = OSKind.Any, Arch = CpuArch.Any, TargetFramework = "net8.0", Enable = true };
ver.Insert();
try
{
// 节点以裸版本å·ä¸ŠæŠ¥æ¡†æž¶ï¼ˆå¦‚ 6.0.21,7.0.10)
var node = CreateNode(OSKinds.Ubuntu, "x64", "6.0.21");
Assert.Null(CreateService().GetDeployVersion(app, node));
// 框架满足时å¯ä»¥é€‰ä¸
var node2 = CreateNode(OSKinds.Ubuntu, "x64", "8.0.11");
Assert.NotNull(CreateService().GetDeployVersion(app, node2));
}
finally
{
ver.Delete();
app.Delete();
}
}
[Fact(DisplayName = "未开å¯å¤šç‰ˆæœ¬æ—¶æŒ‰éƒ¨ç½²é›†æŒ‡å®šç‰ˆæœ¬ç²¾ç¡®åŒ¹é…")]
public void GetDeployVersion_SingleVersion_ByVersion()
{
var app = new AppDeploy { Name = "dep_" + Rand.NextString(6), Enable = true, MultiVersion = false, Version = "9.9.9" };
app.Insert();
var ver = new AppDeployVersion { DeployId = app.Id, Version = "9.9.9", OS = OSKind.Any, Arch = CpuArch.Any, Enable = true };
ver.Insert();
try
{
var node = CreateNode(OSKinds.Win10, "x64");
var rs = CreateService().GetDeployVersion(app, node);
Assert.NotNull(rs);
Assert.Equal("9.9.9", rs.Version);
}
finally
{
ver.Delete();
app.Delete();
}
}
}
|