diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs index 59a24f55a0fd3..e64153fe1e1a0 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs @@ -4,6 +4,7 @@ using System.Collections; using System.Collections.Generic; using System.ComponentModel; +using System.Globalization; using System.IO; using System.Linq; using System.Reflection; @@ -802,6 +803,24 @@ public void TestProcessRecycledPid() Assert.True(foundRecycled); } + [PlatformSpecific(TestPlatforms.AnyUnix)] + [ConditionalTheory(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] + [InlineData("/dev/stdin", O_RDONLY)] + [InlineData("/dev/stdout", O_WRONLY)] + [InlineData("/dev/stderr", O_WRONLY)] + public void ChildProcessRedirectedIO_FilePathOpenShouldSucceed(string filename, int flags) + { + var options = new RemoteInvokeOptions { StartInfo = new ProcessStartInfo { RedirectStandardOutput = true, RedirectStandardInput = true, RedirectStandardError = true }}; + using (RemoteInvokeHandle handle = RemoteExecutor.Invoke(ExecuteChildProcess, filename, flags.ToString(CultureInfo.InvariantCulture), options)) + { } + + static void ExecuteChildProcess(string filename, string flags) + { + int result = open(filename, int.Parse(flags, CultureInfo.InvariantCulture)); + Assert.True(result >= 0, $"failed to open file with {result} and errno {Marshal.GetLastWin32Error()}."); + } + } + [ConditionalTheory(typeof(RemoteExecutor), nameof(RemoteExecutor.IsSupported))] [InlineData(true)] [InlineData(false)] @@ -941,6 +960,12 @@ private static unsafe HashSet GetGroups() [DllImport("libc", SetLastError = true)] private static extern int kill(int pid, int sig); + [DllImport("libc", SetLastError = true)] + private static extern int open(string pathname, int flags); + + private const int O_RDONLY = 0; + private const int O_WRONLY = 1; + private static readonly string[] s_allowedProgramsToRun = new string[] { "xdg-open", "gnome-open", "kfmclient" }; private string WriteScriptFile(string directory, string name, int returnValue)