summaryrefslogtreecommitdiff
path: root/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/Agent.Core.Tests/PromptAndRuntimeTests.cs')
-rw-r--r--tests/Agent.Core.Tests/PromptAndRuntimeTests.cs35
1 files changed, 35 insertions, 0 deletions
diff --git a/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs b/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs
index b7f27e7..04a9714 100644
--- a/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs
+++ b/tests/Agent.Core.Tests/PromptAndRuntimeTests.cs
@@ -205,6 +205,27 @@ public sealed class PromptAndRuntimeTests
}
[Fact]
+ public async Task Elevation_failure_is_terminal_for_the_task_without_policy_replanning()
+ {
+ TaskRegistry registry = new();
+ var backend = new PlatformFailingBackend();
+ var dispatcher = new InternalToolDispatcher(
+ new DenyByDefaultPolicy(new HashSet<string>(["process_run"], StringComparer.Ordinal)), backend);
+ var runtime = new AgentRuntime(registry, new FailingThenFinalOllamaClient(),
+ new AgentRuntimeSettings("", "en", [], "sandbox", MaxIterations: 10, SameFailureLimit: 2), dispatcher);
+ TaskSnapshot task = registry.Enqueue("run build", null, null);
+ registry.Transition(task.TaskId, AgentTaskState.Planning);
+
+ await runtime.ExecuteAsync(task.TaskId, TestContext.Current.CancellationToken);
+
+ Assert.True(registry.TryGet(task.TaskId, null, out TaskSnapshot? failed));
+ Assert.Equal(AgentTaskState.Failed, failed!.State);
+ Assert.Equal(0, failed.Replans);
+ Assert.Equal("sandbox.elevation_cancelled", failed.LastErrorCode);
+ Assert.Equal(1, backend.CallCount);
+ }
+
+ [Fact]
public async Task Runtime_does_not_retry_a_sandbox_policy_denial()
{
TaskRegistry registry = new();
@@ -577,6 +598,20 @@ public sealed class PromptAndRuntimeTests
public Task EndTaskAsync(Guid taskId, bool success, CancellationToken cancellationToken) => Task.CompletedTask;
}
+ private sealed class PlatformFailingBackend : IInternalToolBackend
+ {
+ public int CallCount { get; private set; }
+ public Task BeginTaskAsync(Guid taskId, Guid sessionId, CancellationToken cancellationToken) => Task.CompletedTask;
+ public Task<ToolExecutionResult> ExecuteAsync(Guid taskId, string toolName, JsonElement arguments, CancellationToken cancellationToken)
+ {
+ CallCount++;
+ return Task.FromResult(new ToolExecutionResult(false, "The Windows elevation request was cancelled.", false,
+ "process_run:sandbox.elevation_cancelled", RetryAllowed: false,
+ ErrorCode: "sandbox.elevation_cancelled", ErrorCategory: "platform"));
+ }
+ public Task EndTaskAsync(Guid taskId, bool success, CancellationToken cancellationToken) => Task.CompletedTask;
+ }
+
private sealed class FailingThenFinalOllamaClient : IOllamaClient
{
private int _calls;