Document C# codebase and publish 2.1.2

This commit is contained in:
2026-08-11 13:23:01 +02:00
parent bb2d2f8484
commit b32cc61e43
30 changed files with 505 additions and 34 deletions
@@ -9,10 +9,16 @@ using BizTalkPlatformManagementTool.Setup;
namespace BizTalkPlatformManagementTool.Tests
{
/// <summary>
/// Enthält die portable Regressionstestsuite ohne Abhängigkeit von einem externen Testframework.
/// </summary>
internal static class Program
{
/// <summary>Anzahl der im aktuellen Testlauf fehlgeschlagenen Prüfungen.</summary>
private static int failures;
/// <summary>Führt alle Regressionstests aus und liefert einen CI-tauglichen Exitcode.</summary>
/// <returns>Null, wenn alle Tests bestanden wurden; andernfalls eins.</returns>
private static int Main()
{
Run("JsonRoundTripIsBomTolerantAndAtomic", JsonRoundTripIsBomTolerantAndAtomic);
@@ -33,12 +39,16 @@ namespace BizTalkPlatformManagementTool.Tests
return failures == 0 ? 0 : 1;
}
/// <summary>Führt einen einzelnen Test isoliert aus und protokolliert sein Ergebnis.</summary>
/// <param name="name">Der stabile Testname für die Konsolenausgabe.</param>
/// <param name="test">Die auszuführende Testfunktion.</param>
private static void Run(string name, Action test)
{
try { test(); Console.WriteLine("PASS " + name); }
catch (Exception ex) { failures++; Console.Error.WriteLine("FAIL " + name + ": " + ex); }
}
/// <summary>Prüft BOM-tolerantes Lesen und rückstandsfreies atomisches JSON-Schreiben.</summary>
private static void JsonRoundTripIsBomTolerantAndAtomic()
{
InTemp(directory =>
@@ -58,6 +68,7 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Prüft, dass gleichnamige Artefakte verschiedener Anwendungen getrennt verglichen werden.</summary>
private static void DiffUsesApplicationAndNameIdentity()
{
var before = Snapshot("APP-A", "SHARED", ArtifactStates.SendPortStarted);
@@ -69,6 +80,7 @@ namespace BizTalkPlatformManagementTool.Tests
Assert(diff.ArtifactDifferences[0].Application == "APP-A", "wrong application was compared");
}
/// <summary>Prüft Kurzname/FQDN-Kompatibilität und Ablehnung eines fremden Restore-Zielservers.</summary>
private static void RestoreRejectsDifferentServer()
{
var snapshot = Snapshot("APP", "PORT", ArtifactStates.SendPortStarted);
@@ -77,6 +89,7 @@ namespace BizTalkPlatformManagementTool.Tests
Expect<InvalidOperationException>(() => SnapshotValidator.EnsureServerMatches(snapshot, "BIZTALK-B"));
}
/// <summary>Prüft die sichere Restore-Reihenfolge und den Schutz gebundener Orchestrierungen.</summary>
private static void RestorePlanUsesSafeOrder()
{
var snapshot = Snapshot("APP", "PORT", ArtifactStates.SendPortStarted);
@@ -90,6 +103,7 @@ namespace BizTalkPlatformManagementTool.Tests
Assert(!bound.Execute && bound.Kind == "Note", "bound orchestration must remain unchanged");
}
/// <summary>Prüft die Neutralisierung formelartiger CSV-Feldwerte.</summary>
private static void CsvNeutralizesFormulaValues()
{
InTemp(directory =>
@@ -102,6 +116,7 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Prüft, dass eine nach Manifestbildung veränderte Payload abgelehnt wird.</summary>
private static void PackageManifestRejectsTampering()
{
InTemp(directory =>
@@ -117,6 +132,7 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Prüft die Aktivierung einer vollständig validierten Neuinstallation.</summary>
private static void InstallerActivatesValidatedPayload()
{
InTemp(directory =>
@@ -131,6 +147,7 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Prüft die Ablehnung nicht deklarierter Dateien und ausbrechender Manifestpfade.</summary>
private static void PackageManifestRejectsUndeclaredAndTraversalFiles()
{
InTemp(directory =>
@@ -149,6 +166,7 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Prüft, dass ein Staging-Fehler die aktive Installation nicht mutiert.</summary>
private static void InstallerDoesNotMutateOnStagingFailure()
{
InTemp(directory =>
@@ -172,6 +190,7 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Prüft die Wiederherstellung der Vorversion nach fehlgeschlagenem aktiviertem Self-Test.</summary>
private static void InstallerRollsBackFailedActivatedSelfTest()
{
InTemp(directory =>
@@ -191,6 +210,7 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Prüft die Deinstallation über ein atomar umbenanntes Quarantäneverzeichnis.</summary>
private static void InstallerUninstallRemovesProgramDirectory()
{
InTemp(directory =>
@@ -205,6 +225,7 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Prüft technischen Kontext, Fehlercode, HRESULT und innere Ausnahme im Setup-Log.</summary>
private static void InstallerDiagnosticLogContainsContextAndExceptionChain()
{
InTemp(directory =>
@@ -225,6 +246,7 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Prüft, dass ein fehlerhafter UI-Callback die Installation nicht beeinflusst.</summary>
private static void InstallerSurvivesUiReportFailure()
{
InTemp(directory =>
@@ -240,6 +262,7 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Prüft den Diagnose-Log-Fallback bei einem nicht verwendbaren ProgramData-Pfad.</summary>
private static void InstallerDiagnosticLogFallsBackToTemp()
{
InTemp(directory =>
@@ -261,6 +284,11 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Erstellt einen minimalen Snapshot für Vergleiche und Planprüfungen.</summary>
/// <param name="application">Der Name der Testanwendung.</param>
/// <param name="port">Der Name des Test-Send-Ports.</param>
/// <param name="state">Der rohe Send-Port-Status.</param>
/// <returns>Ein Snapshot mit einer Anwendung und einem Send Port.</returns>
private static BizTalkSnapshot Snapshot(string application, string port, int state)
{
var result = new BizTalkSnapshot { ToolVersion = "test", CreatedAt = DateTimeOffset.Now.ToString("o"), Server = Environment.MachineName };
@@ -270,6 +298,10 @@ namespace BizTalkPlatformManagementTool.Tests
return result;
}
/// <summary>Erzeugt eine minimale, manifestierte Installer-Payload.</summary>
/// <param name="root">Das temporäre Testwurzelverzeichnis.</param>
/// <param name="payload">Der simulierte Inhalt der Anwendungs-EXE.</param>
/// <returns>Das Verzeichnis des erzeugten Testpakets.</returns>
private static string CreatePackage(string root, string payload)
{
var package = Path.Combine(root, "package");
@@ -280,6 +312,8 @@ namespace BizTalkPlatformManagementTool.Tests
return package;
}
/// <summary>Führt einen Test in einem eindeutigen temporären Verzeichnis mit garantierter Bereinigung aus.</summary>
/// <param name="action">Die Testfunktion, die den temporären Pfad erhält.</param>
private static void InTemp(Action<string> action)
{
var directory = Path.Combine(Path.GetTempPath(), "BizTalkPlatformManagementTool.Tests." + Guid.NewGuid().ToString("N"));
@@ -288,7 +322,14 @@ namespace BizTalkPlatformManagementTool.Tests
finally { if (Directory.Exists(directory)) Directory.Delete(directory, true); }
}
/// <summary>Bricht den Test ab, wenn eine erwartete Bedingung nicht erfüllt ist.</summary>
/// <param name="condition">Die erwartete Bedingung.</param>
/// <param name="message">Die Fehlermeldung bei nicht erfüllter Bedingung.</param>
private static void Assert(bool condition, string message) { if (!condition) throw new InvalidOperationException(message); }
/// <summary>Prüft, dass eine Aktion eine bestimmte Ausnahme auslöst.</summary>
/// <typeparam name="T">Der erwartete Ausnahmetyp.</typeparam>
/// <param name="action">Die auszuführende Aktion.</param>
private static void Expect<T>(Action action) where T : Exception
{
try { action(); }
@@ -296,6 +337,10 @@ namespace BizTalkPlatformManagementTool.Tests
throw new InvalidOperationException("Expected exception " + typeof(T).Name);
}
/// <summary>Führt eine Aktion aus und gibt die erwartete Ausnahme für weitere Prüfungen zurück.</summary>
/// <typeparam name="T">Der erwartete Ausnahmetyp.</typeparam>
/// <param name="action">Die auszuführende Aktion.</param>
/// <returns>Die von der Aktion ausgelöste Ausnahme.</returns>
private static T Capture<T>(Action action) where T : Exception
{
try { action(); }