diff --git a/tests/Common/Utils/TestConstants.cs b/tests/Common/Utils/TestConstants.cs
new file mode 100644
index 000000000..eae9a54b1
--- /dev/null
+++ b/tests/Common/Utils/TestConstants.cs
@@ -0,0 +1,13 @@
+namespace ModelContextProtocol.Tests.Utils;
+
+///
+/// Provides centralized constants for tests
+///
+public static class TestConstants
+{
+ ///
+ /// Default timeout for test operations that may be affected by CI machine load.
+ /// Set to 60 seconds to provide sufficient buffer for slow CI environments.
+ ///
+ public static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(60);
+}
diff --git a/tests/ModelContextProtocol.AspNetCore.Tests/MapMcpStreamableHttpTests.cs b/tests/ModelContextProtocol.AspNetCore.Tests/MapMcpStreamableHttpTests.cs
index 0629ae338..8f04cbe8b 100644
--- a/tests/ModelContextProtocol.AspNetCore.Tests/MapMcpStreamableHttpTests.cs
+++ b/tests/ModelContextProtocol.AspNetCore.Tests/MapMcpStreamableHttpTests.cs
@@ -4,6 +4,7 @@
using ModelContextProtocol.Client;
using ModelContextProtocol.Protocol;
using ModelContextProtocol.Server;
+using ModelContextProtocol.Tests.Utils;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
@@ -251,7 +252,7 @@ public async Task CanResumeSessionWithMapMcpAndRunSessionHandler()
Assert.NotNull(serverInfo);
Assert.False(string.IsNullOrEmpty(resumedSessionId));
- await serverTcs.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await serverTcs.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
await using var resumeTransport = new HttpClientTransport(new()
{
diff --git a/tests/ModelContextProtocol.AspNetCore.Tests/ResumabilityIntegrationTests.cs b/tests/ModelContextProtocol.AspNetCore.Tests/ResumabilityIntegrationTests.cs
index f6c8f3a92..5f83e0541 100644
--- a/tests/ModelContextProtocol.AspNetCore.Tests/ResumabilityIntegrationTests.cs
+++ b/tests/ModelContextProtocol.AspNetCore.Tests/ResumabilityIntegrationTests.cs
@@ -10,6 +10,7 @@
using ModelContextProtocol.Client;
using ModelContextProtocol.Protocol;
using ModelContextProtocol.Server;
+using ModelContextProtocol.Tests.Utils;
namespace ModelContextProtocol.AspNetCore.Tests;
@@ -279,7 +280,7 @@ public async Task Client_CanResumePostResponseStream_AfterDisconnection()
[Fact]
public async Task Client_CanResumeUnsolicitedMessageStream_AfterDisconnection()
{
- var timeout = TimeSpan.FromSeconds(10);
+ var timeout = TestConstants.DefaultTimeout;
using var faultingStreamHandler = new FaultingStreamHandler()
{
InnerHandler = SocketsHttpHandler,
diff --git a/tests/ModelContextProtocol.AspNetCore.Tests/ServerConformanceTests.cs b/tests/ModelContextProtocol.AspNetCore.Tests/ServerConformanceTests.cs
index 3948ad19a..031a67a18 100644
--- a/tests/ModelContextProtocol.AspNetCore.Tests/ServerConformanceTests.cs
+++ b/tests/ModelContextProtocol.AspNetCore.Tests/ServerConformanceTests.cs
@@ -83,7 +83,7 @@ public async ValueTask DisposeAsync()
{
try
{
- await _serverTask.WaitAsync(TimeSpan.FromSeconds(5));
+ await _serverTask.WaitAsync(TestConstants.DefaultTimeout);
}
catch
{
diff --git a/tests/ModelContextProtocol.AspNetCore.Tests/SseIntegrationTests.cs b/tests/ModelContextProtocol.AspNetCore.Tests/SseIntegrationTests.cs
index 1a48cc86b..11df047fb 100644
--- a/tests/ModelContextProtocol.AspNetCore.Tests/SseIntegrationTests.cs
+++ b/tests/ModelContextProtocol.AspNetCore.Tests/SseIntegrationTests.cs
@@ -8,6 +8,7 @@
using ModelContextProtocol.Client;
using ModelContextProtocol.Protocol;
using ModelContextProtocol.Server;
+using ModelContextProtocol.Tests.Utils;
using System.Text.Json.Serialization;
using TestServerWithHosting.Tools;
@@ -110,7 +111,7 @@ public async Task ConnectAndReceiveNotification_InMemoryServer()
// Send a test message through POST endpoint
await mcpClient.SendNotificationAsync("test/notification", new Envelope { Message = "Hello from client!" }, serializerOptions: JsonContext.Default.Options, cancellationToken: TestContext.Current.CancellationToken);
- var message = await receivedNotification.Task.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken);
+ var message = await receivedNotification.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
Assert.Equal("Hello from server!", message);
}
diff --git a/tests/ModelContextProtocol.AspNetCore.Tests/StreamableHttpClientConformanceTests.cs b/tests/ModelContextProtocol.AspNetCore.Tests/StreamableHttpClientConformanceTests.cs
index e4ee2a1d2..4cf7b710a 100644
--- a/tests/ModelContextProtocol.AspNetCore.Tests/StreamableHttpClientConformanceTests.cs
+++ b/tests/ModelContextProtocol.AspNetCore.Tests/StreamableHttpClientConformanceTests.cs
@@ -6,6 +6,7 @@
using ModelContextProtocol.Client;
using ModelContextProtocol.Protocol;
using ModelContextProtocol.Server;
+using ModelContextProtocol.Tests.Utils;
using System.Threading;
using System.Threading.Tasks;
using System.Text.Json;
@@ -245,7 +246,7 @@ public async Task ResumeSessionStartsGetImmediately()
loggerFactory: LoggerFactory,
cancellationToken: TestContext.Current.CancellationToken))
{
- var observedSessionId = await resumeServer.GetStarted.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ var observedSessionId = await resumeServer.GetStarted.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
Assert.Equal(sessionId, observedSessionId);
var tools = await client.ListToolsAsync(cancellationToken: TestContext.Current.CancellationToken);
diff --git a/tests/ModelContextProtocol.AspNetCore.Tests/StreamableHttpServerConformanceTests.cs b/tests/ModelContextProtocol.AspNetCore.Tests/StreamableHttpServerConformanceTests.cs
index a6b0fc70e..c6d5766da 100644
--- a/tests/ModelContextProtocol.AspNetCore.Tests/StreamableHttpServerConformanceTests.cs
+++ b/tests/ModelContextProtocol.AspNetCore.Tests/StreamableHttpServerConformanceTests.cs
@@ -249,7 +249,7 @@ public async Task MultipleConcurrentJsonRpcRequests_IsHandled_InParallel()
await Task.WhenAll(echoTasks);
}
- [Fact]
+ [Fact(Skip = "https://github.com/modelcontextprotocol/csharp-sdk/issues/1211")]
public async Task GetRequest_Receives_UnsolicitedNotifications()
{
McpServer? server = null;
diff --git a/tests/ModelContextProtocol.Tests/Client/McpClientResourceSubscriptionTests.cs b/tests/ModelContextProtocol.Tests/Client/McpClientResourceSubscriptionTests.cs
index 84ee33f34..2ee3cec26 100644
--- a/tests/ModelContextProtocol.Tests/Client/McpClientResourceSubscriptionTests.cs
+++ b/tests/ModelContextProtocol.Tests/Client/McpClientResourceSubscriptionTests.cs
@@ -2,6 +2,7 @@
using ModelContextProtocol.Client;
using ModelContextProtocol.Protocol;
using ModelContextProtocol.Server;
+using ModelContextProtocol.Tests.Utils;
using System.ComponentModel;
namespace ModelContextProtocol.Tests.Client;
@@ -50,7 +51,7 @@ await Server.SendNotificationAsync(
cancellationToken: TestContext.Current.CancellationToken);
// Assert
- using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
+ using var cts = new CancellationTokenSource(TestConstants.DefaultTimeout);
var receivedNotification = await notificationReceived.Task.WaitAsync(cts.Token);
Assert.NotNull(receivedNotification);
Assert.Equal(resourceUri, receivedNotification.Uri);
@@ -92,7 +93,7 @@ await Server.SendNotificationAsync(
cancellationToken: TestContext.Current.CancellationToken);
// Assert
- using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
+ using var cts = new CancellationTokenSource(TestConstants.DefaultTimeout);
await correctNotificationReceived.Task.WaitAsync(cts.Token);
// Give a small delay to ensure no other notifications are processed
@@ -168,7 +169,7 @@ await Server.SendNotificationAsync(
cancellationToken: TestContext.Current.CancellationToken);
// Assert
- using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
+ using var cts = new CancellationTokenSource(TestConstants.DefaultTimeout);
var receivedNotification = await notificationReceived.Task.WaitAsync(cts.Token);
Assert.NotNull(receivedNotification);
Assert.Equal(resourceUri.AbsoluteUri, receivedNotification.Uri);
@@ -263,7 +264,7 @@ await Server.SendNotificationAsync(
cancellationToken: TestContext.Current.CancellationToken);
// Assert
- using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
+ using var cts = new CancellationTokenSource(TestConstants.DefaultTimeout);
var combined = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, TestContext.Current.CancellationToken);
await Task.WhenAll(
notification1Received.Task.WaitAsync(combined.Token),
@@ -341,7 +342,7 @@ await Server.SendNotificationAsync(
cancellationToken: TestContext.Current.CancellationToken);
// Assert - Both handlers should be invoked
- using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
+ using var cts = new CancellationTokenSource(TestConstants.DefaultTimeout);
var combined = CancellationTokenSource.CreateLinkedTokenSource(cts.Token, TestContext.Current.CancellationToken);
await Task.WhenAll(
handler1Called.Task.WaitAsync(combined.Token),
@@ -360,7 +361,7 @@ await Server.SendNotificationAsync(
cancellationToken: TestContext.Current.CancellationToken);
// Wait for handler2 to be called again
- using var cts2 = new CancellationTokenSource(TimeSpan.FromSeconds(5));
+ using var cts2 = new CancellationTokenSource(TestConstants.DefaultTimeout);
var combined2 = CancellationTokenSource.CreateLinkedTokenSource(cts2.Token, TestContext.Current.CancellationToken);
await handler2CalledAgain.Task.WaitAsync(combined2.Token);
diff --git a/tests/ModelContextProtocol.Tests/Client/McpClientTaskSamplingElicitationTests.cs b/tests/ModelContextProtocol.Tests/Client/McpClientTaskSamplingElicitationTests.cs
index f000fc0f0..906b4f491 100644
--- a/tests/ModelContextProtocol.Tests/Client/McpClientTaskSamplingElicitationTests.cs
+++ b/tests/ModelContextProtocol.Tests/Client/McpClientTaskSamplingElicitationTests.cs
@@ -2,6 +2,7 @@
using ModelContextProtocol.Client;
using ModelContextProtocol.Protocol;
using ModelContextProtocol.Server;
+using ModelContextProtocol.Tests.Utils;
using System.Text.Json;
namespace ModelContextProtocol.Tests.Client;
@@ -219,7 +220,7 @@ public async Task Client_WithTaskStore_CanExecuteSamplingAsTask()
Assert.Equal(McpTaskStatus.Working, mcpTask.Status);
// Wait for sampling to complete
- await samplingCompleted.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await samplingCompleted.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
// Poll until task is complete
McpTask taskStatus;
@@ -375,7 +376,7 @@ public async Task Client_WithTaskStore_CanExecuteElicitationAsTask()
Assert.Equal(McpTaskStatus.Working, mcpTask.Status);
// Wait for elicitation to complete
- await elicitationCompleted.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await elicitationCompleted.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
// Poll until task is complete
McpTask taskStatus;
@@ -488,7 +489,7 @@ public async Task Client_CanCancelTasks()
TestContext.Current.CancellationToken);
// Wait for sampling to start
- await samplingStarted.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await samplingStarted.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
// Act - Cancel the task
var cancelledTask = await Server.CancelTaskAsync(mcpTask.TaskId, TestContext.Current.CancellationToken);
@@ -600,8 +601,8 @@ public async Task Client_TaskStatusNotifications_SentWhenEnabled()
// Wait for both Working and Completed notifications to arrive
// The notifications are sent asynchronously so we need to wait for both
await Task.WhenAll(
- workingNotificationReceived.Task.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken),
- completedNotificationReceived.Task.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken));
+ workingNotificationReceived.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken),
+ completedNotificationReceived.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken));
// Assert - Should have received notifications for status transitions
await notificationHandler.DisposeAsync();
@@ -653,7 +654,7 @@ public async Task Client_SamplingHandlerException_ResultsInFailedTask()
TestContext.Current.CancellationToken);
// Wait for sampling attempt
- await samplingAttempted.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await samplingAttempted.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
// Poll until task status changes
McpTask taskStatus;
@@ -703,7 +704,7 @@ public async Task Client_ElicitationHandlerException_ResultsInFailedTask()
TestContext.Current.CancellationToken);
// Wait for elicitation attempt
- await elicitationAttempted.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await elicitationAttempted.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
// Poll until task status changes
McpTask taskStatus;
diff --git a/tests/ModelContextProtocol.Tests/Protocol/UrlElicitationTests.cs b/tests/ModelContextProtocol.Tests/Protocol/UrlElicitationTests.cs
index 4291383c1..bf4c67d21 100644
--- a/tests/ModelContextProtocol.Tests/Protocol/UrlElicitationTests.cs
+++ b/tests/ModelContextProtocol.Tests/Protocol/UrlElicitationTests.cs
@@ -2,6 +2,7 @@
using Microsoft.Extensions.DependencyInjection;
using ModelContextProtocol.Client;
using ModelContextProtocol.Protocol;
+using ModelContextProtocol.Tests.Utils;
namespace ModelContextProtocol.Tests.Configuration;
@@ -275,7 +276,7 @@ public async Task Can_Elicit_OutOfBand_With_Url()
Assert.NotNull(capturedMessage);
Assert.Contains(capturedElicitationId, capturedUrl);
- var notifiedElicitationId = await completionNotification.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ var notifiedElicitationId = await completionNotification.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
Assert.Equal(capturedElicitationId, notifiedElicitationId);
}
diff --git a/tests/ModelContextProtocol.Tests/Server/AutomaticInputRequiredStatusTests.cs b/tests/ModelContextProtocol.Tests/Server/AutomaticInputRequiredStatusTests.cs
index 2cee9206f..788e56c50 100644
--- a/tests/ModelContextProtocol.Tests/Server/AutomaticInputRequiredStatusTests.cs
+++ b/tests/ModelContextProtocol.Tests/Server/AutomaticInputRequiredStatusTests.cs
@@ -95,7 +95,7 @@ public async Task TaskStatus_TransitionsToInputRequired_DuringSampleAsync()
cancellationToken: TestContext.Current.CancellationToken);
// Wait for the sampling request to be received by the client
- await samplingRequestReceived.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await samplingRequestReceived.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
// Check the task status while sampling is in progress
var statusDuringSampling = await taskStore.GetTaskAsync(
@@ -194,7 +194,7 @@ public async Task TaskStatus_TransitionsToInputRequired_DuringElicitAsync()
cancellationToken: TestContext.Current.CancellationToken);
// Wait for the elicitation request to be received
- await elicitationRequestReceived.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await elicitationRequestReceived.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
// Check the task status while elicitation is in progress
var statusDuringElicitation = await taskStore.GetTaskAsync(
@@ -301,7 +301,7 @@ public async Task TaskStatus_ReturnsToWorking_AfterSamplingCompletes()
cancellationToken: TestContext.Current.CancellationToken);
// Wait for sampling to complete inside the tool
- await samplingCompleted.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await samplingCompleted.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
// Small delay to ensure status update is processed
await Task.Delay(50, TestContext.Current.CancellationToken);
@@ -380,7 +380,7 @@ public async Task TaskStatus_DoesNotChangeToInputRequired_ForNonTaskExecution()
arguments: new Dictionary { ["prompt"] = "Hello" },
cancellationToken: TestContext.Current.CancellationToken);
- await samplingCompleted.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await samplingCompleted.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
// Assert - No task should exist (tool was not called as a task)
var tasks = await taskStore.ListTasksAsync(cancellationToken: TestContext.Current.CancellationToken);
diff --git a/tests/ModelContextProtocol.Tests/Server/McpServerTaskMethodsTests.cs b/tests/ModelContextProtocol.Tests/Server/McpServerTaskMethodsTests.cs
index 78a149c1b..d908bbb7f 100644
--- a/tests/ModelContextProtocol.Tests/Server/McpServerTaskMethodsTests.cs
+++ b/tests/ModelContextProtocol.Tests/Server/McpServerTaskMethodsTests.cs
@@ -755,7 +755,7 @@ private static async Task InitializeServerAsync(TestServerTransport transport, C
await transport.SendClientMessageAsync(initializeRequest, cancellationToken);
// Wait for the initialize response to be sent
- await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5), cancellationToken);
+ await tcs.Task.WaitAsync(TestConstants.DefaultTimeout, cancellationToken);
}
#endregion
diff --git a/tests/ModelContextProtocol.Tests/Server/McpServerTests.cs b/tests/ModelContextProtocol.Tests/Server/McpServerTests.cs
index 4a52d64f8..637162962 100644
--- a/tests/ModelContextProtocol.Tests/Server/McpServerTests.cs
+++ b/tests/ModelContextProtocol.Tests/Server/McpServerTests.cs
@@ -692,7 +692,7 @@ await transport.SendMessageAsync(
TestContext.Current.CancellationToken
);
- var error = await receivedMessage.Task.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken);
+ var error = await receivedMessage.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
Assert.NotNull(error);
Assert.NotNull(error.Error);
Assert.Equal((int)errorCode, error.Error.Code);
@@ -744,7 +744,7 @@ await transport.SendMessageAsync(
TestContext.Current.CancellationToken
);
- var error = await receivedMessage.Task.WaitAsync(TimeSpan.FromSeconds(10), TestContext.Current.CancellationToken);
+ var error = await receivedMessage.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
Assert.NotNull(error);
Assert.NotNull(error.Error);
Assert.Equal((int)ErrorCode, error.Error.Code);
@@ -786,7 +786,7 @@ await transport.SendMessageAsync(
}
);
- var response = await receivedMessage.Task.WaitAsync(TimeSpan.FromSeconds(10));
+ var response = await receivedMessage.Task.WaitAsync(TestConstants.DefaultTimeout);
Assert.NotNull(response);
assertResult(server, response.Result);
@@ -887,7 +887,7 @@ private static async Task InitializeServerAsync(TestServerTransport transport, C
await transport.SendClientMessageAsync(initializeRequest, cancellationToken);
// Wait for the initialize response to be sent
- await tcs.Task.WaitAsync(TimeSpan.FromSeconds(5), cancellationToken);
+ await tcs.Task.WaitAsync(TestConstants.DefaultTimeout, cancellationToken);
}
private sealed class TestServerForIChatClient(bool supportsSampling) : McpServer
diff --git a/tests/ModelContextProtocol.Tests/Server/TaskCancellationIntegrationTests.cs b/tests/ModelContextProtocol.Tests/Server/TaskCancellationIntegrationTests.cs
index ed8c5acad..ed3bf8298 100644
--- a/tests/ModelContextProtocol.Tests/Server/TaskCancellationIntegrationTests.cs
+++ b/tests/ModelContextProtocol.Tests/Server/TaskCancellationIntegrationTests.cs
@@ -2,6 +2,7 @@
using ModelContextProtocol.Client;
using ModelContextProtocol.Protocol;
using ModelContextProtocol.Server;
+using ModelContextProtocol.Tests.Utils;
using System.Text.Json;
namespace ModelContextProtocol.Tests.Server;
@@ -77,10 +78,10 @@ public async Task TaskTool_CancellationToken_FiresWhenTtlExpires()
Assert.NotNull(callResult.Task);
// Wait for the tool to start executing
- await _toolStarted.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await _toolStarted.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
// Assert - Wait for the cancellation to fire (should happen when TTL expires)
- var cancelled = await _toolCancellationFired.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ var cancelled = await _toolCancellationFired.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
Assert.True(cancelled, "Tool's CancellationToken should have been triggered when TTL expired");
// Note: TTL-based expiration does not explicitly set task status to Cancelled.
@@ -108,13 +109,13 @@ public async Task TaskTool_CancellationToken_FiresWhenExplicitlyCancelled()
string taskId = callResult.Task.TaskId;
// Wait for the tool to start executing
- await _toolStarted.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ await _toolStarted.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
// Act - Explicitly cancel the task
var cancelledTask = await client.CancelTaskAsync(taskId, cancellationToken: TestContext.Current.CancellationToken);
// Assert - Wait for the cancellation to propagate to the tool
- var cancelled = await _toolCancellationFired.Task.WaitAsync(TimeSpan.FromSeconds(5), TestContext.Current.CancellationToken);
+ var cancelled = await _toolCancellationFired.Task.WaitAsync(TestConstants.DefaultTimeout, TestContext.Current.CancellationToken);
Assert.True(cancelled, "Tool's CancellationToken should have been triggered by explicit cancellation");
// Verify task status
@@ -255,7 +256,7 @@ private Task WaitForStart(string marker, CancellationToken ct)
{
lock (_lock)
{
- return _toolStarts[marker].Task.WaitAsync(TimeSpan.FromSeconds(5), ct);
+ return _toolStarts[marker].Task.WaitAsync(TestConstants.DefaultTimeout, ct);
}
}
@@ -263,7 +264,7 @@ private Task WaitForCancellation(string marker, CancellationToken ct)
{
lock (_lock)
{
- return _toolCancellations[marker].Task.WaitAsync(TimeSpan.FromSeconds(5), ct);
+ return _toolCancellations[marker].Task.WaitAsync(TestConstants.DefaultTimeout, ct);
}
}