Testlauf, dem man glauben kann: Zeitzonen-Tests und Schluss mit Nebenlaeufigkeit

Zwei Tests zur Zeitzonen-Umstellung aus dem letzten Commit: der Zeitstempel
eines Logeintrags traegt den Versatz der ANZEIGE-Zone (nicht den des Systems),
und die abgelegte JSONL-Zeile traegt ihn mit. Sie liegen bewusst in
AppTimeZoneTests - dort steht der uebrige Zeitzonen-Zustand, und innerhalb einer
Klasse laufen Tests nacheinander.

Das genuegte aber nicht. Von sechs Laeufen fiel einer um und liess sich danach
nicht wieder einfangen. Die Ursache ist kein einzelner Test, sondern die Bauart:
Mehrere Bausteine halten prozessweiten Zustand, den Tests bewusst umstellen -
AppTimeZone, SecretProtection, die Diagnosezaehler von AccountIdSetJson. xUnit
fuehrt Testklassen standardmaessig nebenlaeufig aus, also sieht eine Klasse
mitten im eigenen Lauf, was eine andere gerade umgestellt hat.

Neu ist das nicht, aber die Zeitzonen-Umstellung hat es verschaerft: Seit die
Logzeitstempel der Anzeige-Zeitzone folgen, haengt jedes LogMessageEventArgs an
AppTimeZone - waehrend AppTimeZoneTests dieselbe Einstellung nach Auckland und
zurueck dreht.

Deshalb laufen die Testklassen jetzt nacheinander, und die Zaehlerpruefungen
arbeiten mit der Differenz statt mit absoluten Werten. Kosten: 4-5 s statt 3 s
Laufzeit. Ein Testlauf, dem man glauben kann, ist das allemal wert - danach
sechs Laeufe in Folge gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-08-28 21:06:18 +02:00
co-authored by Claude Opus 5
parent f4e017fe58
commit 57cfca5fe9
3 changed files with 66 additions and 7 deletions
+39 -1
View File
@@ -1,4 +1,4 @@
using System;
using System;
using PolyTraderSharp.Services;
using Xunit;
@@ -66,5 +66,43 @@ namespace PolyTrader.Tests
var local = new DateTime(2026, 1, 15, 12, 0, 0, DateTimeKind.Local);
Assert.Equal(12, AppTimeZone.ToDisplay(local).Hour);
}
// ── §8 des Linux-Befundberichts: Logs stempelten UTC, die Oberfläche zeigte Ortszeit ──
[Fact]
public void Now_carries_the_offset_of_the_display_zone()
{
AppTimeZone.Configure("Pacific/Auckland");
try
{
var now = AppTimeZone.Now;
var expected = AppTimeZone.Current.GetUtcOffset(DateTimeOffset.UtcNow);
// Der Versatz gehört zur ANZEIGE-Zone. Ein umgerechneter DateTime trüge ihn nicht
// mit sich – beim Formatieren mit "zzz" käme dann der Versatz des Systems heraus.
Assert.Equal(expected, now.Offset);
Assert.Equal(DateTime.UtcNow.Add(expected).Date, AppTimeZone.Today);
}
finally { AppTimeZone.Configure(null); }
}
[Fact]
public void Log_entries_are_stamped_in_the_display_zone()
{
AppTimeZone.Configure("Europe/Berlin");
try
{
var e = new LogMessageEventArgs("egal", LogLevel.Info);
Assert.Equal(AppTimeZone.Current.GetUtcOffset(e.Timestamp.UtcDateTime), e.Timestamp.Offset);
// Und die abgelegte JSONL-Zeile trägt denselben Versatz mit.
var parsed = DateTimeOffset.Parse(
LogJson.ParseLine(LogJson.Format(e))!.Time,
System.Globalization.CultureInfo.InvariantCulture);
Assert.Equal(e.Timestamp.Offset, parsed.Offset);
Assert.Equal(e.Timestamp.ToUnixTimeSeconds(), parsed.ToUnixTimeSeconds());
}
finally { AppTimeZone.Configure(null); }
}
}
}