From 10b055bc07d4e3bb628a9526833551d1be8f4320 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Mon, 21 Dec 2020 15:25:00 +0100 Subject: [PATCH 1/4] use simpler name to avoid issues with special characters --- .../System.Diagnostics.Process/tests/ProcessTests.Unix.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs index 99272c05f0c2e3..2a20d1450f74a2 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs @@ -159,7 +159,7 @@ public void ProcessStart_UseShellExecute_OnUnix_SuccessWhenProgramInstalled(bool [PlatformSpecific(~TestPlatforms.OSX)] // On OSX, ProcessName returns the script interpreter. public void ProcessNameMatchesScriptName() { - string scriptName = GetTestFileName(); + const string scriptName = nameof(ProcessNameMatchesScriptName); string filename = Path.Combine(TestDirectory, scriptName); File.WriteAllText(filename, $"#!/bin/sh\nsleep 600\n"); // sleep 10 min. ChMod(filename, "744"); // set x-bit From ad512a319ca81ae84e7833536fcdf918769eeff3 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Mon, 21 Dec 2020 15:26:46 +0100 Subject: [PATCH 2/4] use full path to avoid potential alias issues --- .../System.Diagnostics.Process/tests/ProcessTests.Unix.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs index 2a20d1450f74a2..ec4b2cfd1ff4fa 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs @@ -161,7 +161,7 @@ public void ProcessNameMatchesScriptName() { const string scriptName = nameof(ProcessNameMatchesScriptName); string filename = Path.Combine(TestDirectory, scriptName); - File.WriteAllText(filename, $"#!/bin/sh\nsleep 600\n"); // sleep 10 min. + File.WriteAllText(filename, $"#!/bin/sh\n/bin/sleep 600\n"); // sleep 10 min. ChMod(filename, "744"); // set x-bit using (var process = Process.Start(new ProcessStartInfo { FileName = filename })) From 11c21970daf44d8844c4399b66fcb2e29b00d16f Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Mon, 21 Dec 2020 15:34:26 +0100 Subject: [PATCH 3/4] handle potential zombie process --- .../tests/ProcessTests.Unix.cs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs index ec4b2cfd1ff4fa..4ffb931c9f54bf 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs @@ -171,14 +171,24 @@ public void ProcessNameMatchesScriptName() string stat = File.ReadAllText($"/proc/{process.Id}/stat"); Assert.Contains($"({scriptName.Substring(0, 15)})", stat); string cmdline = File.ReadAllText($"/proc/{process.Id}/cmdline"); - Assert.Equal($"/bin/sh\0{filename}\0", cmdline); - Assert.Equal(scriptName, process.ProcessName); + if (string.IsNullOrEmpty(cmdline)) + { + Assert.True(process.HasExited, $"/proc/{process.Id}/cmdline was empty, but the process was not a zombie"); + } + else + { + Assert.Equal($"/bin/sh\0{filename}\0", cmdline); + Assert.Equal(scriptName, process.ProcessName); + } } finally { - process.Kill(); - process.WaitForExit(); + if (!process.HasExited) + { + process.Kill(); + process.WaitForExit(); + } } } } From 81d97c3966e0e963c36b9ee408fbe397590c3aa3 Mon Sep 17 00:00:00 2001 From: Adam Sitnik Date: Mon, 21 Dec 2020 15:36:23 +0100 Subject: [PATCH 4/4] add comments --- .../System.Diagnostics.Process/tests/ProcessTests.Unix.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs index 4ffb931c9f54bf..a1d5d4f50f2512 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.Unix.cs @@ -172,6 +172,8 @@ public void ProcessNameMatchesScriptName() Assert.Contains($"({scriptName.Substring(0, 15)})", stat); string cmdline = File.ReadAllText($"/proc/{process.Id}/cmdline"); + // cmdLine can sometimes be null: https://github.com/dotnet/runtime/issues/13757 + // according to docs, it's when the process is a zombie: https://man7.org/linux/man-pages/man5/proc.5.html if (string.IsNullOrEmpty(cmdline)) { Assert.True(process.HasExited, $"/proc/{process.Id}/cmdline was empty, but the process was not a zombie");