Isolate optional desktop shortcut failures

This commit is contained in:
2026-08-24 13:02:58 +02:00
parent 3219c3f1bc
commit 3b4a621cd3
16 changed files with 311 additions and 45 deletions
@@ -50,6 +50,7 @@ namespace BizTalkPlatformManagementTool.Tests
Run("InstallerDiagnosticLogContainsContextAndExceptionChain", InstallerDiagnosticLogContainsContextAndExceptionChain);
Run("InstallerDiagnosticLogFallsBackToTemp", InstallerDiagnosticLogFallsBackToTemp);
Run("InstallerSurvivesUiReportFailure", InstallerSurvivesUiReportFailure);
Run("OptionalWindowsIntegrationFailuresAreNonFatal", OptionalWindowsIntegrationFailuresAreNonFatal);
Console.WriteLine(failures == 0 ? "ALL TESTS PASSED" : failures + " TEST(S) FAILED");
return failures == 0 ? 0 : 1;
}
@@ -618,6 +619,56 @@ namespace BizTalkPlatformManagementTool.Tests
});
}
/// <summary>Prüft, dass optionale Desktop- und Warnungsfehler niemals eine Kernoperation abbrechen.</summary>
private static void OptionalWindowsIntegrationFailuresAreNonFatal()
{
InTemp(directory =>
{
var log = SetupOperationLog.Create(directory, "optional-integration-test");
var warnings = new List<string>();
var failed = InstallerEngine.TryOptionalWindowsIntegrationStep(
"desktop_shortcut_create",
"Desktop-Verknuepfung erstellen",
Path.Combine(directory, "Public Desktop", "Tool.lnk"),
() => { throw new UnauthorizedAccessException("simulated public desktop ACL denial"); },
log,
warnings.Add);
Assert(!failed, "optional ACL failure was reported as success");
Assert(warnings.Count == 1 && warnings[0].Contains("Kernoperation wird fortgesetzt"), "operator continuation warning missing");
var warningFailureEscaped = false;
try
{
InstallerEngine.TryOptionalWindowsIntegrationStep(
"desktop_shortcut_validate",
"Desktop-Verknuepfung validieren",
Path.Combine(directory, "Public Desktop", "Tool.lnk"),
() => { throw new InvalidOperationException("simulated state mismatch"); },
log,
message => { throw new InvalidOperationException("simulated warning sink failure"); });
}
catch
{
warningFailureEscaped = true;
}
Assert(!warningFailureEscaped, "optional warning sink failure escaped the isolation boundary");
var succeeded = InstallerEngine.TryOptionalWindowsIntegrationStep(
"desktop_shortcut_remove",
"Desktop-Verknuepfung entfernen",
Path.Combine(directory, "Public Desktop", "Tool.lnk"),
() => { },
log,
warnings.Add);
Assert(succeeded, "successful optional operation was reported as failure");
var content = File.ReadAllText(log.FilePath);
Assert(content.Contains("event=optional_windows_integration_warning role=desktop_shortcut_create"), "optional ACL failure missing from diagnostics");
Assert(content.Contains("event=optional_windows_integration_report_failed role=desktop_shortcut_validate"), "warning sink failure missing from diagnostics");
Assert(content.Contains("event=optional_windows_integration_completed role=desktop_shortcut_remove"), "optional success missing from diagnostics");
});
}
/// <summary>Prüft den Diagnose-Log-Fallback bei einem nicht verwendbaren ProgramData-Pfad.</summary>
private static void InstallerDiagnosticLogFallsBackToTemp()
{