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]