From e2a8baa9e1f5d2ea9b88ef44c72142aca427efc5 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 16 Aug 2026 20:07:39 +0000
Subject: [PATCH 1/2] Fix app-first retry port overrides
Co-authored-by: WhitWaldo <2238529+WhitWaldo@users.noreply.github.com>
---
src/Dapr.Testcontainers/Harnesses/BaseHarness.cs | 4 ++--
.../Harnesses/StartupOrderTests.cs | 7 ++++++-
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/src/Dapr.Testcontainers/Harnesses/BaseHarness.cs b/src/Dapr.Testcontainers/Harnesses/BaseHarness.cs
index 50c361c8a..5d5d9cae2 100644
--- a/src/Dapr.Testcontainers/Harnesses/BaseHarness.cs
+++ b/src/Dapr.Testcontainers/Harnesses/BaseHarness.cs
@@ -49,11 +49,11 @@ public abstract class BaseHarness : IAsyncContainerFixture
///
/// The HTTP port used by the Daprd container.
///
- public int DaprHttpPort => _daprd?.HttpPort ?? _daprHttpPortOverride ?? 0;
+ public int DaprHttpPort => _daprHttpPortOverride ?? _daprd?.HttpPort ?? 0;
///
/// The gRPC port used by the Daprd container.
///
- public int DaprGrpcPort => _daprd?.GrpcPort ?? _daprGrpcPortOverride ?? 0;
+ public int DaprGrpcPort => _daprGrpcPortOverride ?? _daprd?.GrpcPort ?? 0;
private readonly string componentsDirectory;
private readonly Func? startApp;
diff --git a/test/Dapr.Testcontainers.Test/Harnesses/StartupOrderTests.cs b/test/Dapr.Testcontainers.Test/Harnesses/StartupOrderTests.cs
index bc023ce2d..3707e8a50 100644
--- a/test/Dapr.Testcontainers.Test/Harnesses/StartupOrderTests.cs
+++ b/test/Dapr.Testcontainers.Test/Harnesses/StartupOrderTests.cs
@@ -35,6 +35,11 @@ public async Task AppStartsFirst_ShouldPreconfigurePorts()
Assert.True(harness.DaprHttpPort > 0);
Assert.True(harness.DaprGrpcPort > 0);
+
+ harness.SetPorts(3501, 50002);
+
+ Assert.Equal(3501, harness.DaprHttpPort);
+ Assert.Equal(50002, harness.DaprGrpcPort);
}
[Fact]
@@ -62,7 +67,7 @@ public void ResourcesStartFirst_ShouldNotPreconfigurePorts()
Assert.Equal(0, harness.DaprHttpPort);
}
-
+
// Concrete implementation for testing BaseHarness
private class TestHarness : BaseHarness
{
From 5dd7e3f3e68c9d7d742a3a1c218557f2361935dc Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 16 Aug 2026 20:38:39 +0000
Subject: [PATCH 2/2] Make workflow RPCs wait for channel readiness
Co-authored-by: WhitWaldo <2238529+WhitWaldo@users.noreply.github.com>
---
src/Dapr.Workflow/Client/WorkflowGrpcClient.cs | 3 ++-
test/Dapr.Workflow.Test/Client/WorkflowGrpcClientTests.cs | 8 +++++++-
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/Dapr.Workflow/Client/WorkflowGrpcClient.cs b/src/Dapr.Workflow/Client/WorkflowGrpcClient.cs
index 4a08458df..d15720c98 100644
--- a/src/Dapr.Workflow/Client/WorkflowGrpcClient.cs
+++ b/src/Dapr.Workflow/Client/WorkflowGrpcClient.cs
@@ -348,7 +348,8 @@ public override ValueTask DisposeAsync()
}
private CallOptions CreateCallOptions(CancellationToken cancellationToken) =>
- DaprClientUtilities.ConfigureGrpcCallOptions(typeof(DaprWorkflowClient).Assembly, daprApiToken, cancellationToken);
+ DaprClientUtilities.ConfigureGrpcCallOptions(typeof(DaprWorkflowClient).Assembly, daprApiToken, cancellationToken)
+ .WithWaitForReady();
private static readonly TimeSpan MinWaitRetryDelay = TimeSpan.FromMilliseconds(50);
private static readonly TimeSpan MaxWaitRetryDelay = TimeSpan.FromSeconds(15);
diff --git a/test/Dapr.Workflow.Test/Client/WorkflowGrpcClientTests.cs b/test/Dapr.Workflow.Test/Client/WorkflowGrpcClientTests.cs
index 2184f2b00..c6d39637f 100644
--- a/test/Dapr.Workflow.Test/Client/WorkflowGrpcClientTests.cs
+++ b/test/Dapr.Workflow.Test/Client/WorkflowGrpcClientTests.cs
@@ -30,11 +30,16 @@ public async Task ScheduleNewWorkflowAsync_ShouldUseProvidedInstanceId_WhenOptio
var serializer = new StubSerializer { SerializeResult = "{\"x\":1}" };
CreateInstanceRequest? capturedRequest = null;
+ CallOptions? capturedCallOptions = null;
var grpcClientMock = CreateGrpcClientMock();
grpcClientMock
.Setup(x => x.StartInstanceAsync(It.IsAny(), It.IsAny()))
- .Callback((r, _) => capturedRequest = r)
+ .Callback((r, options) =>
+ {
+ capturedRequest = r;
+ capturedCallOptions = options;
+ })
.Returns(CreateAsyncUnaryCall(new CreateInstanceResponse { InstanceId = "id-from-sidecar" }));
var client = new WorkflowGrpcClient(grpcClientMock.Object, NullLogger.Instance, serializer);
@@ -46,6 +51,7 @@ public async Task ScheduleNewWorkflowAsync_ShouldUseProvidedInstanceId_WhenOptio
Assert.Equal("instance-123", capturedRequest!.InstanceId);
Assert.Equal("MyWorkflow", capturedRequest.Name);
Assert.Equal("{\"x\":1}", capturedRequest.Input);
+ Assert.True(capturedCallOptions?.IsWaitForReady);
}
[Fact]