Harden OOBE, launch-source and elevation flow
Introduce a per-user OOBE state model and hardened launch/elevation handling. Adds OobeStateFile/OobeLaunchDecision models, OobeStateService (persisting %LOCALAPPDATA%/.launcher/state/oobe-state.json), and LauncherExecutionContext to capture elevation and user SID. CommandContext now normalizes/infers launch-source values (normal, postinstall, apply-update, plugin-install, debug-preview) and exposes maintenance checks. LauncherFlowCoordinator propagates richer launcher context details for diagnostics and suppresses OOBE for elevated/maintenance contexts. PluginInstallerService avoids requesting elevation for user-scoped installs and returns a clear error when installation target is outside the current user's LocalAppData. LauncherClient maps and surfaces result codes, UpdateWorkflow and installer invocation now pass explicit --launch-source values, and WelcomeOobeStep persists OOBE completion via the new service. Adds unit tests (CommandContext, OobeStateService, PluginInstallerService), docs/specs/checklists for the contract, and makes internals visible to tests.
2026-04-22 09:25:22 +08:00
|
|
|
using LanMountainDesktop.Launcher;
|
|
|
|
|
using Xunit;
|
|
|
|
|
|
|
|
|
|
namespace LanMountainDesktop.Tests;
|
|
|
|
|
|
|
|
|
|
public sealed class CommandContextTests
|
|
|
|
|
{
|
|
|
|
|
public static TheoryData<string[], string> LaunchSourceCases => new()
|
|
|
|
|
{
|
|
|
|
|
{ [], "normal" },
|
|
|
|
|
{ ["preview-oobe"], "debug-preview" },
|
|
|
|
|
{ ["--source", "plugin.lmdp", "--plugins-dir", "plugins", "--result", "result.json"], "plugin-install" },
|
|
|
|
|
{ ["launch", "--launch-source", "postinstall"], "postinstall" }
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
[Theory]
|
|
|
|
|
[MemberData(nameof(LaunchSourceCases))]
|
|
|
|
|
public void FromArgs_InfersExpectedLaunchSource(string[] args, string expectedLaunchSource)
|
|
|
|
|
{
|
|
|
|
|
var context = CommandContext.FromArgs(args);
|
|
|
|
|
|
|
|
|
|
Assert.Equal(expectedLaunchSource, context.LaunchSource);
|
|
|
|
|
}
|
2026-05-31 19:41:10 +08:00
|
|
|
|
|
|
|
|
[Fact]
|
|
|
|
|
public void FromArgs_DoesNotTreatAirAppBrokerAsLauncherGuiCommand()
|
|
|
|
|
{
|
|
|
|
|
var context = CommandContext.FromArgs(["air-app-broker", "--requester-pid", "42"]);
|
|
|
|
|
|
|
|
|
|
Assert.False(context.IsGuiCommand);
|
|
|
|
|
}
|
Harden OOBE, launch-source and elevation flow
Introduce a per-user OOBE state model and hardened launch/elevation handling. Adds OobeStateFile/OobeLaunchDecision models, OobeStateService (persisting %LOCALAPPDATA%/.launcher/state/oobe-state.json), and LauncherExecutionContext to capture elevation and user SID. CommandContext now normalizes/infers launch-source values (normal, postinstall, apply-update, plugin-install, debug-preview) and exposes maintenance checks. LauncherFlowCoordinator propagates richer launcher context details for diagnostics and suppresses OOBE for elevated/maintenance contexts. PluginInstallerService avoids requesting elevation for user-scoped installs and returns a clear error when installation target is outside the current user's LocalAppData. LauncherClient maps and surfaces result codes, UpdateWorkflow and installer invocation now pass explicit --launch-source values, and WelcomeOobeStep persists OOBE completion via the new service. Adds unit tests (CommandContext, OobeStateService, PluginInstallerService), docs/specs/checklists for the contract, and makes internals visible to tests.
2026-04-22 09:25:22 +08:00
|
|
|
}
|