summaryrefslogtreecommitdiff
path: root/tests/Agent.Core.Tests/PersistentMcpTaskStoreTests.cs
blob: 2b43459357dd616a6fe661551e1900e566a3038b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System.Text.Json;
using Agent.Mcp;
using ModelContextProtocol.Extensions.Tasks;

namespace Agent.Core.Tests;

public sealed class PersistentMcpTaskStoreTests
{
    [Fact]
    public async Task Persists_terminal_task_and_marks_incomplete_task_failed_after_restart()
    {
        using var directory = new TestDirectory();
        var settings = new McpTaskStoreSettings(directory.Path, TimeSpan.FromHours(24), 1000);
        var first = new PersistentMcpTaskStore(settings);
        McpTaskInfo completed = await first.CreateTaskAsync(TestContext.Current.CancellationToken);
        await first.SetCompletedAsync(completed.TaskId, JsonSerializer.SerializeToElement(new { ok = true }), TestContext.Current.CancellationToken);
        McpTaskInfo working = await first.CreateTaskAsync(TestContext.Current.CancellationToken);

        var recovered = new PersistentMcpTaskStore(settings);
        Assert.Equal(McpTaskStatus.Completed, (await recovered.GetTaskAsync(completed.TaskId, TestContext.Current.CancellationToken))!.Status);
        McpTaskInfo failed = (await recovered.GetTaskAsync(working.TaskId, TestContext.Current.CancellationToken))!;
        Assert.Equal(McpTaskStatus.Failed, failed.Status);
        Assert.Equal("server_restarted", failed.StatusMessage);
    }

    [Fact]
    public async Task Expired_task_is_removed()
    {
        using var directory = new TestDirectory();
        var store = new PersistentMcpTaskStore(new McpTaskStoreSettings(directory.Path, TimeSpan.FromMilliseconds(1), 1000));
        McpTaskInfo task = await store.CreateTaskAsync(TestContext.Current.CancellationToken);
        await Task.Delay(20, TestContext.Current.CancellationToken);
        Assert.Null(await store.GetTaskAsync(task.TaskId, TestContext.Current.CancellationToken));
        Assert.Empty(Directory.EnumerateFiles(directory.Path, "*.json"));
    }
}