2026-06-19 22:03:43 +00:00
|
|
|
using Elsa.Hosting.Management.Options;
|
|
|
|
|
using Elsa.Hosting.Management.Services;
|
|
|
|
|
using Microsoft.Extensions.Logging.Abstractions;
|
|
|
|
|
|
|
|
|
|
namespace Elsa.Hosting.Management.UnitTests.Services;
|
|
|
|
|
|
|
|
|
|
public class ConfiguredApplicationInstanceNameProviderTests
|
|
|
|
|
{
|
2026-06-19 22:13:34 +00:00
|
|
|
private static int ConfiguredInstanceNameMaxLength => ConfiguredApplicationInstanceNameProvider.ConfiguredInstanceNameMaxLength;
|
2026-06-19 22:03:43 +00:00
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void ExplicitInstanceName_IsUsedDirectly()
|
|
|
|
|
{
|
|
|
|
|
var provider = CreateProvider(new()
|
|
|
|
|
{
|
|
|
|
|
InstanceName = "pod-0",
|
|
|
|
|
InstanceNameEnvironmentVariable = "ELSA_TEST_INSTANCE_NAME"
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Assert.Equal("pod-0", provider.GetName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void ExplicitInstanceName_IsTrimmed()
|
|
|
|
|
{
|
|
|
|
|
var provider = CreateProvider(new()
|
|
|
|
|
{
|
|
|
|
|
InstanceName = " pod-0 "
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Assert.Equal("pod-0", provider.GetName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void ExplicitInstanceName_TakesPrecedenceOverEnvironmentVariable()
|
|
|
|
|
{
|
|
|
|
|
var variable = NewVariableName();
|
|
|
|
|
Environment.SetEnvironmentVariable(variable, "from-env");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var provider = CreateProvider(new()
|
|
|
|
|
{
|
|
|
|
|
InstanceName = "explicit",
|
|
|
|
|
InstanceNameEnvironmentVariable = variable
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Assert.Equal("explicit", provider.GetName());
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Environment.SetEnvironmentVariable(variable, null);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void EnvironmentVariable_IsUsedWhenInstanceNameNotSet()
|
|
|
|
|
{
|
|
|
|
|
var variable = NewVariableName();
|
|
|
|
|
Environment.SetEnvironmentVariable(variable, "pod-7");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var provider = CreateProvider(new()
|
|
|
|
|
{
|
|
|
|
|
InstanceNameEnvironmentVariable = variable
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Assert.Equal("pod-7", provider.GetName());
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Environment.SetEnvironmentVariable(variable, null);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void EnvironmentVariableName_IsTrimmed()
|
|
|
|
|
{
|
|
|
|
|
var variable = NewVariableName();
|
|
|
|
|
Environment.SetEnvironmentVariable(variable, "pod-7");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var provider = CreateProvider(new()
|
|
|
|
|
{
|
|
|
|
|
InstanceNameEnvironmentVariable = $" {variable} "
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Assert.Equal("pod-7", provider.GetName());
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Environment.SetEnvironmentVariable(variable, null);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void EnvironmentVariable_ValueIsTrimmed()
|
|
|
|
|
{
|
|
|
|
|
var variable = NewVariableName();
|
|
|
|
|
Environment.SetEnvironmentVariable(variable, " pod-7 ");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var provider = CreateProvider(new()
|
|
|
|
|
{
|
|
|
|
|
InstanceNameEnvironmentVariable = variable
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Assert.Equal("pod-7", provider.GetName());
|
|
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Environment.SetEnvironmentVariable(variable, null);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void NoConfiguration_FallsBackToRandomName()
|
|
|
|
|
{
|
|
|
|
|
var name1 = CreateProvider(new()).GetName();
|
|
|
|
|
var name2 = CreateProvider(new()).GetName();
|
|
|
|
|
|
|
|
|
|
Assert.False(string.IsNullOrWhiteSpace(name1));
|
|
|
|
|
Assert.False(string.IsNullOrWhiteSpace(name2));
|
2026-06-19 22:13:34 +00:00
|
|
|
Assert.Matches(@"^[0-9a-f]+$", name1);
|
|
|
|
|
Assert.Matches(@"^[0-9a-f]+$", name2);
|
2026-06-19 21:33:22 +00:00
|
|
|
Assert.NotEqual(name1, name2);
|
2026-06-19 22:03:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void EnvironmentVariableConfiguredButEmpty_FallsBackToRandomName()
|
|
|
|
|
{
|
|
|
|
|
var variable = NewVariableName();
|
|
|
|
|
Environment.SetEnvironmentVariable(variable, null);
|
|
|
|
|
|
|
|
|
|
var name1 = CreateProvider(new() { InstanceNameEnvironmentVariable = variable }).GetName();
|
2026-06-19 21:33:22 +00:00
|
|
|
var name2 = CreateProvider(new() { InstanceNameEnvironmentVariable = variable }).GetName();
|
2026-06-19 22:03:43 +00:00
|
|
|
|
|
|
|
|
Assert.False(string.IsNullOrWhiteSpace(name1));
|
2026-08-03 00:08:15 +00:00
|
|
|
Assert.False(string.IsNullOrWhiteSpace(name2));
|
2026-06-19 22:13:34 +00:00
|
|
|
Assert.Matches(@"^[0-9a-f]+$", name1);
|
2026-08-03 00:08:15 +00:00
|
|
|
Assert.Matches(@"^[0-9a-f]+$", name2);
|
2026-06-19 21:33:22 +00:00
|
|
|
Assert.NotEqual(name1, name2);
|
2026-06-19 22:03:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void ExplicitInstanceName_AtMaximumLength_IsAccepted()
|
|
|
|
|
{
|
|
|
|
|
var instanceName = new string('a', ConfiguredInstanceNameMaxLength);
|
|
|
|
|
|
|
|
|
|
var provider = CreateProvider(new() { InstanceName = instanceName });
|
|
|
|
|
|
|
|
|
|
Assert.Equal(instanceName, provider.GetName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Fact]
|
2026-06-20 10:50:02 +00:00
|
|
|
public void ExplicitInstanceName_TooLong_IsShortenedDeterministically()
|
2026-06-19 22:03:43 +00:00
|
|
|
{
|
2026-06-20 10:50:02 +00:00
|
|
|
var instanceName = "nexxbiz-executor-api-v3-1-extra-long-replica-0001";
|
2026-06-19 22:03:43 +00:00
|
|
|
|
2026-06-20 10:50:02 +00:00
|
|
|
var name1 = CreateProvider(new() { InstanceName = instanceName }).GetName();
|
|
|
|
|
var name2 = CreateProvider(new() { InstanceName = instanceName }).GetName();
|
2026-06-19 22:03:43 +00:00
|
|
|
|
2026-06-20 10:50:02 +00:00
|
|
|
Assert.Equal(name1, name2);
|
|
|
|
|
Assert.True(name1.Length <= ConfiguredInstanceNameMaxLength);
|
|
|
|
|
Assert.StartsWith(instanceName[..8], name1);
|
|
|
|
|
Assert.NotEqual(instanceName, name1);
|
2026-06-19 22:03:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[Theory]
|
|
|
|
|
[InlineData("pod 0")]
|
|
|
|
|
[InlineData("pöd-0")]
|
|
|
|
|
[InlineData("-pod-0")]
|
|
|
|
|
[InlineData("pod-0-")]
|
|
|
|
|
public void ExplicitInstanceName_InvalidCharacters_Throws(string instanceName)
|
|
|
|
|
{
|
|
|
|
|
var exception = Assert.Throws<InvalidOperationException>(() => CreateProvider(new() { InstanceName = instanceName }));
|
|
|
|
|
|
|
|
|
|
Assert.Contains("contains invalid characters", exception.Message);
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-19 22:08:52 +00:00
|
|
|
[Fact]
|
|
|
|
|
public void ExplicitInstanceName_InvalidCharactersAndTooLong_ReportsBothProblems()
|
|
|
|
|
{
|
2026-08-03 00:08:15 +00:00
|
|
|
var instanceName = new string('a', ConfiguredInstanceNameMaxLength) + " b";
|
2026-06-19 22:08:52 +00:00
|
|
|
|
|
|
|
|
var exception = Assert.Throws<InvalidOperationException>(() => CreateProvider(new() { InstanceName = instanceName }));
|
|
|
|
|
|
|
|
|
|
Assert.Contains("contains invalid characters", exception.Message);
|
2026-08-03 00:08:15 +00:00
|
|
|
Assert.Contains($"{ConfiguredInstanceNameMaxLength} characters or fewer", exception.Message);
|
2026-06-19 22:08:52 +00:00
|
|
|
Assert.Contains("Azure Service Bus", exception.Message);
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-19 22:03:43 +00:00
|
|
|
[Fact]
|
2026-06-20 10:50:02 +00:00
|
|
|
public void EnvironmentVariableValue_TooLong_IsShortenedDeterministically()
|
2026-06-19 22:03:43 +00:00
|
|
|
{
|
|
|
|
|
var variable = NewVariableName();
|
2026-06-20 10:50:02 +00:00
|
|
|
var instanceName = "nexxbiz-executor-api-v3-1-extra-long-replica-0001";
|
|
|
|
|
Environment.SetEnvironmentVariable(variable, instanceName);
|
2026-06-19 22:03:43 +00:00
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
2026-06-20 10:50:02 +00:00
|
|
|
var name1 = CreateProvider(new() { InstanceNameEnvironmentVariable = variable }).GetName();
|
|
|
|
|
var name2 = CreateProvider(new() { InstanceNameEnvironmentVariable = variable }).GetName();
|
2026-06-19 22:03:43 +00:00
|
|
|
|
2026-06-20 10:50:02 +00:00
|
|
|
Assert.Equal(name1, name2);
|
|
|
|
|
Assert.True(name1.Length <= ConfiguredInstanceNameMaxLength);
|
|
|
|
|
Assert.NotEqual(instanceName, name1);
|
2026-06-19 22:03:43 +00:00
|
|
|
}
|
|
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
Environment.SetEnvironmentVariable(variable, null);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static ConfiguredApplicationInstanceNameProvider CreateProvider(ApplicationInstanceOptions options)
|
|
|
|
|
{
|
|
|
|
|
return new ConfiguredApplicationInstanceNameProvider(
|
|
|
|
|
Microsoft.Extensions.Options.Options.Create(options),
|
|
|
|
|
new RandomIntIdentityGenerator(),
|
|
|
|
|
NullLogger<ConfiguredApplicationInstanceNameProvider>.Instance);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static string NewVariableName() => "ELSA_TEST_INSTANCE_" + Guid.NewGuid().ToString("N");
|
|
|
|
|
}
|