From 017eaf4d960f6802cfc2b4d26b30d74d4d974f5f Mon Sep 17 00:00:00 2001 From: sysadmin Date: Tue, 9 Jun 2026 02:18:52 +0100 Subject: [PATCH] feat(welcome): process runner abstraction --- .../Apply/IProcessRunner.cs | 6 ++++++ .../Apply/ProcessRunner.cs | 19 +++++++++++++++++++ .../ProcessRunnerTests.cs | 14 ++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 windows/welcome/src/SilverOS.Welcome.Core/Apply/IProcessRunner.cs create mode 100644 windows/welcome/src/SilverOS.Welcome.Core/Apply/ProcessRunner.cs create mode 100644 windows/welcome/tests/SilverOS.Welcome.Tests/ProcessRunnerTests.cs diff --git a/windows/welcome/src/SilverOS.Welcome.Core/Apply/IProcessRunner.cs b/windows/welcome/src/SilverOS.Welcome.Core/Apply/IProcessRunner.cs new file mode 100644 index 0000000..c065de9 --- /dev/null +++ b/windows/welcome/src/SilverOS.Welcome.Core/Apply/IProcessRunner.cs @@ -0,0 +1,6 @@ +namespace SilverOS.Welcome.Core.Apply; +public readonly record struct ProcessResult(int ExitCode, string StdOut, string StdErr); +public interface IProcessRunner +{ + Task RunAsync(string file, string args, CancellationToken ct = default); +} diff --git a/windows/welcome/src/SilverOS.Welcome.Core/Apply/ProcessRunner.cs b/windows/welcome/src/SilverOS.Welcome.Core/Apply/ProcessRunner.cs new file mode 100644 index 0000000..4ec52d7 --- /dev/null +++ b/windows/welcome/src/SilverOS.Welcome.Core/Apply/ProcessRunner.cs @@ -0,0 +1,19 @@ +using System.Diagnostics; +namespace SilverOS.Welcome.Core.Apply; + +public sealed class ProcessRunner : IProcessRunner +{ + public async Task RunAsync(string file, string args, CancellationToken ct = default) + { + using var p = new Process { StartInfo = new ProcessStartInfo(file, args) + { + RedirectStandardOutput = true, RedirectStandardError = true, + UseShellExecute = false, CreateNoWindow = true + }}; + p.Start(); + var outT = p.StandardOutput.ReadToEndAsync(ct); + var errT = p.StandardError.ReadToEndAsync(ct); + await p.WaitForExitAsync(ct); + return new ProcessResult(p.ExitCode, await outT, await errT); + } +} diff --git a/windows/welcome/tests/SilverOS.Welcome.Tests/ProcessRunnerTests.cs b/windows/welcome/tests/SilverOS.Welcome.Tests/ProcessRunnerTests.cs new file mode 100644 index 0000000..febb0e5 --- /dev/null +++ b/windows/welcome/tests/SilverOS.Welcome.Tests/ProcessRunnerTests.cs @@ -0,0 +1,14 @@ +using SilverOS.Welcome.Core.Apply; +using Xunit; + +public class ProcessRunnerTests +{ + [Fact] + public async Task Runs_powershell_and_captures_output_and_exit() + { + var r = await new ProcessRunner().RunAsync( + "powershell.exe", "-NoProfile -Command \"Write-Output hello; exit 3\""); + Assert.Equal(3, r.ExitCode); + Assert.Contains("hello", r.StdOut); + } +}