From daa555167cf0acf9b0a9681fdea1d056fb580f49 Mon Sep 17 00:00:00 2001
From: Fernando Andreu <2480661+fernandreu@users.noreply.github.com>
Date: Sat, 22 Feb 2020 13:09:45 +0000
Subject: [PATCH 1/3] Ensure Process.MainWindowHandle is refreshed
This will set _haveMainWindow to true only if
_mainWindowHandle is non-zero. It also forces
the latter to be reset during a Process.Refresh()
call, hence allowing the re-evaluation of both.
Fix #32690
---
.../src/System/Diagnostics/Process.Win32.cs | 2 +-
.../src/System/Diagnostics/Process.Windows.cs | 1 +
.../tests/ProcessTests.cs | 32 +++++++++++++++++++
3 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs
index 4f2f6acbc22fb7..565b02ea19e056 100644
--- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs
+++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Win32.cs
@@ -243,7 +243,7 @@ public IntPtr MainWindowHandle
EnsureState(State.IsLocal | State.HaveId);
_mainWindowHandle = ProcessManager.GetMainWindowHandle(_processId);
- _haveMainWindow = true;
+ _haveMainWindow = _mainWindowHandle != IntPtr.Zero;
}
return _mainWindowHandle;
}
diff --git a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs
index 99ac93fd33bc61..b8a3bb1339f70c 100644
--- a/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs
+++ b/src/libraries/System.Diagnostics.Process/src/System/Diagnostics/Process.Windows.cs
@@ -116,6 +116,7 @@ public void Kill()
private void RefreshCore()
{
_signaled = false;
+ _haveMainWindow = false;
}
/// Additional logic invoked when the Process is closed.
diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs
index 4573c160d182b6..1335b4c7d122d3 100644
--- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs
+++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs
@@ -1509,6 +1509,38 @@ public void MainWindowHandle_GetNotStarted_ThrowsInvalidOperationException()
var process = new Process();
Assert.Throws(() => process.MainWindowHandle);
}
+
+ [Fact(Skip = "Manual test")]
+ [PlatformSpecific(TestPlatforms.Windows)]
+ public void MainWindowHandle_GetWithGui_ShouldRefresh_Windows()
+ {
+ const string exePath = "notepad.exe";
+ Assert.True(IsProgramInstalled(exePath));
+
+ using (Process process = Process.Start(exePath))
+ {
+ try
+ {
+ for (int attempt = 0; attempt < 50; ++attempt)
+ {
+ process.Refresh();
+ if (process.MainWindowHandle != IntPtr.Zero)
+ {
+ break;
+ }
+
+ Thread.Sleep(100);
+ }
+
+ Assert.NotEqual(IntPtr.Zero, process.MainWindowHandle);
+ }
+ finally
+ {
+ process.Kill();
+ Assert.True(process.WaitForExit(WaitInMS));
+ }
+ }
+ }
[Fact]
public void MainWindowTitle_NoWindow_ReturnsEmpty()
From 2983c5eb7cf5605337a5a8ad7104a917bfd061c6 Mon Sep 17 00:00:00 2001
From: Fernando Andreu <2480661+fernandreu@users.noreply.github.com>
Date: Mon, 24 Feb 2020 22:50:40 +0000
Subject: [PATCH 2/3] Mark test for local outerloop testing only
---
.../System.Diagnostics.Process/tests/ProcessTests.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs
index 1335b4c7d122d3..d8cda6f8a48903 100644
--- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs
+++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs
@@ -15,6 +15,7 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.DotNet.RemoteExecutor;
+using Microsoft.DotNet.XUnitExtensions;
using Microsoft.Win32.SafeHandles;
using Xunit;
using Xunit.Sdk;
@@ -1510,7 +1511,9 @@ public void MainWindowHandle_GetNotStarted_ThrowsInvalidOperationException()
Assert.Throws(() => process.MainWindowHandle);
}
- [Fact(Skip = "Manual test")]
+ [Fact]
+ [OuterLoop]
+ [Trait(XunitConstants.Category, XunitConstants.IgnoreForCI)] // Pops UI
[PlatformSpecific(TestPlatforms.Windows)]
public void MainWindowHandle_GetWithGui_ShouldRefresh_Windows()
{
From e68afbfd8708aaba116172c565db86d295571738 Mon Sep 17 00:00:00 2001
From: Fernando Andreu <2480661+fernandreu@users.noreply.github.com>
Date: Sat, 29 Feb 2020 09:01:05 +0000
Subject: [PATCH 3/3] Rename exePath constant to ExePath
---
.../System.Diagnostics.Process/tests/ProcessTests.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs
index d8cda6f8a48903..9c764672bf097d 100644
--- a/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs
+++ b/src/libraries/System.Diagnostics.Process/tests/ProcessTests.cs
@@ -1517,10 +1517,10 @@ public void MainWindowHandle_GetNotStarted_ThrowsInvalidOperationException()
[PlatformSpecific(TestPlatforms.Windows)]
public void MainWindowHandle_GetWithGui_ShouldRefresh_Windows()
{
- const string exePath = "notepad.exe";
- Assert.True(IsProgramInstalled(exePath));
+ const string ExePath = "notepad.exe";
+ Assert.True(IsProgramInstalled(ExePath));
- using (Process process = Process.Start(exePath))
+ using (Process process = Process.Start(ExePath))
{
try
{