Isolate optional desktop shortcut failures
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user