From ebcf79665e19af648a7688b50deea6965566b3e2 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 22:17:48 +0000 Subject: [PATCH 1/2] Initial plan From d0eea2483d316d6acaacbdaec4225f640b812da8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 22:24:34 +0000 Subject: [PATCH 2/2] Add test for capability registration in UseExternalizedPayloads Co-authored-by: YunchuWang <12449837+YunchuWang@users.noreply.github.com> --- ...BuilderExtensionsAzureBlobPayloadsTests.cs | 97 +++++++++++++++++++ .../Grpc.Tests/Worker.Grpc.Tests.csproj | 1 + 2 files changed, 98 insertions(+) create mode 100644 test/Worker/Grpc.Tests/DependencyInjection/DurableTaskWorkerBuilderExtensionsAzureBlobPayloadsTests.cs diff --git a/test/Worker/Grpc.Tests/DependencyInjection/DurableTaskWorkerBuilderExtensionsAzureBlobPayloadsTests.cs b/test/Worker/Grpc.Tests/DependencyInjection/DurableTaskWorkerBuilderExtensionsAzureBlobPayloadsTests.cs new file mode 100644 index 00000000..dd8202b3 --- /dev/null +++ b/test/Worker/Grpc.Tests/DependencyInjection/DurableTaskWorkerBuilderExtensionsAzureBlobPayloadsTests.cs @@ -0,0 +1,97 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using Microsoft.DurableTask.Converters; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using P = Microsoft.DurableTask.Protobuf; + +namespace Microsoft.DurableTask.Worker.Grpc.Tests; + +public class DurableTaskWorkerBuilderExtensionsAzureBlobPayloadsTests +{ + [Fact] + public void UseExternalizedPayloads_AddsLargePayloadsCapability() + { + // Arrange + ServiceCollection services = new(); + DefaultDurableTaskWorkerBuilder builder = new("test", services); + + // Configure a minimal gRPC worker with channel + GrpcChannel channel = GetChannel(); + builder.UseGrpc(opt => opt.Channel = channel); + + // Register a fake PayloadStore + services.AddSingleton(new FakePayloadStore()); + + // Configure storage options + services.Configure("test", opts => + { + opts.ContainerName = "test"; + opts.ConnectionString = "UseDevelopmentStorage=true"; + }); + + // Act + builder.UseExternalizedPayloads(); + + // Assert + IServiceProvider provider = services.BuildServiceProvider(); + GrpcDurableTaskWorkerOptions options = provider.GetService>()!.Get("test"); + + options.Capabilities.Should().Contain(P.WorkerCapability.LargePayloads); + } + + [Fact] + public void UseExternalizedPayloads_WithConfigure_AddsLargePayloadsCapability() + { + // Arrange + ServiceCollection services = new(); + DefaultDurableTaskWorkerBuilder builder = new("test", services); + + // Configure a minimal gRPC worker with channel + GrpcChannel channel = GetChannel(); + builder.UseGrpc(opt => opt.Channel = channel); + + // Register a fake PayloadStore + services.AddSingleton(new FakePayloadStore()); + + // Act + builder.UseExternalizedPayloads(opts => + { + opts.ContainerName = "test"; + opts.ConnectionString = "UseDevelopmentStorage=true"; + }); + + // Assert + IServiceProvider provider = services.BuildServiceProvider(); + GrpcDurableTaskWorkerOptions options = provider.GetService>()!.Get("test"); + + options.Capabilities.Should().Contain(P.WorkerCapability.LargePayloads); + } + +#if NET6_0_OR_GREATER + static GrpcChannel GetChannel() => GrpcChannel.ForAddress("http://localhost:9001"); +#endif + +#if NETFRAMEWORK + static GrpcChannel GetChannel() => new("http://localhost:9001", ChannelCredentials.Insecure); +#endif + + class FakePayloadStore : PayloadStore + { + public override Task DownloadAsync(string token, CancellationToken cancellationToken) + { + return Task.FromResult("fake"); + } + + public override bool IsKnownPayloadToken(string value) + { + return value.StartsWith("fake:"); + } + + public override Task UploadAsync(string payLoad, CancellationToken cancellationToken) + { + return Task.FromResult("fake:token"); + } + } +} diff --git a/test/Worker/Grpc.Tests/Worker.Grpc.Tests.csproj b/test/Worker/Grpc.Tests/Worker.Grpc.Tests.csproj index cda2aa55..3389656c 100644 --- a/test/Worker/Grpc.Tests/Worker.Grpc.Tests.csproj +++ b/test/Worker/Grpc.Tests/Worker.Grpc.Tests.csproj @@ -10,6 +10,7 @@ +