diff --git a/src/VirtualClient/VirtualClient.Common.UnitTests/ProcessProxyTests.cs b/src/VirtualClient/VirtualClient.Common.UnitTests/ProcessProxyTests.cs index 3f655f274e..3f043b0906 100644 --- a/src/VirtualClient/VirtualClient.Common.UnitTests/ProcessProxyTests.cs +++ b/src/VirtualClient/VirtualClient.Common.UnitTests/ProcessProxyTests.cs @@ -116,5 +116,34 @@ public async Task ProcessProxyExitTimesAreNotAffectedByTheProcessHavingBeenDispo DateTime exitTime = process.ExitTime; Assert.IsTrue(exitTime != DateTime.MinValue); } + + [Test] + public async Task ProcessProxyWaitForExitAsyncHandlesTimeoutExceptionAsExpected() + { + IProcessProxy process = null; + ProcessStartInfo startInfo = new ProcessStartInfo + { + FileName = "ping", + Arguments = "localhost -n 2", // This will run for about 2 seconds + CreateNoWindow = true, + UseShellExecute = false, + RedirectStandardError = true, + RedirectStandardOutput = true + }; + + using (process = new ProcessProxy(new Process { StartInfo = startInfo })) + { + // Test Case 1: When timeout is null, no TimeoutException should be thrown + // The process will complete normally + await process.StartAndWaitAsync(CancellationToken.None); + Assert.IsTrue(process.HasExited); + + // Test Case 2: When timeout is specified and process takes longer, TimeoutException should be caught + process = new ProcessProxy(new Process { StartInfo = startInfo }); + await process.StartAndWaitAsync(CancellationToken.None, TimeSpan.FromMilliseconds(100)); + // If we get here, the TimeoutException was caught as expected + Assert.IsTrue(true); + } + } } } diff --git a/src/VirtualClient/VirtualClient.Common/ProcessProxy.cs b/src/VirtualClient/VirtualClient.Common/ProcessProxy.cs index 51b8e4384c..10923f9183 100644 --- a/src/VirtualClient/VirtualClient.Common/ProcessProxy.cs +++ b/src/VirtualClient/VirtualClient.Common/ProcessProxy.cs @@ -365,6 +365,10 @@ public virtual async Task WaitForExitAsync(CancellationToken cancellationToken, { // Expected whenever the CancellationToken receives a cancellation request. } + catch (TimeoutException) when (timeout != null) + { + // Expected timeout when timeout was specified. + } finally { this.exitTime = DateTime.UtcNow;