From caf37e5ef2060ede9e111456d4fa57fa49efb4de Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Tue, 2 May 2023 13:43:38 +0200 Subject: [PATCH 1/3] ProcessTests: allow WorkingSet to be zero just after launching the process. The WorkingSet tests fail on Fedora 38+ because a zero working set value is observed just after the process start. --- .../tests/ProcessTests.cs | 69 +++++++++++++++++-- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs index a102fee93075a5..0b7921c0b58d34 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs @@ -769,7 +769,25 @@ public void TestPeakWorkingSet64() { CreateDefaultProcess(); - AssertNonZeroAllZeroDarwin(_process.PeakWorkingSet64); + if (OperatingSystem.IsMacOS()) + { + Assert.Equal(0, _process.PeakWorkingSet64); + return; + } + + // On recent Linux kernels (6.2+) working set can be zero just after the process started. + RetryHelper.Execute(() => + { + try + { + Assert.NotEqual(0, _process.PeakWorkingSet64); + } + catch + { + _process.Refresh(); + throw; + } + }); } [Fact] @@ -822,7 +840,19 @@ public void TestWorkingSet64() return; } - Assert.InRange(_process.WorkingSet64, 1, long.MaxValue); + // On recent Linux kernels (6.2+) working set can be zero just after the process started. + RetryHelper.Execute(() => + { + try + { + Assert.InRange(_process.WorkingSet64, 1, long.MaxValue); + } + catch + { + _process.Refresh(); + throw; + } + }); } [Fact] @@ -2014,9 +2044,28 @@ public void TestPeakWorkingSet() { CreateDefaultProcess(); + if (OperatingSystem.IsMacOS()) + { #pragma warning disable 0618 - AssertNonZeroAllZeroDarwin(_process.PeakWorkingSet); + Assert.Equal(0, _process.PeakWorkingSet); #pragma warning restore 0618 + } + + // On recent Linux kernels (6.2+) working set can be zero just after the process started. + RetryHelper.Execute(() => + { + try + { +#pragma warning disable 0618 + Assert.NotEqual(0, _process.PeakWorkingSet); +#pragma warning restore 0618 + } + catch + { + _process.Refresh(); + throw; + } + }); } [Fact] @@ -2080,9 +2129,21 @@ public void TestWorkingSet() return; } + // On recent Linux kernels (6.2+) working set can be zero just after the process started. + RetryHelper.Execute(() => + { + try + { #pragma warning disable 0618 - Assert.InRange(_process.WorkingSet, 1, int.MaxValue); + Assert.InRange(_process.WorkingSet, 1, int.MaxValue); #pragma warning restore 0618 + } + catch + { + _process.Refresh(); + throw; + } + }); } [Fact] From 21b8d4d85a801a0fc8787c9fb2172a5de5430d4d Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Tue, 9 May 2023 09:06:23 +0200 Subject: [PATCH 2/3] Fix test. --- src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs index 0b7921c0b58d34..083f7949f3e23c 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs @@ -2049,6 +2049,7 @@ public void TestPeakWorkingSet() #pragma warning disable 0618 Assert.Equal(0, _process.PeakWorkingSet); #pragma warning restore 0618 + return; } // On recent Linux kernels (6.2+) working set can be zero just after the process started. From 12856997fb0a0eeb68a78fa8a9cc5afd219d7628 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Sun, 14 May 2023 10:54:07 +0200 Subject: [PATCH 3/3] PR feedback. --- .../tests/ProcessTests.cs | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs index 083f7949f3e23c..1f1c6f8678ce88 100644 --- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs +++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs @@ -776,7 +776,7 @@ public void TestPeakWorkingSet64() } // On recent Linux kernels (6.2+) working set can be zero just after the process started. - RetryHelper.Execute(() => + ExecuteWithRetryOnLinux(() => { try { @@ -841,7 +841,7 @@ public void TestWorkingSet64() } // On recent Linux kernels (6.2+) working set can be zero just after the process started. - RetryHelper.Execute(() => + ExecuteWithRetryOnLinux(() => { try { @@ -2053,7 +2053,7 @@ public void TestPeakWorkingSet() } // On recent Linux kernels (6.2+) working set can be zero just after the process started. - RetryHelper.Execute(() => + ExecuteWithRetryOnLinux(() => { try { @@ -2131,7 +2131,7 @@ public void TestWorkingSet() } // On recent Linux kernels (6.2+) working set can be zero just after the process started. - RetryHelper.Execute(() => + ExecuteWithRetryOnLinux(() => { try { @@ -2739,5 +2739,17 @@ private SecureString AsSecureString(string str) return secureString; } + + private static void ExecuteWithRetryOnLinux(Action test) + { + if (OperatingSystem.IsLinux()) + { + RetryHelper.Execute(test, retryWhen: ex => ex is XunitException); + } + else + { + test(); + } + } } }