diff --git a/PolyShim.Tests/Net70/ProcessTests.cs b/PolyShim.Tests/Net70/ProcessTests.cs new file mode 100644 index 0000000..d3674c0 --- /dev/null +++ b/PolyShim.Tests/Net70/ProcessTests.cs @@ -0,0 +1,64 @@ +using System; +using System.Diagnostics; +using FluentAssertions; +using Xunit; + +namespace PolyShim.Tests.Net70; + +public class ProcessTests +{ + [Fact] + public void WaitForExit_TimeSpan_Test() + { + // Arrange + using var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = OperatingSystem.IsWindows() ? "cmd" : "sleep", + Arguments = OperatingSystem.IsWindows() ? "/c timeout 1" : "1", + CreateNoWindow = true, + UseShellExecute = false, + }, + }; + + process.Start(); + + // Act + var exited = process.WaitForExit(TimeSpan.FromSeconds(10)); + + // Assert + exited.Should().BeTrue(); + process.HasExited.Should().BeTrue(); + } + + [Fact] + public void WaitForExit_TimeSpan_Timeout_Test() + { + // Arrange + using var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = OperatingSystem.IsWindows() ? "cmd" : "sleep", + Arguments = OperatingSystem.IsWindows() ? "/c timeout 30 /nobreak" : "30", + CreateNoWindow = true, + UseShellExecute = false, + }, + }; + process.Start(); + + try + { + // Act + var exited = process.WaitForExit(TimeSpan.FromMilliseconds(100)); + + // Assert + exited.Should().BeFalse(); + } + finally + { + process.Kill(); + } + } +} diff --git a/PolyShim/Net70/Process.cs b/PolyShim/Net70/Process.cs new file mode 100644 index 0000000..c6b6762 --- /dev/null +++ b/PolyShim/Net70/Process.cs @@ -0,0 +1,29 @@ +#if FEATURE_PROCESS +#if (NETCOREAPP && !NET7_0_OR_GREATER) || (NETFRAMEWORK) || (NETSTANDARD) +#nullable enable +#pragma warning disable CS0436 + +using System; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; + +#if !POLYSHIM_INCLUDE_COVERAGE +[ExcludeFromCodeCoverage] +#endif +internal static class MemberPolyfills_Net70_Process +{ + extension(Process process) + { + // https://learn.microsoft.com/dotnet/api/system.diagnostics.process.waitforexit#system-diagnostics-process-waitforexit(system-timespan) + public bool WaitForExit(TimeSpan timeout) + { + var totalMilliseconds = (long)timeout.TotalMilliseconds; + if (totalMilliseconds < -1 || totalMilliseconds > int.MaxValue) + throw new ArgumentOutOfRangeException(nameof(timeout)); + + return process.WaitForExit((int)totalMilliseconds); + } + } +} +#endif +#endif diff --git a/Signatures.md b/Signatures.md index fd4079b..b4836ca 100644 --- a/Signatures.md +++ b/Signatures.md @@ -1,8 +1,8 @@ # Signatures -- **Total:** 487 +- **Total:** 488 - **Types:** 106 -- **Members:** 381 +- **Members:** 382 ___ @@ -369,6 +369,7 @@ ___ - [`static string Join(params string?[])`](https://learn.microsoft.com/dotnet/api/system.io.path.join#system-io-path-join(system-string())) .NET Core 3.0 - [`static string TrimEndingDirectorySeparator(string)`](https://learn.microsoft.com/dotnet/api/system.io.path.trimendingdirectoryseparator#system-io-path-trimendingdirectoryseparator(system-string)) .NET Core 3.0 - `Process` + - [`bool WaitForExit(TimeSpan)`](https://learn.microsoft.com/dotnet/api/system.diagnostics.process.waitforexit#system-diagnostics-process-waitforexit(system-timespan)) .NET 7.0 - [`Task WaitForExitAsync(CancellationToken)`](https://learn.microsoft.com/dotnet/api/system.diagnostics.process.waitforexitasync) .NET 5.0 - [`void Kill(bool)`](https://learn.microsoft.com/dotnet/api/system.diagnostics.process.kill#system-diagnostics-process-kill(system-boolean)) .NET Core 3.0 - `Queue`