feat(operations): add production readiness gate (#23)

This commit is contained in:
KyuubiYoru
2026-07-16 22:19:51 +02:00
parent 6bad659c12
commit 00d5ff7764
13 changed files with 782 additions and 6 deletions
@@ -114,11 +114,12 @@ internal sealed class RendezvousCommandRunner : ITestClientCommandRunner
listingId: session.ListingId.ToString(),
displayName: options.DisplayName);
echo = new DirectEchoProtocol(events.GameplayEvents, host: true);
echo.ExchangeCompleted += _ => output.Write(
echo.ExchangeCompleted += peer => output.Write(
"host.direct-traffic",
"verified",
phase: "direct-traffic",
endpointType: "peer-to-peer");
endpointType: "peer-to-peer",
addressFamily: AddressFamilyName(peer.Address));
coordinator = new RendezvousHostCoordinator(
manager,
events,
@@ -485,6 +486,7 @@ internal sealed class RendezvousCommandRunner : ITestClientCommandRunner
"connected",
phase: "direct-connection",
endpointType: endpointType,
addressFamily: AddressFamilyName(peer.Address),
elapsedMilliseconds: ToMilliseconds(outcome.Elapsed));
await ReportOutcomeAsync(coordinator, joins, output, cancellationToken).ConfigureAwait(false);
echo.BeginJoin(peer);
@@ -507,7 +509,8 @@ internal sealed class RendezvousCommandRunner : ITestClientCommandRunner
"join.direct-traffic",
"verified",
phase: "direct-traffic",
endpointType: endpointType);
endpointType: endpointType,
addressFamily: AddressFamilyName(peer.Address));
peer.Disconnect();
manager.PollEvents();
return TestClientExitCode.Success;
@@ -765,6 +768,9 @@ internal sealed class RendezvousCommandRunner : ITestClientCommandRunner
return privateAddress ? "private" : "public";
}
private static string AddressFamilyName(IPAddress address) =>
address.AddressFamily == AddressFamily.InterNetworkV6 ? "ipv6" : "ipv4";
private static long ToMilliseconds(TimeSpan elapsed) =>
(long)Math.Min(long.MaxValue, Math.Max(0, elapsed.TotalMilliseconds));
@@ -24,6 +24,7 @@ internal sealed class TestClientOutput(TextWriter standardOutput, TextWriter sta
string? displayName = null,
string? outcome = null,
string? endpointType = null,
string? addressFamily = null,
int? count = null,
long? elapsedMilliseconds = null,
string? message = null) => WriteCore(
@@ -37,6 +38,7 @@ internal sealed class TestClientOutput(TextWriter standardOutput, TextWriter sta
DisplayName = SafeText(displayName),
Outcome = SafeToken(outcome),
EndpointType = SafeToken(endpointType),
AddressFamily = SafeToken(addressFamily),
Count = count,
ElapsedMilliseconds = elapsedMilliseconds,
Message = SafeText(message),
@@ -92,6 +94,7 @@ internal sealed class TestClientOutput(TextWriter standardOutput, TextWriter sta
Append(line, "name", item.DisplayName, quote: true);
Append(line, "outcome", item.Outcome);
Append(line, "endpoint", item.EndpointType);
Append(line, "addressFamily", item.AddressFamily);
if (item.Count.HasValue)
{
Append(line, "count", item.Count.Value.ToString(System.Globalization.CultureInfo.InvariantCulture));
@@ -174,6 +177,7 @@ internal sealed class TestClientOutput(TextWriter standardOutput, TextWriter sta
public string? DisplayName { get; init; }
public string? Outcome { get; init; }
public string? EndpointType { get; init; }
public string? AddressFamily { get; init; }
public int? Count { get; init; }
public long? ElapsedMilliseconds { get; init; }
public string? Message { get; init; }