Stufe 4c (#764): Bezeichner auf Englisch - Typen, Methoden, Felder, Parameter, Locals, Testnamen
Mit Roslyn umbenannt (Verweise folgen, Zeichenketten bleiben unberuehrt). Nicht umbenannt, weil gespeichert oder ueber die API gebunden (Stufe 4e): Properties, Record-Parameter, Enum-Member sowie die Parameter der Endpunkt-Handler (Routen-/Query-Bindung ueber den Namen). Die JSON-Felder anonymer Objekte bleiben ausdruecklich benannt (JsonFilter: pfad). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
837a634a22
commit
77062facc9
@@ -16,15 +16,15 @@ namespace ClawdDotNet.Core.Tests.Instances;
|
||||
/// </summary>
|
||||
public sealed class ManagerHandshakeTests
|
||||
{
|
||||
private const string Instanz = "/daten/Instances/Alpha";
|
||||
private const string Andere = "/daten/Instances/Beta";
|
||||
private const string InstanceDir = "/daten/Instances/Alpha";
|
||||
private const string OtherDir = "/daten/Instances/Beta";
|
||||
|
||||
[Fact]
|
||||
public void Eine_frische_Unterschrift_traegt()
|
||||
public void A_fresh_signature_holds()
|
||||
{
|
||||
var token = ManagerHandshake.Sign(Instanz);
|
||||
var token = ManagerHandshake.Sign(InstanceDir);
|
||||
|
||||
ManagerHandshake.Verify(Instanz, token).ShouldBeTrue();
|
||||
ManagerHandshake.Verify(InstanceDir, token).ShouldBeTrue();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -39,20 +39,20 @@ public sealed class ManagerHandshakeTests
|
||||
[InlineData("v1.999.")]
|
||||
[InlineData("v2.99999999999.abcdef")]
|
||||
[InlineData("v1.keinezahl.abcdef")]
|
||||
public void Ohne_brauchbare_Unterschrift_gilt_die_Instanz_als_ungefuehrt(string? token)
|
||||
public void Without_a_usable_signature_the_instance_counts_as_unmanaged(string? token)
|
||||
{
|
||||
ManagerHandshake.Verify(Instanz, token).ShouldBeFalse();
|
||||
ManagerHandshake.Verify(InstanceDir, token).ShouldBeFalse();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A made-up signature does not hold — even if the structure is right.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Eine_erfundene_Unterschrift_traegt_nicht()
|
||||
public void A_forged_signature_does_not_hold()
|
||||
{
|
||||
var ablauf = DateTimeOffset.UtcNow.AddMinutes(5).ToUnixTimeSeconds();
|
||||
var expiry = DateTimeOffset.UtcNow.AddMinutes(5).ToUnixTimeSeconds();
|
||||
|
||||
ManagerHandshake.Verify(Instanz, $"v1.{ablauf}.{new string('a', 64)}")
|
||||
ManagerHandshake.Verify(InstanceDir, $"v1.{expiry}.{new string('a', 64)}")
|
||||
.ShouldBeFalse();
|
||||
}
|
||||
|
||||
@@ -63,11 +63,11 @@ public sealed class ManagerHandshakeTests
|
||||
/// Alpha would let Beta start by presenting Alpha during the check.</para>
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Eine_Unterschrift_gilt_nur_fuer_ihre_eigene_Instanz()
|
||||
public void A_signature_is_only_valid_for_its_own_instance()
|
||||
{
|
||||
var token = ManagerHandshake.Sign(Instanz);
|
||||
var token = ManagerHandshake.Sign(InstanceDir);
|
||||
|
||||
ManagerHandshake.Verify(Andere, token).ShouldBeFalse();
|
||||
ManagerHandshake.Verify(OtherDir, token).ShouldBeFalse();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -75,27 +75,27 @@ public sealed class ManagerHandshakeTests
|
||||
/// an instance without a license with it next week.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Eine_abgelaufene_Unterschrift_traegt_nicht()
|
||||
public void An_expired_signature_does_not_hold()
|
||||
{
|
||||
var vorhin = DateTimeOffset.UtcNow.AddHours(-1);
|
||||
var token = ManagerHandshake.Sign(Instanz, vorhin);
|
||||
var earlier = DateTimeOffset.UtcNow.AddHours(-1);
|
||||
var token = ManagerHandshake.Sign(InstanceDir, earlier);
|
||||
|
||||
ManagerHandshake.Verify(Instanz, token, vorhin).ShouldBeTrue("Damals galt sie.");
|
||||
ManagerHandshake.Verify(Instanz, token).ShouldBeFalse("Jetzt nicht mehr.");
|
||||
ManagerHandshake.Verify(InstanceDir, token, earlier).ShouldBeTrue("Damals galt sie.");
|
||||
ManagerHandshake.Verify(InstanceDir, token).ShouldBeFalse("Jetzt nicht mehr.");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Fiddling with the expiry time does not help: it goes into the signature.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Ein_verlaengerter_Ablauf_macht_die_Unterschrift_ungueltig()
|
||||
public void An_extended_expiry_invalidates_the_signature()
|
||||
{
|
||||
var token = ManagerHandshake.Sign(Instanz);
|
||||
var teile = token.Split('.');
|
||||
var token = ManagerHandshake.Sign(InstanceDir);
|
||||
var parts = token.Split('.');
|
||||
|
||||
var spaeter = DateTimeOffset.UtcNow.AddYears(1).ToUnixTimeSeconds();
|
||||
var later = DateTimeOffset.UtcNow.AddYears(1).ToUnixTimeSeconds();
|
||||
|
||||
ManagerHandshake.Verify(Instanz, $"v1.{spaeter}.{teile[2]}").ShouldBeFalse();
|
||||
ManagerHandshake.Verify(InstanceDir, $"v1.{later}.{parts[2]}").ShouldBeFalse();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -103,7 +103,7 @@ public sealed class ManagerHandshakeTests
|
||||
/// the handshake fails because one wrote one slash more.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void Schreibweisen_desselben_Pfades_ergeben_dieselbe_Unterschrift()
|
||||
public void Spellings_of_the_same_path_give_the_same_signature()
|
||||
{
|
||||
var basis = Path.Combine(Path.GetTempPath(), "clawd-handschlag");
|
||||
var token = ManagerHandshake.Sign(basis);
|
||||
|
||||
@@ -14,8 +14,8 @@ namespace ClawdDotNet.Core.Tests.Instances;
|
||||
/// </summary>
|
||||
public sealed class ShutdownCoordinatorTests
|
||||
{
|
||||
private static ShutdownCoordinator Koordinator(TimeSpan? frist = null)
|
||||
=> new(NullLogger.Instance, frist ?? TimeSpan.FromSeconds(5));
|
||||
private static ShutdownCoordinator Coordinator(TimeSpan? deadline = null)
|
||||
=> new(NullLogger.Instance, deadline ?? TimeSpan.FromSeconds(5));
|
||||
|
||||
/// <summary>
|
||||
/// The order is the whole trick: close first, then wait.
|
||||
@@ -24,55 +24,55 @@ public sealed class ShutdownCoordinatorTests
|
||||
/// work in the next tick, and the number of open pieces would never reach zero.</para>
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task Erst_wird_die_Tuer_geschlossen_dann_gewartet()
|
||||
public async Task First_the_door_is_closed_then_it_waits()
|
||||
{
|
||||
var geschlossen = false;
|
||||
var offenBeimSchliessen = -1;
|
||||
var offen = 3;
|
||||
var closed = false;
|
||||
var openAtClose = -1;
|
||||
var open = 3;
|
||||
|
||||
var koordinator = Koordinator();
|
||||
var coordinator = Coordinator();
|
||||
|
||||
koordinator.Register(new WorkSource(
|
||||
coordinator.Register(new WorkSource(
|
||||
"Aufgaben",
|
||||
() => offen,
|
||||
() => open,
|
||||
() =>
|
||||
{
|
||||
geschlossen = true;
|
||||
offenBeimSchliessen = offen;
|
||||
closed = true;
|
||||
openAtClose = open;
|
||||
}));
|
||||
|
||||
// The pieces of work run out in the background.
|
||||
_ = Task.Run(async () =>
|
||||
{
|
||||
while (offen > 0)
|
||||
while (open > 0)
|
||||
{
|
||||
await Task.Delay(30);
|
||||
offen--;
|
||||
open--;
|
||||
}
|
||||
});
|
||||
|
||||
await koordinator.BeginAsync();
|
||||
await coordinator.BeginAsync();
|
||||
|
||||
geschlossen.ShouldBeTrue();
|
||||
offenBeimSchliessen.ShouldBe(3, "Geschlossen wird, bevor gewartet wird.");
|
||||
koordinator.Phase.ShouldBe(ShutdownPhase.Done);
|
||||
koordinator.Snapshot().TotalOpen.ShouldBe(0);
|
||||
closed.ShouldBeTrue();
|
||||
openAtClose.ShouldBe(3, "Geschlossen wird, bevor gewartet wird.");
|
||||
coordinator.Phase.ShouldBe(ShutdownPhase.Done);
|
||||
coordinator.Snapshot().TotalOpen.ShouldBe(0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Without open work it ends immediately — no waiting on principle.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task Ohne_offene_Arbeit_endet_es_sofort()
|
||||
public async Task Without_open_work_it_ends_immediately()
|
||||
{
|
||||
var koordinator = Koordinator(TimeSpan.FromMinutes(10));
|
||||
koordinator.Register(new WorkSource("Aufgaben", () => 0, () => { }));
|
||||
var coordinator = Coordinator(TimeSpan.FromMinutes(10));
|
||||
coordinator.Register(new WorkSource("Aufgaben", () => 0, () => { }));
|
||||
|
||||
var begonnen = DateTimeOffset.UtcNow;
|
||||
await koordinator.BeginAsync();
|
||||
var started = DateTimeOffset.UtcNow;
|
||||
await coordinator.BeginAsync();
|
||||
|
||||
(DateTimeOffset.UtcNow - begonnen).ShouldBeLessThan(TimeSpan.FromSeconds(2));
|
||||
koordinator.Phase.ShouldBe(ShutdownPhase.Done);
|
||||
(DateTimeOffset.UtcNow - started).ShouldBeLessThan(TimeSpan.FromSeconds(2));
|
||||
coordinator.Phase.ShouldBe(ShutdownPhase.Done);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -82,14 +82,14 @@ public sealed class ShutdownCoordinatorTests
|
||||
/// does not answer — and nobody would ever come to an end.</para>
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task Nach_der_Frist_endet_es_auch_mit_offener_Arbeit()
|
||||
public async Task After_the_deadline_it_ends_even_with_open_work()
|
||||
{
|
||||
var koordinator = Koordinator(TimeSpan.FromMilliseconds(300));
|
||||
koordinator.Register(new WorkSource("Agentenläufe", () => 2, () => { }));
|
||||
var coordinator = Coordinator(TimeSpan.FromMilliseconds(300));
|
||||
coordinator.Register(new WorkSource("Agentenläufe", () => 2, () => { }));
|
||||
|
||||
await koordinator.BeginAsync();
|
||||
await coordinator.BeginAsync();
|
||||
|
||||
koordinator.Phase.ShouldBe(ShutdownPhase.Done);
|
||||
coordinator.Phase.ShouldBe(ShutdownPhase.Done);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -97,26 +97,26 @@ public sealed class ShutdownCoordinatorTests
|
||||
/// instance manager recognizes that cleanup is happening here and not hanging.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task Waehrend_des_Auslaufens_meldet_der_Stand_was_offen_ist()
|
||||
public async Task While_winding_down_the_status_reports_what_is_open()
|
||||
{
|
||||
var offen = 2;
|
||||
var koordinator = Koordinator(TimeSpan.FromSeconds(5));
|
||||
koordinator.Register(new WorkSource("Agentenläufe", () => offen, () => { }));
|
||||
var open = 2;
|
||||
var coordinator = Coordinator(TimeSpan.FromSeconds(5));
|
||||
coordinator.Register(new WorkSource("Agentenläufe", () => open, () => { }));
|
||||
|
||||
koordinator.Snapshot().Phase.ShouldBe(ShutdownPhase.Running);
|
||||
coordinator.Snapshot().Phase.ShouldBe(ShutdownPhase.Running);
|
||||
|
||||
var lauf = koordinator.BeginAsync();
|
||||
var run = coordinator.BeginAsync();
|
||||
|
||||
// As long as something is open, the state is Draining and names the number.
|
||||
var stand = koordinator.Snapshot();
|
||||
var stand = coordinator.Snapshot();
|
||||
stand.Phase.ShouldBe(ShutdownPhase.Draining);
|
||||
stand.TotalOpen.ShouldBe(2);
|
||||
stand.Open.Single().Name.ShouldBe("Agentenläufe");
|
||||
|
||||
offen = 0;
|
||||
await lauf;
|
||||
open = 0;
|
||||
await run;
|
||||
|
||||
koordinator.Snapshot().Phase.ShouldBe(ShutdownPhase.Done);
|
||||
coordinator.Snapshot().Phase.ShouldBe(ShutdownPhase.Done);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -127,34 +127,34 @@ public sealed class ShutdownCoordinatorTests
|
||||
/// would mean closing the door twice and waiting twice.</para>
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task Ein_zweiter_Aufruf_wartet_auf_denselben_Vorgang()
|
||||
public async Task A_second_call_waits_for_the_same_operation()
|
||||
{
|
||||
var schliessungen = 0;
|
||||
var koordinator = Koordinator(TimeSpan.FromSeconds(5));
|
||||
koordinator.Register(new WorkSource("Aufgaben", () => 0, () => schliessungen++));
|
||||
var closings = 0;
|
||||
var coordinator = Coordinator(TimeSpan.FromSeconds(5));
|
||||
coordinator.Register(new WorkSource("Aufgaben", () => 0, () => closings++));
|
||||
|
||||
await Task.WhenAll(koordinator.BeginAsync(), koordinator.BeginAsync());
|
||||
await Task.WhenAll(coordinator.BeginAsync(), coordinator.BeginAsync());
|
||||
|
||||
schliessungen.ShouldBe(1);
|
||||
closings.ShouldBe(1);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// A source that stumbles while counting must not hold up the end.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task Eine_stolpernde_Quelle_haelt_das_Ende_nicht_auf()
|
||||
public async Task A_stumbling_source_does_not_hold_up_the_end()
|
||||
{
|
||||
var koordinator = Koordinator(TimeSpan.FromSeconds(30));
|
||||
var coordinator = Coordinator(TimeSpan.FromSeconds(30));
|
||||
|
||||
koordinator.Register(new WorkSource(
|
||||
coordinator.Register(new WorkSource(
|
||||
"Kaputt",
|
||||
() => throw new InvalidOperationException("zählt nicht"),
|
||||
() => throw new InvalidOperationException("schließt nicht")));
|
||||
|
||||
var begonnen = DateTimeOffset.UtcNow;
|
||||
await koordinator.BeginAsync();
|
||||
var started = DateTimeOffset.UtcNow;
|
||||
await coordinator.BeginAsync();
|
||||
|
||||
(DateTimeOffset.UtcNow - begonnen).ShouldBeLessThan(TimeSpan.FromSeconds(2));
|
||||
koordinator.Phase.ShouldBe(ShutdownPhase.Done);
|
||||
(DateTimeOffset.UtcNow - started).ShouldBeLessThan(TimeSpan.FromSeconds(2));
|
||||
coordinator.Phase.ShouldBe(ShutdownPhase.Done);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user