513fa1aa16
Comment/XML-doc changes only: - add summaries to ~10k test methods, fixtures, fakes and helpers (+ <param> on theories, <returns> on async Task methods, <inheritdoc/> on interface implementations the checker can resolve) - strip ~2.6k project-tracking references (WP*, P*-*, row-NN, Task N, #NN, Component-0NN) from comments, keeping the explanatory text; reword false positives in comments only - real docs on fakes implementing BCL/library interfaces (IDisposable, ILogger, IOptionsMonitor, IAsyncLifetime) - reword the last 5 src/ false positives (CWE-1236, failures-1, year-0001, M365) Only non-comment edits: four one-line nested classes split across lines so members can carry docs. Build 0 errors / 0 warnings.
66 lines
2.9 KiB
C#
66 lines
2.9 KiB
C#
using Xunit;
|
|
|
|
namespace ZB.MOM.WW.ScadaBridge.Host.Tests;
|
|
|
|
/// <summary>
|
|
/// Pins <see cref="Program.ParseHttpBindPorts"/>, which re-declares central's HTTP surface
|
|
/// after the gRPC listener switches Kestrel into explicit-endpoints mode.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// This exists because the regression it guards is invisible to every other test: a central
|
|
/// node that binds only the gRPC port boots clean, joins the cluster and serves gRPC, while
|
|
/// the Central UI, Management/Inbound API and <c>/health/*</c> are silently dead. TestServer
|
|
/// never binds real Kestrel, so the parser is the one seam that can be asserted in-process.
|
|
/// The rig caught the original defect; this keeps it caught.
|
|
/// </remarks>
|
|
public class CentralHttpBindPortsTests
|
|
{
|
|
/// <summary>Verifies that the HTTP bind ports are parsed correctly from the server URLs.</summary>
|
|
/// <param name="urls">The server URL list to parse.</param>
|
|
/// <param name="expected">The ports expected from the parse.</param>
|
|
[Theory]
|
|
[InlineData("http://+:5000", new[] { 5000 })]
|
|
[InlineData("http://0.0.0.0:5000", new[] { 5000 })]
|
|
[InlineData("http://[::]:5000", new[] { 5000 })]
|
|
[InlineData("http://localhost:5000", new[] { 5000 })]
|
|
[InlineData("http://*:8085", new[] { 8085 })]
|
|
[InlineData("http://+:5000;http://+:5001", new[] { 5000, 5001 })]
|
|
[InlineData("http://+:5000 ; http://+:5001", new[] { 5000, 5001 })]
|
|
[InlineData("http://+:5000;http://+:5000", new[] { 5000 })] // de-duped
|
|
public void ParsesPortsFromServerUrls(string urls, int[] expected)
|
|
{
|
|
Assert.Equal(expected, Program.ParseHttpBindPorts(urls));
|
|
}
|
|
|
|
/// <summary>Verifies that the scheme's default port is used when none is given and an explicit port is honoured.</summary>
|
|
/// <param name="url">The server URL to parse.</param>
|
|
/// <param name="expected">The port expected from the parse.</param>
|
|
[Theory]
|
|
[InlineData("https://+:443", 443)] // scheme default when no explicit port
|
|
[InlineData("http://+:80", 80)]
|
|
public void HandlesSchemeDefaultAndExplicitPort(string url, int expected)
|
|
{
|
|
Assert.Equal(new[] { expected }, Program.ParseHttpBindPorts(url));
|
|
}
|
|
|
|
/// <summary>Verifies that a null, empty or whitespace URL list yields no ports.</summary>
|
|
/// <param name="urls">The null, empty or whitespace URL list.</param>
|
|
[Theory]
|
|
[InlineData(null)]
|
|
[InlineData("")]
|
|
[InlineData(" ")]
|
|
public void EmptyOrNull_YieldsNoPorts(string? urls)
|
|
{
|
|
Assert.Empty(Program.ParseHttpBindPorts(urls));
|
|
}
|
|
|
|
/// <summary>Verifies that an unparseable URL is skipped rather than thrown on, while valid entries still yield ports.</summary>
|
|
[Fact]
|
|
public void UnparseableEntry_IsSkipped_NotThrown()
|
|
{
|
|
// A malformed URL must not take the node down at boot; the good one still binds.
|
|
var ports = Program.ParseHttpBindPorts("not-a-url;http://+:5000");
|
|
Assert.Equal(new[] { 5000 }, ports);
|
|
}
|
|
}
|