From 6e875df2eb25c2e675d879c29912c75f87c35c21 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 16:00:27 +0000 Subject: [PATCH 1/8] Initial plan From 325dbb0a0c52f453026b33710d6d3423d339258c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 16:29:43 +0000 Subject: [PATCH 2/8] Add System.Diagnostics.Process tests for mobile platforms (Android/iOS) Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com> Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/52b94fd0-1cd0-4d55-b52f-3f41b2b5e6a4 --- .../tests/ProcessTests.AnyMobile.cs | 158 ++++++++++++++++++ .../System.Diagnostics.Process.Tests.csproj | 7 +- 2 files changed, 163 insertions(+), 2 deletions(-) create mode 100644 src/libraries/System.Diagnostics.Process/tests/ProcessTests.AnyMobile.cs diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.AnyMobile.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.AnyMobile.cs new file mode 100644 index 00000000000000..66d7b388a865a0 --- /dev/null +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.AnyMobile.cs @@ -0,0 +1,158 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.IO; +using Xunit; + +namespace System.Diagnostics.Tests +{ + public partial class ProcessTests : ProcessTestBase + { + // Simple Unix tools used in Android tests. On Android, these live under + // /system/bin and are always present (they are provided by toybox/busybox). + // GetProgramPath searches PATH, and Android's PATH includes /system/bin. + private static string GetAndroidProgramPath(string program) => + GetProgramPath(program) ?? Path.Combine("/system/bin", program); + + private const string NonExistentPath = "/nonexistent_path_for_testing_1234567890"; + + [Fact] + [PlatformSpecific(TestPlatforms.Android)] + public void Process_Start_SimpleCommand_ExitsSuccessfully() + { + string ls = GetAndroidProgramPath("ls"); + using (var process = Process.Start(ls, "/")) + { + Assert.NotNull(process); + Assert.True(process.WaitForExit(WaitInMS)); + Assert.Equal(0, process.ExitCode); + Assert.True(process.HasExited); + } + } + + [Fact] + [PlatformSpecific(TestPlatforms.Android)] + public void Process_Start_WithArgumentList_ExitsSuccessfully() + { + string ls = GetAndroidProgramPath("ls"); + var psi = new ProcessStartInfo(ls); + psi.ArgumentList.Add("/"); + using (var process = Process.Start(psi)) + { + Assert.NotNull(process); + Assert.True(process.WaitForExit(WaitInMS)); + Assert.Equal(0, process.ExitCode); + Assert.True(process.HasExited); + } + } + + [Fact] + [PlatformSpecific(TestPlatforms.Android)] + public void Process_Start_CaptureStdout_ReadsOutput() + { + string ls = GetAndroidProgramPath("ls"); + var psi = new ProcessStartInfo(ls, "/") + { + RedirectStandardOutput = true + }; + using (var process = Process.Start(psi)) + { + Assert.NotNull(process); + string output = process.StandardOutput.ReadToEnd(); + Assert.True(process.WaitForExit(WaitInMS)); + Assert.Equal(0, process.ExitCode); + Assert.False(string.IsNullOrEmpty(output)); + } + } + + [Fact] + [PlatformSpecific(TestPlatforms.Android)] + public void Process_Kill_TerminatesRunningProcess() + { + string sleep = GetAndroidProgramPath("sleep"); + using (var process = Process.Start(sleep, "600")) + { + Assert.NotNull(process); + Assert.False(process.HasExited); + Assert.True(process.Id > 0); + process.Kill(); + Assert.True(process.WaitForExit(WaitInMS)); + Assert.True(process.HasExited); + } + } + + [Fact] + [PlatformSpecific(TestPlatforms.Android)] + public void Process_Start_ExitCode_ReflectsCommandFailure() + { + string ls = GetAndroidProgramPath("ls"); + var psi = new ProcessStartInfo(ls, NonExistentPath) + { + RedirectStandardError = true // suppress error output + }; + using (var process = Process.Start(psi)) + { + Assert.NotNull(process); + process.StandardError.ReadToEnd(); + Assert.True(process.WaitForExit(WaitInMS)); + Assert.NotEqual(0, process.ExitCode); + } + } + + [Fact] + [PlatformSpecific(TestPlatforms.Android)] + public void Process_Id_IsValidForStartedProcess() + { + string sleep = GetAndroidProgramPath("sleep"); + using (var process = Process.Start(sleep, "600")) + { + Assert.NotNull(process); + try + { + Assert.True(process.Id > 0); + } + finally + { + process.Kill(); + process.WaitForExit(); + } + } + } + + [Fact] + [PlatformSpecific(TestPlatforms.Android)] + public void Process_ProcessName_IsSetForStartedProcess() + { + string sleep = GetAndroidProgramPath("sleep"); + using (var process = Process.Start(sleep, "600")) + { + Assert.NotNull(process); + try + { + Assert.NotNull(process.ProcessName); + Assert.NotEmpty(process.ProcessName); + } + finally + { + process.Kill(); + process.WaitForExit(); + } + } + } + + [Fact] + [PlatformSpecific(TestPlatforms.Android)] + public void Process_HasExited_IsFalseWhileRunning_TrueAfterExit() + { + string sleep = GetAndroidProgramPath("sleep"); + using (var process = Process.Start(sleep, "600")) + { + Assert.NotNull(process); + Assert.False(process.HasExited); + process.Kill(); + Assert.True(process.WaitForExit(WaitInMS)); + Assert.True(process.HasExited); + } + } + } +} diff --git a/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj b/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj index e44431ae36405a..98a6e34efcb4b1 100644 --- a/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj +++ b/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj @@ -3,7 +3,7 @@ true $(MSBuildProjectDirectory)\..\src\Resources\Strings.resx true - $(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-unix;$(NetCoreAppCurrent)-browser + $(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-unix;$(NetCoreAppCurrent)-browser;$(NetCoreAppCurrent)-android;$(NetCoreAppCurrent)-ios;$(NetCoreAppCurrent)-tvos;$(NetCoreAppCurrent)-maccatalyst true @@ -58,7 +58,7 @@ - + @@ -73,6 +73,9 @@ + + + From 403f131c11103a56f3738803aad002db199464c9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 16:38:07 +0000 Subject: [PATCH 3/8] Scope Process mobile tests to Android only; rename to ProcessTests.Android.cs Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com> Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/800d4e96-f860-4a1c-89f3-e764451d1da9 --- ...{ProcessTests.AnyMobile.cs => ProcessTests.Android.cs} | 0 .../tests/System.Diagnostics.Process.Tests.csproj | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) rename src/libraries/System.Diagnostics.Process/tests/{ProcessTests.AnyMobile.cs => ProcessTests.Android.cs} (100%) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.AnyMobile.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs similarity index 100% rename from src/libraries/System.Diagnostics.Process/tests/ProcessTests.AnyMobile.cs rename to src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs diff --git a/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj b/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj index 98a6e34efcb4b1..b4a1c515103908 100644 --- a/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj +++ b/src/libraries/System.Diagnostics.Process/tests/System.Diagnostics.Process.Tests.csproj @@ -3,7 +3,7 @@ true $(MSBuildProjectDirectory)\..\src\Resources\Strings.resx true - $(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-unix;$(NetCoreAppCurrent)-browser;$(NetCoreAppCurrent)-android;$(NetCoreAppCurrent)-ios;$(NetCoreAppCurrent)-tvos;$(NetCoreAppCurrent)-maccatalyst + $(NetCoreAppCurrent)-windows;$(NetCoreAppCurrent)-unix;$(NetCoreAppCurrent)-browser;$(NetCoreAppCurrent)-android true @@ -58,7 +58,7 @@ - + @@ -73,8 +73,8 @@ - - + + From ba2dc9c623f91debccfba81bb0de892d4cea9eed Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 16:45:24 +0000 Subject: [PATCH 4/8] Remove GetAndroidProgramPath helper; replace var with explicit types throughout Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com> Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/8c73b007-1f6a-4064-8e02-ff21eaec112c --- .../tests/ProcessTests.Android.cs | 39 ++++++------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs index 66d7b388a865a0..d946df4b2104f9 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs @@ -1,27 +1,19 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.IO; using Xunit; namespace System.Diagnostics.Tests { public partial class ProcessTests : ProcessTestBase { - // Simple Unix tools used in Android tests. On Android, these live under - // /system/bin and are always present (they are provided by toybox/busybox). - // GetProgramPath searches PATH, and Android's PATH includes /system/bin. - private static string GetAndroidProgramPath(string program) => - GetProgramPath(program) ?? Path.Combine("/system/bin", program); - private const string NonExistentPath = "/nonexistent_path_for_testing_1234567890"; [Fact] [PlatformSpecific(TestPlatforms.Android)] public void Process_Start_SimpleCommand_ExitsSuccessfully() { - string ls = GetAndroidProgramPath("ls"); - using (var process = Process.Start(ls, "/")) + using (Process process = Process.Start("ls", "/")) { Assert.NotNull(process); Assert.True(process.WaitForExit(WaitInMS)); @@ -34,10 +26,9 @@ public void Process_Start_SimpleCommand_ExitsSuccessfully() [PlatformSpecific(TestPlatforms.Android)] public void Process_Start_WithArgumentList_ExitsSuccessfully() { - string ls = GetAndroidProgramPath("ls"); - var psi = new ProcessStartInfo(ls); + ProcessStartInfo psi = new("ls"); psi.ArgumentList.Add("/"); - using (var process = Process.Start(psi)) + using (Process process = Process.Start(psi)) { Assert.NotNull(process); Assert.True(process.WaitForExit(WaitInMS)); @@ -50,12 +41,11 @@ public void Process_Start_WithArgumentList_ExitsSuccessfully() [PlatformSpecific(TestPlatforms.Android)] public void Process_Start_CaptureStdout_ReadsOutput() { - string ls = GetAndroidProgramPath("ls"); - var psi = new ProcessStartInfo(ls, "/") + ProcessStartInfo psi = new("ls", "/") { RedirectStandardOutput = true }; - using (var process = Process.Start(psi)) + using (Process process = Process.Start(psi)) { Assert.NotNull(process); string output = process.StandardOutput.ReadToEnd(); @@ -69,8 +59,7 @@ public void Process_Start_CaptureStdout_ReadsOutput() [PlatformSpecific(TestPlatforms.Android)] public void Process_Kill_TerminatesRunningProcess() { - string sleep = GetAndroidProgramPath("sleep"); - using (var process = Process.Start(sleep, "600")) + using (Process process = Process.Start("sleep", "600")) { Assert.NotNull(process); Assert.False(process.HasExited); @@ -85,12 +74,11 @@ public void Process_Kill_TerminatesRunningProcess() [PlatformSpecific(TestPlatforms.Android)] public void Process_Start_ExitCode_ReflectsCommandFailure() { - string ls = GetAndroidProgramPath("ls"); - var psi = new ProcessStartInfo(ls, NonExistentPath) + ProcessStartInfo psi = new("ls", NonExistentPath) { - RedirectStandardError = true // suppress error output + RedirectStandardError = true }; - using (var process = Process.Start(psi)) + using (Process process = Process.Start(psi)) { Assert.NotNull(process); process.StandardError.ReadToEnd(); @@ -103,8 +91,7 @@ public void Process_Start_ExitCode_ReflectsCommandFailure() [PlatformSpecific(TestPlatforms.Android)] public void Process_Id_IsValidForStartedProcess() { - string sleep = GetAndroidProgramPath("sleep"); - using (var process = Process.Start(sleep, "600")) + using (Process process = Process.Start("sleep", "600")) { Assert.NotNull(process); try @@ -123,8 +110,7 @@ public void Process_Id_IsValidForStartedProcess() [PlatformSpecific(TestPlatforms.Android)] public void Process_ProcessName_IsSetForStartedProcess() { - string sleep = GetAndroidProgramPath("sleep"); - using (var process = Process.Start(sleep, "600")) + using (Process process = Process.Start("sleep", "600")) { Assert.NotNull(process); try @@ -144,8 +130,7 @@ public void Process_ProcessName_IsSetForStartedProcess() [PlatformSpecific(TestPlatforms.Android)] public void Process_HasExited_IsFalseWhileRunning_TrueAfterExit() { - string sleep = GetAndroidProgramPath("sleep"); - using (var process = Process.Start(sleep, "600")) + using (Process process = Process.Start("sleep", "600")) { Assert.NotNull(process); Assert.False(process.HasExited); From bba6e3dca9026a14a567b1af47e2967cb543b8a1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 22:02:45 +0000 Subject: [PATCH 5/8] Fix Android ls tests: use Path.GetTempPath() instead of / (SELinux blocks rootfs access) Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com> Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/e2973f56-fdfc-478d-ba86-a76140ebe677 --- .../tests/ProcessTests.Android.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs index d946df4b2104f9..5f50741d2f1c77 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs @@ -1,6 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System.IO; using Xunit; namespace System.Diagnostics.Tests @@ -13,7 +14,7 @@ public partial class ProcessTests : ProcessTestBase [PlatformSpecific(TestPlatforms.Android)] public void Process_Start_SimpleCommand_ExitsSuccessfully() { - using (Process process = Process.Start("ls", "/")) + using (Process process = Process.Start("ls", Path.GetTempPath())) { Assert.NotNull(process); Assert.True(process.WaitForExit(WaitInMS)); @@ -27,7 +28,7 @@ public void Process_Start_SimpleCommand_ExitsSuccessfully() public void Process_Start_WithArgumentList_ExitsSuccessfully() { ProcessStartInfo psi = new("ls"); - psi.ArgumentList.Add("/"); + psi.ArgumentList.Add(Path.GetTempPath()); using (Process process = Process.Start(psi)) { Assert.NotNull(process); @@ -41,7 +42,7 @@ public void Process_Start_WithArgumentList_ExitsSuccessfully() [PlatformSpecific(TestPlatforms.Android)] public void Process_Start_CaptureStdout_ReadsOutput() { - ProcessStartInfo psi = new("ls", "/") + ProcessStartInfo psi = new("ls", Path.GetTempPath()) { RedirectStandardOutput = true }; From cc078a102a9a83b49dc978e6658b5c0d44e1aadc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 10:30:42 +0000 Subject: [PATCH 6/8] Address review feedback: remove redundant tests, assert stderr not empty, add StandardHandles test Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com> Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/a618196a-9db7-4afe-a608-b0d0d2610f66 --- .../tests/ProcessTests.Android.cs | 82 ++++++++++--------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs index 5f50741d2f1c77..fc2ad09ee67fb3 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.IO; +using Microsoft.Win32.SafeHandles; using Xunit; namespace System.Diagnostics.Tests @@ -23,21 +24,6 @@ public void Process_Start_SimpleCommand_ExitsSuccessfully() } } - [Fact] - [PlatformSpecific(TestPlatforms.Android)] - public void Process_Start_WithArgumentList_ExitsSuccessfully() - { - ProcessStartInfo psi = new("ls"); - psi.ArgumentList.Add(Path.GetTempPath()); - using (Process process = Process.Start(psi)) - { - Assert.NotNull(process); - Assert.True(process.WaitForExit(WaitInMS)); - Assert.Equal(0, process.ExitCode); - Assert.True(process.HasExited); - } - } - [Fact] [PlatformSpecific(TestPlatforms.Android)] public void Process_Start_CaptureStdout_ReadsOutput() @@ -82,22 +68,24 @@ public void Process_Start_ExitCode_ReflectsCommandFailure() using (Process process = Process.Start(psi)) { Assert.NotNull(process); - process.StandardError.ReadToEnd(); + string error = process.StandardError.ReadToEnd(); Assert.True(process.WaitForExit(WaitInMS)); Assert.NotEqual(0, process.ExitCode); + Assert.False(string.IsNullOrEmpty(error)); } } [Fact] [PlatformSpecific(TestPlatforms.Android)] - public void Process_Id_IsValidForStartedProcess() + public void Process_ProcessName_IsSetForStartedProcess() { using (Process process = Process.Start("sleep", "600")) { Assert.NotNull(process); try { - Assert.True(process.Id > 0); + Assert.NotNull(process.ProcessName); + Assert.NotEmpty(process.ProcessName); } finally { @@ -109,35 +97,49 @@ public void Process_Id_IsValidForStartedProcess() [Fact] [PlatformSpecific(TestPlatforms.Android)] - public void Process_ProcessName_IsSetForStartedProcess() + public void Process_Start_WithStandardHandles_CanRedirectIO() { - using (Process process = Process.Start("sleep", "600")) + string? errorFile = null; + try { - Assert.NotNull(process); - try + errorFile = Path.GetTempFileName(); + + SafeFileHandle.CreateAnonymousPipe(out SafeFileHandle outputRead, out SafeFileHandle outputWrite); + + using SafeFileHandle inputHandle = File.OpenNullHandle(); + using SafeFileHandle errorHandle = File.OpenHandle(errorFile, FileMode.Create, FileAccess.Write, FileShare.ReadWrite); + + ProcessStartInfo psi = new("ls", Path.GetTempPath()) { - Assert.NotNull(process.ProcessName); - Assert.NotEmpty(process.ProcessName); - } - finally + StandardInputHandle = inputHandle, + StandardOutputHandle = outputWrite, + StandardErrorHandle = errorHandle + }; + + using (outputRead) + using (outputWrite) { - process.Kill(); - process.WaitForExit(); + using (Process process = Process.Start(psi)) + { + Assert.NotNull(process); + outputWrite.Close(); // close the parent copy so ReadToEnd unblocks + + using FileStream outputStream = new(outputRead, FileAccess.Read); + using StreamReader outputReader = new(outputStream); + string output = outputReader.ReadToEnd(); + + Assert.True(process.WaitForExit(WaitInMS)); + Assert.Equal(0, process.ExitCode); + Assert.False(string.IsNullOrEmpty(output)); + } } } - } - - [Fact] - [PlatformSpecific(TestPlatforms.Android)] - public void Process_HasExited_IsFalseWhileRunning_TrueAfterExit() - { - using (Process process = Process.Start("sleep", "600")) + finally { - Assert.NotNull(process); - Assert.False(process.HasExited); - process.Kill(); - Assert.True(process.WaitForExit(WaitInMS)); - Assert.True(process.HasExited); + if (errorFile is not null && File.Exists(errorFile)) + { + File.Delete(errorFile); + } } } } From bb5bca59916885c1f6e3752f47c718ea3cb098db Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 12:54:36 +0000 Subject: [PATCH 7/8] Address nits: rename tests, move errorFile before try block Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com> Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/571a3ca3-d117-435b-8068-92791579ae7f --- .../tests/ProcessTests.Android.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs index fc2ad09ee67fb3..c5e872f572b748 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Android.cs @@ -13,7 +13,7 @@ public partial class ProcessTests : ProcessTestBase [Fact] [PlatformSpecific(TestPlatforms.Android)] - public void Process_Start_SimpleCommand_ExitsSuccessfully() + public void Process_Start_InheritedIO_ExitsSuccessfully() { using (Process process = Process.Start("ls", Path.GetTempPath())) { @@ -26,7 +26,7 @@ public void Process_Start_SimpleCommand_ExitsSuccessfully() [Fact] [PlatformSpecific(TestPlatforms.Android)] - public void Process_Start_CaptureStdout_ReadsOutput() + public void Process_Start_RedirectedStandardOutput_ReadsOutput() { ProcessStartInfo psi = new("ls", Path.GetTempPath()) { @@ -99,11 +99,9 @@ public void Process_ProcessName_IsSetForStartedProcess() [PlatformSpecific(TestPlatforms.Android)] public void Process_Start_WithStandardHandles_CanRedirectIO() { - string? errorFile = null; + string errorFile = Path.GetTempFileName(); try { - errorFile = Path.GetTempFileName(); - SafeFileHandle.CreateAnonymousPipe(out SafeFileHandle outputRead, out SafeFileHandle outputWrite); using SafeFileHandle inputHandle = File.OpenNullHandle(); @@ -136,7 +134,7 @@ public void Process_Start_WithStandardHandles_CanRedirectIO() } finally { - if (errorFile is not null && File.Exists(errorFile)) + if (File.Exists(errorFile)) { File.Delete(errorFile); } From a2efbde0c1dfaf4caeedee9fdc91d233342a291f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 26 Mar 2026 17:25:46 +0000 Subject: [PATCH 8/8] Skip ProcessHandlesTests on Android (sh not available) Agent-Logs-Url: https://github.com/dotnet/runtime/sessions/1cc664b6-0eef-437b-8198-828ddf712f1e Co-authored-by: adamsitnik <6011991+adamsitnik@users.noreply.github.com> --- .../System.Diagnostics.Process/tests/ProcessHandlesTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessHandlesTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessHandlesTests.cs index 48203a2bd69d51..8eddca23966e69 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessHandlesTests.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessHandlesTests.cs @@ -8,6 +8,7 @@ namespace System.Diagnostics.Tests { + [SkipOnPlatform(TestPlatforms.Android, "sh is not available on Android")] public class ProcessHandlesTests : ProcessTestBase { [Theory]