From 1b4132ec90c9d86cb201ef01b8a03807e5e6fd3a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 8 Nov 2025 00:48:35 +0000 Subject: [PATCH 1/3] Initial plan From 1e87bab389edee6e7ec296385c0c6d0b84492eec Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 8 Nov 2025 01:34:23 +0000 Subject: [PATCH 2/3] Fix process cleanup timeout for no-hot-reload mode Co-authored-by: tmat <41759+tmat@users.noreply.github.com> --- .../CommandLine/EnvironmentOptions.cs | 5 ++- .../CommandLine/EnvironmentOptionsTests.cs | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/BuiltInTools/dotnet-watch/CommandLine/EnvironmentOptions.cs b/src/BuiltInTools/dotnet-watch/CommandLine/EnvironmentOptions.cs index d0e84844de86..494850d75858 100644 --- a/src/BuiltInTools/dotnet-watch/CommandLine/EnvironmentOptions.cs +++ b/src/BuiltInTools/dotnet-watch/CommandLine/EnvironmentOptions.cs @@ -61,9 +61,8 @@ internal sealed record EnvironmentOptions( ); public TimeSpan GetProcessCleanupTimeout(bool isHotReloadEnabled) - // If Hot Reload mode is disabled the process is restarted on every file change. - // Waiting for graceful termination would slow down the turn around. - => ProcessCleanupTimeout ?? (isHotReloadEnabled ? TimeSpan.FromSeconds(5) : TimeSpan.FromSeconds(0)); + // Allow sufficient time for the process to exit gracefully and release resources (e.g., network ports). + => ProcessCleanupTimeout ?? TimeSpan.FromSeconds(5); private int _uniqueLogId; diff --git a/test/dotnet-watch.Tests/CommandLine/EnvironmentOptionsTests.cs b/test/dotnet-watch.Tests/CommandLine/EnvironmentOptionsTests.cs index 27183b421d49..0501503eb2c9 100644 --- a/test/dotnet-watch.Tests/CommandLine/EnvironmentOptionsTests.cs +++ b/test/dotnet-watch.Tests/CommandLine/EnvironmentOptionsTests.cs @@ -3,6 +3,40 @@ namespace Microsoft.DotNet.Watch.UnitTests; +public class EnvironmentOptionsTests +{ + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GetProcessCleanupTimeout_WithoutEnvironmentVariable_ReturnsDefaultTimeout(bool isHotReloadEnabled) + { + var envOptions = new EnvironmentOptions( + WorkingDirectory: "/test", + MuxerPath: "dotnet", + ProcessCleanupTimeout: null); + + var timeout = envOptions.GetProcessCleanupTimeout(isHotReloadEnabled); + + Assert.Equal(TimeSpan.FromSeconds(5), timeout); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void GetProcessCleanupTimeout_WithEnvironmentVariable_ReturnsSpecifiedTimeout(bool isHotReloadEnabled) + { + var customTimeout = TimeSpan.FromSeconds(10); + var envOptions = new EnvironmentOptions( + WorkingDirectory: "/test", + MuxerPath: "dotnet", + ProcessCleanupTimeout: customTimeout); + + var timeout = envOptions.GetProcessCleanupTimeout(isHotReloadEnabled); + + Assert.Equal(customTimeout, timeout); + } +} + public class BuildReporterTests { [Fact] From e530eaa4e6ca0902be18d39fba212987abf65c53 Mon Sep 17 00:00:00 2001 From: Tomas Matousek Date: Wed, 12 Nov 2025 09:20:18 -0800 Subject: [PATCH 3/3] Enable tests --- test/dotnet-watch.Tests/HotReload/ApplyDeltaTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/dotnet-watch.Tests/HotReload/ApplyDeltaTests.cs b/test/dotnet-watch.Tests/HotReload/ApplyDeltaTests.cs index 833b2bc5a6c8..e0d8369d652b 100644 --- a/test/dotnet-watch.Tests/HotReload/ApplyDeltaTests.cs +++ b/test/dotnet-watch.Tests/HotReload/ApplyDeltaTests.cs @@ -969,7 +969,7 @@ public async Task BlazorWasmHosted() App.AssertOutputContains($"dotnet watch ⌚ [blazorhosted ({tfm})] Capabilities: 'Baseline AddMethodToExistingType AddStaticFieldToExistingType AddInstanceFieldToExistingType NewTypeDefinition ChangeCustomAttributes UpdateParameters GenericUpdateMethod GenericAddMethodToExistingType GenericAddFieldToExistingType AddFieldRva'"); } - [PlatformSpecificFact(TestPlatforms.Windows)] // https://github.com/dotnet/aspnetcore/issues/63759 + [Fact] public async Task Razor_Component_ScopedCssAndStaticAssets() { var testAsset = TestAssets.CopyTestAsset("WatchRazorWithDeps") @@ -1017,7 +1017,7 @@ public async Task Razor_Component_ScopedCssAndStaticAssets() /// Currently only works on Windows. /// Add TestPlatforms.OSX once https://github.com/dotnet/sdk/issues/45521 is fixed. /// - [PlatformSpecificFact(TestPlatforms.Windows, Skip = "https://github.com/dotnet/sdk/issues/40006")] + [PlatformSpecificFact(TestPlatforms.Windows)] public async Task MauiBlazor() { var testAsset = TestAssets.CopyTestAsset("WatchMauiBlazor")