diff --git a/src/Dapr.Workflow/Logging.cs b/src/Dapr.Workflow/Logging.cs index 7fd05def5..14b117fbc 100644 --- a/src/Dapr.Workflow/Logging.cs +++ b/src/Dapr.Workflow/Logging.cs @@ -25,6 +25,9 @@ internal static partial class Logging [LoggerMessage(LogLevel.Error, "Workflow '{WorkflowName}' not found in registry")] public static partial void LogWorkerWorkflowHandleOrchestratorRequestNotInRegistry(this ILogger logger, string workflowName); + [LoggerMessage(LogLevel.Error, "Workflow '{WorkflowName}' failed to activate")] + public static partial void LogWorkerWorkflowHandleOrchestratorRequestActivationFailed(this ILogger logger, Exception ex, string workflowName); + [LoggerMessage(LogLevel.Information, "Workflow execution completed: Name='{WorkflowName}', InstanceId='{InstanceId}'")] public static partial void LogWorkerWorkflowHandleOrchestratorRequestCompleted(this ILogger logger, string workflowName, string instanceId); @@ -37,6 +40,9 @@ internal static partial class Logging [LoggerMessage(LogLevel.Error, "Activity '{ActivityName}' not found in registry")] public static partial void LogWorkerWorkflowHandleActivityRequestNotInRegistry(this ILogger logger, string activityName); + [LoggerMessage(LogLevel.Error, "Activity '{ActivityName}' failed to activate")] + public static partial void LogWorkerWorkflowHandleActivityRequestActivationFailed(this ILogger logger, Exception ex, string activityName); + [LoggerMessage(LogLevel.Debug, "Activity execution completed: Name='{ActivityName}', TaskId='{TasKId}'")] public static partial void LogWorkerWorkflowHandleActivityRequestCompleted(this ILogger logger, string activityName, int taskId); diff --git a/src/Dapr.Workflow/Worker/IWorkflowsFactory.cs b/src/Dapr.Workflow/Worker/IWorkflowsFactory.cs index 8ce7d4efd..8aeef7ae5 100644 --- a/src/Dapr.Workflow/Worker/IWorkflowsFactory.cs +++ b/src/Dapr.Workflow/Worker/IWorkflowsFactory.cs @@ -58,17 +58,26 @@ public void RegisterActivity(string name, /// /// The identifier of the workflow. /// The service provider for dependency injection. - /// The created workflow, or null if not found. + /// The created workflow, or null if not found or activation failed. + /// + /// The exception thrown during activation, or null if the workflow was not found in the registry. + /// This allows callers to distinguish between "not registered" and "registered but failed to activate". + /// /// True if the workflow was created; otherwise false. - bool TryCreateWorkflow(TaskIdentifier identifier, IServiceProvider serviceProvider, out IWorkflow? workflow); + bool TryCreateWorkflow(TaskIdentifier identifier, IServiceProvider serviceProvider, out IWorkflow? workflow, + out Exception? activationException); /// /// Tries to create an activity instance. /// /// The identifier of the activity. /// The service provider for dependency injection. - /// The created activity, or null if not found. + /// The created activity, or null if not found or activation failed. + /// + /// The exception thrown during activation, or null if the activity was not found in the registry. + /// This allows callers to distinguish between "not registered" and "registered but failed to activate". + /// /// True if the activity was created; otherwise false. bool TryCreateActivity(TaskIdentifier identifier, IServiceProvider serviceProvider, - out IWorkflowActivity? activity); + out IWorkflowActivity? activity, out Exception? activationException); } diff --git a/src/Dapr.Workflow/Worker/WorkflowWorker.cs b/src/Dapr.Workflow/Worker/WorkflowWorker.cs index 2439365f8..16a8494da 100644 --- a/src/Dapr.Workflow/Worker/WorkflowWorker.cs +++ b/src/Dapr.Workflow/Worker/WorkflowWorker.cs @@ -270,8 +270,36 @@ private async Task HandleOrchestratorResponseAsync(Orchest // Try to get the workflow from the factory var workflowIdentifier = new TaskIdentifier(workflowName); - if (!_workflowsFactory.TryCreateWorkflow(workflowIdentifier, scope.ServiceProvider, out var workflow)) + if (!_workflowsFactory.TryCreateWorkflow(workflowIdentifier, scope.ServiceProvider, out var workflow, out var workflowActivationException)) { + if (workflowActivationException != null) + { + _logger.LogWorkerWorkflowHandleOrchestratorRequestActivationFailed(workflowActivationException, workflowName); + + return new OrchestratorResponse + { + InstanceId = request.InstanceId, + CompletionToken = completionToken, + Actions = + { + new OrchestratorAction + { + CompleteOrchestration = new CompleteOrchestrationAction + { + OrchestrationStatus = OrchestrationStatus.Failed, + FailureDetails = new() + { + IsNonRetriable = true, + ErrorType = workflowActivationException.GetType().FullName ?? "WorkflowActivationFailed", + ErrorMessage = $"Workflow '{workflowName}' failed to activate: {workflowActivationException.Message}", + StackTrace = workflowActivationException.StackTrace ?? string.Empty + } + } + } + } + }; + } + _logger.LogWorkerWorkflowHandleOrchestratorRequestNotInRegistry(workflowName); return new OrchestratorResponse @@ -489,8 +517,26 @@ private async Task HandleActivityResponseAsync(ActivityRequest // Try to get the activity from the factory var activityIdentifier = new TaskIdentifier(request.Name); - if (!_workflowsFactory.TryCreateActivity(activityIdentifier, scope.ServiceProvider, out var activity)) + if (!_workflowsFactory.TryCreateActivity(activityIdentifier, scope.ServiceProvider, out var activity, out var activityActivationException)) { + if (activityActivationException != null) + { + _logger.LogWorkerWorkflowHandleActivityRequestActivationFailed(activityActivationException, request.Name); + + return new ActivityResponse + { + InstanceId = request.OrchestrationInstance?.InstanceId ?? string.Empty, + TaskId = request.TaskId, + CompletionToken = completionToken, + FailureDetails = new() + { + ErrorType = activityActivationException.GetType().FullName ?? "ActivityActivationFailed", + ErrorMessage = $"Activity '{request.Name}' failed to activate: {activityActivationException.Message}", + StackTrace = activityActivationException.StackTrace ?? string.Empty + } + }; + } + _logger.LogWorkerWorkflowHandleActivityRequestNotInRegistry(request.Name); return new ActivityResponse diff --git a/src/Dapr.Workflow/Worker/WorkflowsFactory.cs b/src/Dapr.Workflow/Worker/WorkflowsFactory.cs index 8b19de576..5570521d6 100644 --- a/src/Dapr.Workflow/Worker/WorkflowsFactory.cs +++ b/src/Dapr.Workflow/Worker/WorkflowsFactory.cs @@ -96,7 +96,8 @@ public void RegisterActivity(string name, } /// - public bool TryCreateWorkflow(TaskIdentifier identifier, IServiceProvider serviceProvider, out IWorkflow? workflow) + public bool TryCreateWorkflow(TaskIdentifier identifier, IServiceProvider serviceProvider, out IWorkflow? workflow, + out Exception? activationException) { if (_workflowFactories.TryGetValue(identifier.Name, out var factory)) { @@ -104,23 +105,27 @@ public bool TryCreateWorkflow(TaskIdentifier identifier, IServiceProvider servic { workflow = factory(serviceProvider); logger.LogCreateWorkflowInstanceSuccess(identifier.Name); + activationException = null; return true; } catch (Exception ex) { logger.LogCreateWorkflowFailure(ex, identifier.Name); + activationException = ex; workflow = null; return false; } } logger.LogCreateWorkflowNotFoundInRegistry(identifier.Name); + activationException = null; workflow = null; return false; } /// - public bool TryCreateActivity(TaskIdentifier identifier, IServiceProvider serviceProvider, out IWorkflowActivity? activity) + public bool TryCreateActivity(TaskIdentifier identifier, IServiceProvider serviceProvider, out IWorkflowActivity? activity, + out Exception? activationException) { if (_activityFactories.TryGetValue(identifier.Name, out var factory)) { @@ -128,17 +133,20 @@ public bool TryCreateActivity(TaskIdentifier identifier, IServiceProvider servic { activity = factory(serviceProvider); logger.LogCreateActivityInstanceSuccess(identifier.Name); + activationException = null; return true; } catch (Exception ex) { logger.LogCreateActivityFailure(ex, identifier.Name); + activationException = ex; activity = null; return false; } } logger.LogCreateActivityNotFoundInRegistry(identifier.Name); + activationException = null; activity = null; return false; } diff --git a/test/Dapr.Workflow.Test/Worker/WorkflowWorkerTests.cs b/test/Dapr.Workflow.Test/Worker/WorkflowWorkerTests.cs index 02f668aaf..190725c4f 100644 --- a/test/Dapr.Workflow.Test/Worker/WorkflowWorkerTests.cs +++ b/test/Dapr.Workflow.Test/Worker/WorkflowWorkerTests.cs @@ -828,6 +828,48 @@ public async Task HandleOrchestratorResponseAsync_ShouldReturnEmptyActions_WhenW var action = Assert.Single(response.Actions); Assert.NotNull(action.CompleteOrchestration); Assert.Equal(OrchestrationStatus.Failed, action.CompleteOrchestration.OrchestrationStatus); + Assert.Equal("WorkflowNotFound", action.CompleteOrchestration.FailureDetails.ErrorType); + } + + [Fact] + public async Task HandleOrchestratorResponseAsync_ShouldReturnActivationFailure_WhenWorkflowActivationFails() + { + var sp = new ServiceCollection().BuildServiceProvider(); + var serializer = new JsonWorkflowSerializer(new JsonSerializerOptions(JsonSerializerDefaults.Web)); + var options = new WorkflowRuntimeOptions(); + + var factory = new StubWorkflowsFactory(); + factory.AddWorkflowActivationError("wf", new InvalidOperationException("No service for type 'IMyService' has been registered.")); + + var worker = new WorkflowWorker( + CreateGrpcClientMock().Object, + factory, + NullLoggerFactory.Instance, + serializer, + sp, + options); + + var request = new OrchestratorRequest + { + InstanceId = "i", + PastEvents = + { + new HistoryEvent + { + ExecutionStarted = new ExecutionStartedEvent { Name = "wf", Input = "123" } + } + } + }; + + var response = await InvokeHandleOrchestratorResponseAsync(worker, request); + + Assert.Equal("i", response.InstanceId); + var activationAction = Assert.Single(response.Actions); + Assert.NotNull(activationAction.CompleteOrchestration); + Assert.Equal(OrchestrationStatus.Failed, activationAction.CompleteOrchestration.OrchestrationStatus); + Assert.NotEqual("WorkflowNotFound", activationAction.CompleteOrchestration.FailureDetails.ErrorType); + Assert.Contains("failed to activate", activationAction.CompleteOrchestration.FailureDetails.ErrorMessage); + Assert.Contains("IMyService", activationAction.CompleteOrchestration.FailureDetails.ErrorMessage); } [Fact] @@ -1002,6 +1044,42 @@ public async Task HandleActivityResponseAsync_ShouldReturnNotFoundFailure_WhenAc Assert.Contains("Activity 'act' not found", response.FailureDetails.ErrorMessage); } + [Fact] + public async Task HandleActivityResponseAsync_ShouldReturnActivationFailure_WhenActivityActivationFails() + { + var sp = new ServiceCollection().BuildServiceProvider(); + var serializer = new JsonWorkflowSerializer(new JsonSerializerOptions(JsonSerializerDefaults.Web)); + var options = new WorkflowRuntimeOptions(); + + var factory = new StubWorkflowsFactory(); + factory.AddActivityActivationError("act", new InvalidOperationException("No service for type 'IEmailSender' has been registered.")); + + var worker = new WorkflowWorker( + CreateGrpcClientMock().Object, + factory, + NullLoggerFactory.Instance, + serializer, + sp, + options); + + var request = new ActivityRequest + { + Name = "act", + TaskId = 7, + OrchestrationInstance = new OrchestrationInstance { InstanceId = "i" }, + Input = "1" + }; + + var response = await InvokeHandleActivityResponseAsync(worker, request); + + Assert.Equal("i", response.InstanceId); + Assert.Equal(7, response.TaskId); + Assert.NotNull(response.FailureDetails); + Assert.NotEqual("ActivityNotFoundException", response.FailureDetails.ErrorType); + Assert.Contains("failed to activate", response.FailureDetails.ErrorMessage); + Assert.Contains("IEmailSender", response.FailureDetails.ErrorMessage); + } + [Fact] public async Task HandleActivityResponseAsync_ShouldExecuteActivity_AndSerializeResult() { @@ -1625,20 +1703,44 @@ private sealed class StubWorkflowsFactory : IWorkflowsFactory { private readonly Dictionary _workflows = new(StringComparer.OrdinalIgnoreCase); private readonly Dictionary _activities = new(StringComparer.OrdinalIgnoreCase); + private readonly Dictionary _workflowActivationErrors = new(StringComparer.OrdinalIgnoreCase); + private readonly Dictionary _activityActivationErrors = new(StringComparer.OrdinalIgnoreCase); public void AddWorkflow(string name, IWorkflow wf) => _workflows[name] = wf; public void AddActivity(string name, IWorkflowActivity act) => _activities[name] = act; + public void AddWorkflowActivationError(string name, Exception ex) => _workflowActivationErrors[name] = ex; + public void AddActivityActivationError(string name, Exception ex) => _activityActivationErrors[name] = ex; public void RegisterWorkflow(string? name = null) where TWorkflow : class, IWorkflow => throw new NotSupportedException(); public void RegisterWorkflow(string name, Func> implementation) => throw new NotSupportedException(); public void RegisterActivity(string? name = null) where TActivity : class, IWorkflowActivity => throw new NotSupportedException(); public void RegisterActivity(string name, Func> implementation) => throw new NotSupportedException(); - public bool TryCreateWorkflow(TaskIdentifier identifier, IServiceProvider serviceProvider, out IWorkflow? workflow) - => _workflows.TryGetValue(identifier.Name, out workflow); + public bool TryCreateWorkflow(TaskIdentifier identifier, IServiceProvider serviceProvider, out IWorkflow? workflow, + out Exception? activationException) + { + if (_workflowActivationErrors.TryGetValue(identifier.Name, out var ex)) + { + activationException = ex; + workflow = null; + return false; + } + activationException = null; + return _workflows.TryGetValue(identifier.Name, out workflow); + } - public bool TryCreateActivity(TaskIdentifier identifier, IServiceProvider serviceProvider, out IWorkflowActivity? activity) - => _activities.TryGetValue(identifier.Name, out activity); + public bool TryCreateActivity(TaskIdentifier identifier, IServiceProvider serviceProvider, out IWorkflowActivity? activity, + out Exception? activationException) + { + if (_activityActivationErrors.TryGetValue(identifier.Name, out var ex)) + { + activationException = ex; + activity = null; + return false; + } + activationException = null; + return _activities.TryGetValue(identifier.Name, out activity); + } } private sealed class InlineWorkflow(Type inputType, Func> run) : IWorkflow diff --git a/test/Dapr.Workflow.Test/Worker/WorkflowsFactoryTests.cs b/test/Dapr.Workflow.Test/Worker/WorkflowsFactoryTests.cs index 9448362d7..9a504d13d 100644 --- a/test/Dapr.Workflow.Test/Worker/WorkflowsFactoryTests.cs +++ b/test/Dapr.Workflow.Test/Worker/WorkflowsFactoryTests.cs @@ -34,7 +34,7 @@ public void RegisterWorkflow_Generic_ShouldDefaultNameToTypeName_AndCreateViaDI( factory.RegisterWorkflow(); - var created = factory.TryCreateWorkflow(new TaskIdentifier(nameof(TestWorkflowWithDependency)), sp, out var workflow); + var created = factory.TryCreateWorkflow(new TaskIdentifier(nameof(TestWorkflowWithDependency)), sp, out var workflow, out _); Assert.True(created); Assert.NotNull(workflow); @@ -54,7 +54,7 @@ public void RegisterActivity_Generic_ShouldDefaultNameToTypeName_AndCreateViaDI( factory.RegisterActivity(); - var created = factory.TryCreateActivity(new TaskIdentifier(nameof(TestActivityWithDependency)), sp, out var activity); + var created = factory.TryCreateActivity(new TaskIdentifier(nameof(TestActivityWithDependency)), sp, out var activity, out _); Assert.True(created); Assert.NotNull(activity); @@ -71,11 +71,11 @@ public void RegisterActivity_Generic_ShouldUseProvidedName_WhenNameIsSpecified() var sp = new ServiceCollection().BuildServiceProvider(); - Assert.True(factory.TryCreateActivity(new TaskIdentifier("custom-activity"), sp, out var activity)); + Assert.True(factory.TryCreateActivity(new TaskIdentifier("custom-activity"), sp, out var activity, out _)); Assert.NotNull(activity); Assert.IsType(activity); - Assert.False(factory.TryCreateActivity(new TaskIdentifier(nameof(TestActivityA)), sp, out _)); + Assert.False(factory.TryCreateActivity(new TaskIdentifier(nameof(TestActivityA)), sp, out _, out _)); } [Fact] @@ -87,7 +87,7 @@ public void RegisterWorkflow_Generic_ShouldBeCaseInsensitive_ForLookup() var sp = new ServiceCollection().BuildServiceProvider(); - Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("myworkflow"), sp, out var workflow)); + Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("myworkflow"), sp, out var workflow, out _)); Assert.NotNull(workflow); Assert.IsType(workflow); } @@ -101,11 +101,11 @@ public void RegisterWorkflow_Generic_ShouldUseProvidedName_WhenNameIsSpecified() var sp = new ServiceCollection().BuildServiceProvider(); - Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("custom-workflow"), sp, out var workflow)); + Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("custom-workflow"), sp, out var workflow, out _)); Assert.NotNull(workflow); Assert.IsType(workflow); - Assert.False(factory.TryCreateWorkflow(new TaskIdentifier(nameof(TestWorkflowA)), sp, out _)); + Assert.False(factory.TryCreateWorkflow(new TaskIdentifier(nameof(TestWorkflowA)), sp, out _, out _)); } [Fact] @@ -128,7 +128,7 @@ public void RegisterWorkflow_Generic_ShouldNotOverwrite_WhenRegisteringSameNameT var sp = new ServiceCollection().BuildServiceProvider(); - Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("wf"), sp, out var workflow)); + Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("wf"), sp, out var workflow, out _)); Assert.NotNull(workflow); Assert.IsType(workflow); } @@ -143,7 +143,7 @@ public void RegisterActivity_Generic_ShouldNotOverwrite_WhenRegisteringSameNameT var sp = new ServiceCollection().BuildServiceProvider(); - Assert.True(factory.TryCreateActivity(new TaskIdentifier("act"), sp, out var activity)); + Assert.True(factory.TryCreateActivity(new TaskIdentifier("act"), sp, out var activity, out _)); Assert.NotNull(activity); Assert.IsType(activity); } @@ -166,7 +166,7 @@ public void RegisterActivity_Generic_ShouldBeCaseInsensitive_ForLookup() var sp = new ServiceCollection().BuildServiceProvider(); - Assert.True(factory.TryCreateActivity(new TaskIdentifier("myactivity"), sp, out var activity)); + Assert.True(factory.TryCreateActivity(new TaskIdentifier("myactivity"), sp, out var activity, out _)); Assert.NotNull(activity); Assert.IsType(activity); } @@ -181,7 +181,7 @@ public async Task RegisterWorkflow_Function_ShouldNotOverwrite_WhenRegisteringSa var sp = new ServiceCollection().BuildServiceProvider(); - Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("wf"), sp, out var workflow)); + Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("wf"), sp, out var workflow, out _)); Assert.NotNull(workflow); var result = await workflow.RunAsync(new FakeWorkflowContext(), 10); @@ -199,7 +199,7 @@ public async Task RegisterActivity_Function_ShouldNotOverwrite_WhenRegisteringSa var sp = new ServiceCollection().BuildServiceProvider(); - Assert.True(factory.TryCreateActivity(new TaskIdentifier("act"), sp, out var activity)); + Assert.True(factory.TryCreateActivity(new TaskIdentifier("act"), sp, out var activity, out _)); Assert.NotNull(activity); var result = await activity.RunAsync(new FakeActivityContext(), 10); @@ -233,10 +233,11 @@ public void TryCreateWorkflow_ShouldReturnFalse_WhenNotRegistered() var logger = Mock.Of>(); var factory = new WorkflowsFactory(logger); - var created = factory.TryCreateWorkflow(new TaskIdentifier("missing"), sp, out var workflow); + var created = factory.TryCreateWorkflow(new TaskIdentifier("missing"), sp, out var workflow, out var activationException); Assert.False(created); Assert.Null(workflow); + Assert.Null(activationException); } [Fact] @@ -246,10 +247,11 @@ public void TryCreateActivity_ShouldReturnFalse_WhenNotRegistered() var logger = Mock.Of>(); var factory = new WorkflowsFactory(logger); - var created = factory.TryCreateActivity(new TaskIdentifier("missing"), sp, out var activity); + var created = factory.TryCreateActivity(new TaskIdentifier("missing"), sp, out var activity, out var activationException); Assert.False(created); Assert.Null(activity); + Assert.Null(activationException); } [Fact] @@ -263,10 +265,12 @@ public void TryCreateWorkflow_ShouldReturnFalse_WhenFactoryThrows() factory.RegisterWorkflow(); - var created = factory.TryCreateWorkflow(new TaskIdentifier(nameof(ThrowingWorkflow)), sp, out var workflow); + var created = factory.TryCreateWorkflow(new TaskIdentifier(nameof(ThrowingWorkflow)), sp, out var workflow, out var activationException); Assert.False(created); Assert.Null(workflow); + Assert.NotNull(activationException); + Assert.IsType(activationException); } [Fact] @@ -280,10 +284,12 @@ public void TryCreateActivity_ShouldReturnFalse_WhenFactoryThrows() factory.RegisterActivity(); - var created = factory.TryCreateActivity(new TaskIdentifier(nameof(ThrowingActivity)), sp, out var activity); + var created = factory.TryCreateActivity(new TaskIdentifier(nameof(ThrowingActivity)), sp, out var activity, out var activationException); Assert.False(created); Assert.Null(activity); + Assert.NotNull(activationException); + Assert.IsType(activationException); } [Fact] @@ -295,7 +301,7 @@ public async Task RegisteredFunctionWorkflow_ShouldInvokeImplementation_AndUseTy factory.RegisterWorkflow("wf-fn", (_, x) => Task.FromResult($"v:{x}")); var sp = new ServiceCollection().BuildServiceProvider(); - var created = factory.TryCreateWorkflow(new TaskIdentifier("wf-fn"), sp, out var workflow); + var created = factory.TryCreateWorkflow(new TaskIdentifier("wf-fn"), sp, out var workflow, out _); Assert.True(created); Assert.NotNull(workflow); @@ -316,7 +322,7 @@ public async Task RegisteredFunctionActivity_ShouldInvokeImplementation_AndUseTy factory.RegisterActivity("act-fn", (_, x) => Task.FromResult($"v:{x}")); var sp = new ServiceCollection().BuildServiceProvider(); - var created = factory.TryCreateActivity(new TaskIdentifier("act-fn"), sp, out var activity); + var created = factory.TryCreateActivity(new TaskIdentifier("act-fn"), sp, out var activity, out _); Assert.True(created); Assert.NotNull(activity); diff --git a/test/Dapr.Workflow.Test/WorkflowRuntimeOptionsTests.cs b/test/Dapr.Workflow.Test/WorkflowRuntimeOptionsTests.cs index af97b8e2d..9f8e2d5cc 100644 --- a/test/Dapr.Workflow.Test/WorkflowRuntimeOptionsTests.cs +++ b/test/Dapr.Workflow.Test/WorkflowRuntimeOptionsTests.cs @@ -77,10 +77,10 @@ public void ApplyRegistrations_ShouldApplyWorkflowAndActivityRegistrations_ToFac var sp = new Microsoft.Extensions.DependencyInjection.ServiceCollection().BuildServiceProvider(); - Assert.True(factory.TryCreateWorkflow(new("wf-fn"), sp, out var workflow)); + Assert.True(factory.TryCreateWorkflow(new("wf-fn"), sp, out var workflow, out _)); Assert.NotNull(workflow); - Assert.True(factory.TryCreateActivity(new("act-fn"), sp, out var activity)); + Assert.True(factory.TryCreateActivity(new("act-fn"), sp, out var activity, out _)); Assert.NotNull(activity); } @@ -123,11 +123,11 @@ public void RegisterWorkflow_GenericWithName_ShouldRegisterUsingProvidedName_Whe var sp = new ServiceCollection().BuildServiceProvider(); - Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("MyCustomWorkflowName"), sp, out var workflow)); + Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("MyCustomWorkflowName"), sp, out var workflow, out _)); Assert.NotNull(workflow); Assert.IsType(workflow); - Assert.False(factory.TryCreateWorkflow(new TaskIdentifier(nameof(TestWorkflow)), sp, out _)); + Assert.False(factory.TryCreateWorkflow(new TaskIdentifier(nameof(TestWorkflow)), sp, out _, out _)); } [Fact] @@ -141,11 +141,11 @@ public void RegisterActivity_GenericWithName_ShouldRegisterUsingProvidedName_Whe var sp = new ServiceCollection().BuildServiceProvider(); - Assert.True(factory.TryCreateActivity(new TaskIdentifier("MyCustomActivityName"), sp, out var activity)); + Assert.True(factory.TryCreateActivity(new TaskIdentifier("MyCustomActivityName"), sp, out var activity, out _)); Assert.NotNull(activity); Assert.IsType(activity); - Assert.False(factory.TryCreateActivity(new TaskIdentifier(nameof(TestActivity)), sp, out _)); + Assert.False(factory.TryCreateActivity(new TaskIdentifier(nameof(TestActivity)), sp, out _, out _)); } private sealed class TestWorkflow : IWorkflow diff --git a/test/Dapr.Workflow.Test/WorkflowServiceCollectionExtensionsTests.cs b/test/Dapr.Workflow.Test/WorkflowServiceCollectionExtensionsTests.cs index 5b11e0325..977b1699c 100644 --- a/test/Dapr.Workflow.Test/WorkflowServiceCollectionExtensionsTests.cs +++ b/test/Dapr.Workflow.Test/WorkflowServiceCollectionExtensionsTests.cs @@ -211,13 +211,13 @@ public async Task AddDaprWorkflow_ShouldCreateWorkflowsFactory_AndApplyRegistrat var factory = sp.GetRequiredService(); - Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("wf"), sp, out var wf)); + Assert.True(factory.TryCreateWorkflow(new TaskIdentifier("wf"), sp, out var wf, out _)); Assert.NotNull(wf); var wfResult = await wf.RunAsync(new FakeWorkflowContext(), 10); Assert.Equal(11, wfResult); - Assert.True(factory.TryCreateActivity(new TaskIdentifier("act"), sp, out var act)); + Assert.True(factory.TryCreateActivity(new TaskIdentifier("act"), sp, out var act, out _)); Assert.NotNull(act); var actResult = await act.RunAsync(new FakeActivityContext(), 10);