diff --git a/test/Worker/Grpc.Tests/DependencyInjection/DurableTaskWorkerBuilderExtensionsAzureBlobPayloadsTests.cs b/test/Worker/Grpc.Tests/DependencyInjection/DurableTaskWorkerBuilderExtensionsAzureBlobPayloadsTests.cs new file mode 100644 index 000000000..dd8202b33 --- /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 cda2aa55a..3389656c3 100644 --- a/test/Worker/Grpc.Tests/Worker.Grpc.Tests.csproj +++ b/test/Worker/Grpc.Tests/Worker.Grpc.Tests.csproj @@ -10,6 +10,7 @@ +