elsa-core/test/unit/Elsa.Scheduling.UnitTests/ScheduledTasks/ScheduledCronTaskTests.cs

213 lines
8.7 KiB
C#
Raw Normal View History

using Elsa.Common;
using Elsa.Mediator.Contracts;
using Elsa.Scheduling.ScheduledTasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NSubstitute;
namespace Elsa.Scheduling.UnitTests.ScheduledTasks;
/// <summary>
/// Tests for ScheduledCronTask to ensure cron triggers continue to fire even in edge cases.
/// </summary>
public class ScheduledCronTaskTests : IDisposable
{
private const string DefaultCronExpression = "0 */5 * * * *";
private static readonly DateTimeOffset DefaultNow = new(2025, 11, 06, 22, 50, 00, 0, TimeSpan.Zero);
Added IEnumerableTypeConverter (#7020) * Added IEnumerableTypeConverter * fixed bug and added tests * Add resource disposal mechanism in ScheduledCronTask - Introduced `_disposed` flag to prevent execution after disposal. - Updated disposal logic to ensure proper release of resources. - Adjusted unit tests to verify new disposal behavior and prevent unintended timer actions. * Enhance scheduling tasks with edge case handling and disposal improvements - Added `_disposed` flag to `ScheduledRecurringTask` and `ScheduledSpecificInstantTask` to prevent execution after disposal. - Adjusted timer setup logic to handle zero/negative delays with a minimum delay of 1ms. - Updated disposal logic to ensure proper resource cleanup even during timer callbacks. - Introduced extensive unit tests for edge cases such as small, zero, or negative delay scenarios and proper disposal behavior. * Update test/component/Elsa.Workflows.ComponentTests/Scenarios/VariablesArray/Activities/RemoveTopElementStep.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/Elsa.Common/Serialization/IEnumerableTypeConverter.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/Elsa.Common/Serialization/IEnumerableTypeConverter.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add integration tests for EnumerableTypeConverter and update solution file - Introduced `Elsa.Common.IntegrationTests` project for testing serialization behavior in `EnumerableTypeConverter`. - Added tests to verify proper handling of strings, byte arrays, and collections during JSON serialization. - Registered `EnumerableTypeConverter` in `DefaultFormattersFeature`. - Renamed `IEnumerableTypeConverter` to `EnumerableTypeConverter` for consistency. - Updated solution file to include the new integration test project. --------- Co-authored-by: Sipke Schoorstra <sipkeschoorstra@outlook.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-12 10:07:33 +00:00
private readonly ServiceProvider _serviceProvider;
private readonly ISystemClock _systemClock;
private readonly ICronParser _cronParser;
private readonly ILogger<ScheduledCronTask> _logger;
private readonly List<ScheduledCronTask> _tasksToDispose = new();
public ScheduledCronTaskTests()
{
Added IEnumerableTypeConverter (#7020) * Added IEnumerableTypeConverter * fixed bug and added tests * Add resource disposal mechanism in ScheduledCronTask - Introduced `_disposed` flag to prevent execution after disposal. - Updated disposal logic to ensure proper release of resources. - Adjusted unit tests to verify new disposal behavior and prevent unintended timer actions. * Enhance scheduling tasks with edge case handling and disposal improvements - Added `_disposed` flag to `ScheduledRecurringTask` and `ScheduledSpecificInstantTask` to prevent execution after disposal. - Adjusted timer setup logic to handle zero/negative delays with a minimum delay of 1ms. - Updated disposal logic to ensure proper resource cleanup even during timer callbacks. - Introduced extensive unit tests for edge cases such as small, zero, or negative delay scenarios and proper disposal behavior. * Update test/component/Elsa.Workflows.ComponentTests/Scenarios/VariablesArray/Activities/RemoveTopElementStep.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/Elsa.Common/Serialization/IEnumerableTypeConverter.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/Elsa.Common/Serialization/IEnumerableTypeConverter.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add integration tests for EnumerableTypeConverter and update solution file - Introduced `Elsa.Common.IntegrationTests` project for testing serialization behavior in `EnumerableTypeConverter`. - Added tests to verify proper handling of strings, byte arrays, and collections during JSON serialization. - Registered `EnumerableTypeConverter` in `DefaultFormattersFeature`. - Renamed `IEnumerableTypeConverter` to `EnumerableTypeConverter` for consistency. - Updated solution file to include the new integration test project. --------- Co-authored-by: Sipke Schoorstra <sipkeschoorstra@outlook.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-12 10:07:33 +00:00
var services = new ServiceCollection();
_systemClock = Substitute.For<ISystemClock>();
_cronParser = Substitute.For<ICronParser>();
_logger = Substitute.For<ILogger<ScheduledCronTask>>();
Added IEnumerableTypeConverter (#7020) * Added IEnumerableTypeConverter * fixed bug and added tests * Add resource disposal mechanism in ScheduledCronTask - Introduced `_disposed` flag to prevent execution after disposal. - Updated disposal logic to ensure proper release of resources. - Adjusted unit tests to verify new disposal behavior and prevent unintended timer actions. * Enhance scheduling tasks with edge case handling and disposal improvements - Added `_disposed` flag to `ScheduledRecurringTask` and `ScheduledSpecificInstantTask` to prevent execution after disposal. - Adjusted timer setup logic to handle zero/negative delays with a minimum delay of 1ms. - Updated disposal logic to ensure proper resource cleanup even during timer callbacks. - Introduced extensive unit tests for edge cases such as small, zero, or negative delay scenarios and proper disposal behavior. * Update test/component/Elsa.Workflows.ComponentTests/Scenarios/VariablesArray/Activities/RemoveTopElementStep.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/Elsa.Common/Serialization/IEnumerableTypeConverter.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/Elsa.Common/Serialization/IEnumerableTypeConverter.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add integration tests for EnumerableTypeConverter and update solution file - Introduced `Elsa.Common.IntegrationTests` project for testing serialization behavior in `EnumerableTypeConverter`. - Added tests to verify proper handling of strings, byte arrays, and collections during JSON serialization. - Registered `EnumerableTypeConverter` in `DefaultFormattersFeature`. - Renamed `IEnumerableTypeConverter` to `EnumerableTypeConverter` for consistency. - Updated solution file to include the new integration test project. --------- Co-authored-by: Sipke Schoorstra <sipkeschoorstra@outlook.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-12 10:07:33 +00:00
services.AddSingleton(Substitute.For<ICommandSender>());
_serviceProvider = services.BuildServiceProvider();
}
private ScheduledCronTask CreateScheduledTask(
string? cronExpression = null,
ICronParser? cronParser = null,
ISystemClock? systemClock = null)
{
var task = Substitute.For<ITask>();
var scheduledTask = new ScheduledCronTask(
task,
cronExpression ?? DefaultCronExpression,
cronParser ?? _cronParser,
_serviceProvider.CreateScope().ServiceProvider.GetRequiredService<IServiceScopeFactory>(),
systemClock ?? _systemClock,
_logger
);
_tasksToDispose.Add(scheduledTask);
return scheduledTask;
}
private void SetupCronParser(params DateTimeOffset[] occurrences)
{
_cronParser.GetNextOccurrence(Arg.Any<string>()).Returns(occurrences[0], occurrences.Skip(1).ToArray());
}
private void SetupSystemClock(params DateTimeOffset[] times)
{
_systemClock.UtcNow.Returns(times[0], times.Skip(1).ToArray());
}
private void AssertNoErrorLogged()
{
_logger.DidNotReceive().Log(
LogLevel.Error,
Arg.Any<EventId>(),
Arg.Any<object>(),
Arg.Any<Exception>(),
Arg.Any<Func<object, Exception?, string>>());
}
private void AssertWarningLogged(int expectedCount = 1)
{
_logger.Received(expectedCount).Log(
LogLevel.Warning,
Arg.Any<EventId>(),
Arg.Any<object>(),
Arg.Any<Exception>(),
Arg.Any<Func<object, Exception?, string>>());
}
[Fact]
public void Schedule_WithVerySmallDelay_ShouldStillSetupTimer()
{
// Arrange - simulate a case where the delay is very small (1 tick = 100ns)
SetupSystemClock(DefaultNow);
SetupCronParser(DefaultNow.AddTicks(1)); // Only 1 tick in the future (100 nanoseconds)
// Act
CreateScheduledTask();
// Assert - Verify that no error was logged (timer should be set up successfully)
AssertNoErrorLogged();
}
[Fact]
public void Schedule_WithZeroDelay_ShouldRetryAndSetupTimer()
{
// Arrange - simulate a case where the first call returns exactly now
// but the second call returns a proper future time
SetupSystemClock(DefaultNow, DefaultNow);
SetupCronParser(DefaultNow, DefaultNow.AddMinutes(5)); // First: delay=0, Second: proper future time
// Act
Improves workflow deletion and task scheduling (#7088) * Refactor workflow instance deletion to use `IWorkflowRuntime` for enhanced coordination and separation of concerns. * Remove `EnumerableTypeConverter` and update related usages for serialization. - Deleted the `EnumerableTypeConverter` class and its JSON serialization logic. - Removed associated type descriptor attribute in `DefaultFormattersFeature`. - Updated `ObjectFormatter` to handle collection serialization directly with JSON. * Remove `EnumerableTypeConverter` tests and consolidate serialization logic into `ObjectFormatter`. - Deleted `EnumerableTypeConverterTests` as the related functionality was removed. - Added comprehensive tests in `ObjectFormatterTests` to handle serialization of collections and arrays with JSON. * Add integration tests for `TriggerIndexer` to handle workflows with failing materialization - Introduced comprehensive test scenarios verifying `DeleteTriggersAsync` behavior when workflows fail to load or partially succeed. - Enhanced error handling in `TriggerIndexer` to skip failed workflows while ensuring remaining workflows are processed. * Add exception handling in `TriggerIndexer.DeleteTriggersAsync` and integration tests - Enhanced `DeleteTriggersAsync` with exception handling to skip failed workflows while processing others. - Logged warnings for failed workflows without halting execution. - Added comprehensive integration tests to verify behavior across success, failure, and mixed scenarios. - Refactored tests for improved clarity, maintainability, and consistency. * Add exception handling for `ResumeWorkflowTask` to skip deleted workflow instances - Enhanced `ResumeWorkflowTask.ExecuteAsync` to handle `WorkflowInstanceNotFoundException` gracefully when a scheduled workflow instance is missing. - Logged warnings for skipped executions to improve observability. - Ensured remaining workflows and scheduled tasks are processed seamlessly without disruption. * Add thread safety to `LocalScheduler` to prevent race conditions during concurrent scheduling - Introduced a `lock` object to synchronize access to internal dictionaries. - Resolved `IndexOutOfRangeException` caused by concurrent modifications during startup. - Ensured thread-safe operations in `ScheduleAsync`, `ClearScheduleAsync`, and related methods. - Improved reliability and stability of scheduling under concurrent workloads. * Improve exception handling, thread safety, and workflow instance deletion - Added exception handling in `TriggerIndexer.DeleteTriggersAsync` to skip failed workflows while continuing processing. - Enhanced `ResumeWorkflowTask` to handle missing workflow instances gracefully and log warnings. - Introduced thread synchronization in `LocalScheduler` with `lock` to prevent concurrent access issues. - Implemented and refactored tests to ensure behavior consistency and improve maintainability. - Added component tests for workflow deletion scenarios, covering running, completed, and non-existent workflows. * Add component tests for workflow instance deletion and refactor bulk delete logic - Added comprehensive component tests for workflow instance deletion scenarios (running, completed, bulk, and non-existent instances). - Refactored `BulkDelete` API to use `IWorkflowInstanceManager` for proper cleanup of related records (execution logs, activity executions, bookmarks). * Add integration tests and fakes for `TriggerIndexer` to verify behavior with failing and successful workflows - Introduced `FailingMaterializer` and `WorkingMaterializer` for simulating failing and successful workflow materializations. - Added `TriggerDeletionTestScenario`, `TriggerTestDataBuilder`, and related test data classes to define comprehensive test cases. - Updated `DeleteTriggersAsync` tests with scenarios for materialization failures and mixed success. - Improved test coverage and maintainability with reusable test data builders and utilities.
2025-11-21 19:58:38 +00:00
var task = CreateScheduledTask();
// Dispose immediately to prevent timer from firing
((IDisposable)task).Dispose();
Improves workflow deletion and task scheduling (#7088) * Refactor workflow instance deletion to use `IWorkflowRuntime` for enhanced coordination and separation of concerns. * Remove `EnumerableTypeConverter` and update related usages for serialization. - Deleted the `EnumerableTypeConverter` class and its JSON serialization logic. - Removed associated type descriptor attribute in `DefaultFormattersFeature`. - Updated `ObjectFormatter` to handle collection serialization directly with JSON. * Remove `EnumerableTypeConverter` tests and consolidate serialization logic into `ObjectFormatter`. - Deleted `EnumerableTypeConverterTests` as the related functionality was removed. - Added comprehensive tests in `ObjectFormatterTests` to handle serialization of collections and arrays with JSON. * Add integration tests for `TriggerIndexer` to handle workflows with failing materialization - Introduced comprehensive test scenarios verifying `DeleteTriggersAsync` behavior when workflows fail to load or partially succeed. - Enhanced error handling in `TriggerIndexer` to skip failed workflows while ensuring remaining workflows are processed. * Add exception handling in `TriggerIndexer.DeleteTriggersAsync` and integration tests - Enhanced `DeleteTriggersAsync` with exception handling to skip failed workflows while processing others. - Logged warnings for failed workflows without halting execution. - Added comprehensive integration tests to verify behavior across success, failure, and mixed scenarios. - Refactored tests for improved clarity, maintainability, and consistency. * Add exception handling for `ResumeWorkflowTask` to skip deleted workflow instances - Enhanced `ResumeWorkflowTask.ExecuteAsync` to handle `WorkflowInstanceNotFoundException` gracefully when a scheduled workflow instance is missing. - Logged warnings for skipped executions to improve observability. - Ensured remaining workflows and scheduled tasks are processed seamlessly without disruption. * Add thread safety to `LocalScheduler` to prevent race conditions during concurrent scheduling - Introduced a `lock` object to synchronize access to internal dictionaries. - Resolved `IndexOutOfRangeException` caused by concurrent modifications during startup. - Ensured thread-safe operations in `ScheduleAsync`, `ClearScheduleAsync`, and related methods. - Improved reliability and stability of scheduling under concurrent workloads. * Improve exception handling, thread safety, and workflow instance deletion - Added exception handling in `TriggerIndexer.DeleteTriggersAsync` to skip failed workflows while continuing processing. - Enhanced `ResumeWorkflowTask` to handle missing workflow instances gracefully and log warnings. - Introduced thread synchronization in `LocalScheduler` with `lock` to prevent concurrent access issues. - Implemented and refactored tests to ensure behavior consistency and improve maintainability. - Added component tests for workflow deletion scenarios, covering running, completed, and non-existent workflows. * Add component tests for workflow instance deletion and refactor bulk delete logic - Added comprehensive component tests for workflow instance deletion scenarios (running, completed, bulk, and non-existent instances). - Refactored `BulkDelete` API to use `IWorkflowInstanceManager` for proper cleanup of related records (execution logs, activity executions, bookmarks). * Add integration tests and fakes for `TriggerIndexer` to verify behavior with failing and successful workflows - Introduced `FailingMaterializer` and `WorkingMaterializer` for simulating failing and successful workflow materializations. - Added `TriggerDeletionTestScenario`, `TriggerTestDataBuilder`, and related test data classes to define comprehensive test cases. - Updated `DeleteTriggersAsync` tests with scenarios for materialization failures and mixed success. - Improved test coverage and maintainability with reusable test data builders and utilities.
2025-11-21 19:58:38 +00:00
// Assert - Should call GetNextOccurrence at least twice (initial + retry)
// May be called more if timer fires before disposal in rare race conditions
_cronParser.Received().GetNextOccurrence(DefaultCronExpression);
var calls = _cronParser.ReceivedCalls().Count(c => c.GetMethodInfo().Name == nameof(_cronParser.GetNextOccurrence));
Assert.True(calls >= 2, $"Expected at least 2 calls to GetNextOccurrence, but got {calls}");
}
[Fact]
public void Schedule_WithNegativeDelay_ShouldRetryAndSetupTimer()
{
// Arrange - simulate a case where the first call returns a time in the past
SetupSystemClock(DefaultNow, DefaultNow);
SetupCronParser(DefaultNow.AddMinutes(-1), DefaultNow.AddMinutes(5)); // First: past, Second: future
// Act
Improves workflow deletion and task scheduling (#7088) * Refactor workflow instance deletion to use `IWorkflowRuntime` for enhanced coordination and separation of concerns. * Remove `EnumerableTypeConverter` and update related usages for serialization. - Deleted the `EnumerableTypeConverter` class and its JSON serialization logic. - Removed associated type descriptor attribute in `DefaultFormattersFeature`. - Updated `ObjectFormatter` to handle collection serialization directly with JSON. * Remove `EnumerableTypeConverter` tests and consolidate serialization logic into `ObjectFormatter`. - Deleted `EnumerableTypeConverterTests` as the related functionality was removed. - Added comprehensive tests in `ObjectFormatterTests` to handle serialization of collections and arrays with JSON. * Add integration tests for `TriggerIndexer` to handle workflows with failing materialization - Introduced comprehensive test scenarios verifying `DeleteTriggersAsync` behavior when workflows fail to load or partially succeed. - Enhanced error handling in `TriggerIndexer` to skip failed workflows while ensuring remaining workflows are processed. * Add exception handling in `TriggerIndexer.DeleteTriggersAsync` and integration tests - Enhanced `DeleteTriggersAsync` with exception handling to skip failed workflows while processing others. - Logged warnings for failed workflows without halting execution. - Added comprehensive integration tests to verify behavior across success, failure, and mixed scenarios. - Refactored tests for improved clarity, maintainability, and consistency. * Add exception handling for `ResumeWorkflowTask` to skip deleted workflow instances - Enhanced `ResumeWorkflowTask.ExecuteAsync` to handle `WorkflowInstanceNotFoundException` gracefully when a scheduled workflow instance is missing. - Logged warnings for skipped executions to improve observability. - Ensured remaining workflows and scheduled tasks are processed seamlessly without disruption. * Add thread safety to `LocalScheduler` to prevent race conditions during concurrent scheduling - Introduced a `lock` object to synchronize access to internal dictionaries. - Resolved `IndexOutOfRangeException` caused by concurrent modifications during startup. - Ensured thread-safe operations in `ScheduleAsync`, `ClearScheduleAsync`, and related methods. - Improved reliability and stability of scheduling under concurrent workloads. * Improve exception handling, thread safety, and workflow instance deletion - Added exception handling in `TriggerIndexer.DeleteTriggersAsync` to skip failed workflows while continuing processing. - Enhanced `ResumeWorkflowTask` to handle missing workflow instances gracefully and log warnings. - Introduced thread synchronization in `LocalScheduler` with `lock` to prevent concurrent access issues. - Implemented and refactored tests to ensure behavior consistency and improve maintainability. - Added component tests for workflow deletion scenarios, covering running, completed, and non-existent workflows. * Add component tests for workflow instance deletion and refactor bulk delete logic - Added comprehensive component tests for workflow instance deletion scenarios (running, completed, bulk, and non-existent instances). - Refactored `BulkDelete` API to use `IWorkflowInstanceManager` for proper cleanup of related records (execution logs, activity executions, bookmarks). * Add integration tests and fakes for `TriggerIndexer` to verify behavior with failing and successful workflows - Introduced `FailingMaterializer` and `WorkingMaterializer` for simulating failing and successful workflow materializations. - Added `TriggerDeletionTestScenario`, `TriggerTestDataBuilder`, and related test data classes to define comprehensive test cases. - Updated `DeleteTriggersAsync` tests with scenarios for materialization failures and mixed success. - Improved test coverage and maintainability with reusable test data builders and utilities.
2025-11-21 19:58:38 +00:00
var task = CreateScheduledTask();
// Dispose immediately to prevent timer from firing
((IDisposable)task).Dispose();
Thread.Sleep(5); // Brief wait to ensure disposal completes
Improves workflow deletion and task scheduling (#7088) * Refactor workflow instance deletion to use `IWorkflowRuntime` for enhanced coordination and separation of concerns. * Remove `EnumerableTypeConverter` and update related usages for serialization. - Deleted the `EnumerableTypeConverter` class and its JSON serialization logic. - Removed associated type descriptor attribute in `DefaultFormattersFeature`. - Updated `ObjectFormatter` to handle collection serialization directly with JSON. * Remove `EnumerableTypeConverter` tests and consolidate serialization logic into `ObjectFormatter`. - Deleted `EnumerableTypeConverterTests` as the related functionality was removed. - Added comprehensive tests in `ObjectFormatterTests` to handle serialization of collections and arrays with JSON. * Add integration tests for `TriggerIndexer` to handle workflows with failing materialization - Introduced comprehensive test scenarios verifying `DeleteTriggersAsync` behavior when workflows fail to load or partially succeed. - Enhanced error handling in `TriggerIndexer` to skip failed workflows while ensuring remaining workflows are processed. * Add exception handling in `TriggerIndexer.DeleteTriggersAsync` and integration tests - Enhanced `DeleteTriggersAsync` with exception handling to skip failed workflows while processing others. - Logged warnings for failed workflows without halting execution. - Added comprehensive integration tests to verify behavior across success, failure, and mixed scenarios. - Refactored tests for improved clarity, maintainability, and consistency. * Add exception handling for `ResumeWorkflowTask` to skip deleted workflow instances - Enhanced `ResumeWorkflowTask.ExecuteAsync` to handle `WorkflowInstanceNotFoundException` gracefully when a scheduled workflow instance is missing. - Logged warnings for skipped executions to improve observability. - Ensured remaining workflows and scheduled tasks are processed seamlessly without disruption. * Add thread safety to `LocalScheduler` to prevent race conditions during concurrent scheduling - Introduced a `lock` object to synchronize access to internal dictionaries. - Resolved `IndexOutOfRangeException` caused by concurrent modifications during startup. - Ensured thread-safe operations in `ScheduleAsync`, `ClearScheduleAsync`, and related methods. - Improved reliability and stability of scheduling under concurrent workloads. * Improve exception handling, thread safety, and workflow instance deletion - Added exception handling in `TriggerIndexer.DeleteTriggersAsync` to skip failed workflows while continuing processing. - Enhanced `ResumeWorkflowTask` to handle missing workflow instances gracefully and log warnings. - Introduced thread synchronization in `LocalScheduler` with `lock` to prevent concurrent access issues. - Implemented and refactored tests to ensure behavior consistency and improve maintainability. - Added component tests for workflow deletion scenarios, covering running, completed, and non-existent workflows. * Add component tests for workflow instance deletion and refactor bulk delete logic - Added comprehensive component tests for workflow instance deletion scenarios (running, completed, bulk, and non-existent instances). - Refactored `BulkDelete` API to use `IWorkflowInstanceManager` for proper cleanup of related records (execution logs, activity executions, bookmarks). * Add integration tests and fakes for `TriggerIndexer` to verify behavior with failing and successful workflows - Introduced `FailingMaterializer` and `WorkingMaterializer` for simulating failing and successful workflow materializations. - Added `TriggerDeletionTestScenario`, `TriggerTestDataBuilder`, and related test data classes to define comprehensive test cases. - Updated `DeleteTriggersAsync` tests with scenarios for materialization failures and mixed success. - Improved test coverage and maintainability with reusable test data builders and utilities.
2025-11-21 19:58:38 +00:00
// Assert - Should call GetNextOccurrence at least twice
_cronParser.Received().GetNextOccurrence(DefaultCronExpression);
var calls = _cronParser.ReceivedCalls().Count(c => c.GetMethodInfo().Name == nameof(_cronParser.GetNextOccurrence));
Assert.True(calls >= 2, $"Expected at least 2 calls to GetNextOccurrence, but got {calls}");
}
[Fact]
public void Schedule_WithPersistentZeroDelay_ShouldLogWarningAndUseMinimumDelay()
{
// Arrange - simulate the bug scenario: both attempts return zero/negative delay
// This can happen if the system clock doesn't advance or if there's clock drift
Add Elsa Script DSL (#7076) * Update packages.yml * Update elsa-server-and-studio.yml * Update elsa-server.yml * Update elsa-studio.yml (#6715) * Update ListWorkflowDefinitionsRequest.cs (#6761) Remove unnecessary line breaks * Correct namespace and import for `ConfigureEngineWithVariableTypes`. * Resolves build issues, update package versions and restructure project references - Updated multiple package versions in `Directory.Packages.props` for better dependency management, including `BenchmarkDotNet`, `FastEndpoints`, and `Microsoft.Extensions.Http.Resilience`. - Minor version upgrade for `System.Formats.Asn1` in `_build.csproj`. - Replaced project reference to `Elsa.csproj` with `Elsa.IO.Http.csproj` in `Elsa.ServerAndStudio.Web.csproj`, enhancing modularity. - Added new using directive for `Elsa.IO.Http.Features` in `Program.cs` to support new HTTP functionalities. * Remove unused project references from Elsa.sln These changes indicate that the associated projects or dependencies are no longer needed or have been replaced by other components in the solution. * Rename copilot-setup-steps.yml.yml to copilot-setup-steps.yml * Update RawStringContent encoding in JsonContentFactory (#6786) * Update RawStringContent encoding in JsonContentFactory Modified the instantiation of `RawStringContent` to use a new `UTF8Encoding` instance with `encoderShouldEmitUTF8Identifier` set to `false`, affecting the handling of the UTF-8 byte order mark (BOM) in serialized JSON content. Fixes a bug with content length being different than expected. * Refactor JsonContentFactory to reuse UTF8Encoding Introduced a private static readonly field `_utf8Encoding` in the `JsonContentFactory` class to improve code readability and performance. This change replaces the instantiation of `UTF8Encoding` in the `CreateHttpContent` method, allowing for the reuse of the same encoding instance. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Enhance thread safety with ConcurrentDictionary usage (#6760) * Enhance thread safety with ConcurrentDictionary usage Replaced `IDictionary` with `ConcurrentDictionary` for both `_scheduledTasks` and `_scheduledTaskKeys` to improve thread safety in a multi-threaded environment. Updated methods `RegisterScheduledTask`, `RemoveScheduledTask`, and `RemoveScheduledTasks` to utilize the `Remove` method of `ConcurrentDictionary`, ensuring safe and efficient removal of scheduled tasks. * Refactor task registration and removal logic Updated `RegisterScheduledTask` to use `AddOrUpdate` for streamlined task management. This change simplifies the addition and updating of scheduled tasks by consolidating logic into a single operation. Introduced `RemoveScheduledTask` method to handle task removal by name, improving code organization and clarity. * Improve task removal handling in LocalScheduler Modified the `LocalScheduler` class to enhance the removal process of scheduled tasks from the `_scheduledTaskKeys` collection. The removal operation now captures the result in a variable and includes a conditional check to log a warning if the task was not found, improving error handling and debugging capabilities. * Refactor task removal in LocalScheduler Updated the removal process for scheduled tasks in `_scheduledTasks`. The new implementation collects all corresponding keys and attempts to remove them individually, logging warnings for any failures. This enhances error handling and provides better debugging information. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Add IAsyncEnumerable check to ItemSourceActivityExecutionContextExtensions.GetItemSource (#6897) * Use FullName in WorkflowDictionary (#6923) * Fixed ParentWorkflowInstanceId not being set (#7029) Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> * Remove unused solution projects and update package references - Deleted several project references from `Elsa.sln` to clean up the solution. - Updated `Directory.Packages.props` for consistency and alignment with the latest package versions. * Simplify CI pipeline by removing `Test` step from `Compile+Test+Pack` process. * Initial plan * Add ElsaScript DSL module with parser and compiler Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add integration tests for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add comprehensive documentation for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor workflow activity instantiation logic - Removed `ActivityFactory` and its related interfaces and extensions. - Introduced `ActivityActivator` for handling activity creation. - Extended AST with support for comprehensive workflow structures: - Added nodes for flowcharts, if/else, loops, and variable declarations. - Updated `IElsaScriptCompiler` to use asynchronous methods. - Expanded `ElsaScriptParser` to simplify syntax for `UseNode` and argument parsing. - Adjusted compiler and parser for compatibility with new workflow AST model. * Refactor test method names for clarity and add new compiler and parser tests - Updated method names in `CompilerTests` and `ParserTests` for better readability and description of test intent. - Added tests for compiler and parser: - Support for workflows without the `workflow` keyword. * Refactor `ElsaScriptParser` to improve statement parsing and introduce a tokenizer - Added `TokenizeStatements` method to split source into statements for enhanced parsing accuracy. - Updated logic to process statements instead of raw lines, reducing parsing complexity and improving reliability. - Improved handling of workflow and statement parsing, including edge cases with braces, parentheses, and string literals. * Introduce ElsaScript support for BlobStorage workflow provider - Added the `Elsa.WorkflowProviders.BlobStorage.ElsaScript` module to enable ElsaScript-based workflow definitions for BlobStorage. - Implemented `ElsaScriptBlobWorkflowFormatHandler` for parsing ElsaScript workflows stored in BlobStorage. - Extended `ElsaScriptParser` to leverage Parlot for improved DSL parsing. - Introduced `IBlobWorkflowFormatHandler` to centralize workflow format handling and parsing. - Updated `Elsa.Server.Web` to reference the new module and include an ElsaScript "Hello World" example workflow. * Refactor ElsaScript services, update logging, and improve workflow handling - Changed `ElsaScriptCompiler` service registration from `Singleton` to `Scoped` for better dependency management. - Enhanced the "Hello World" example workflow and added `CopyToOutputDirectory` configuration. - Removed unused namespaces and adjusted references in multiple projects to improve maintainability. - Updated logging levels in `appsettings.json` to reduce unnecessary debug output. - Improved `PolymorphicObjectConverter` by removing redundant dependencies. - Added missing references to enhance feature support and ensure compatibility. * Refactor activity instantiation and improve argument handling in `ElsaScriptCompiler` - Added support for positional arguments with constructor matching logic. - Refactored `InstantiateActivityUsingConstructor` to enhance activity creation. - Updated `ActivityDescriptor` and related types to include `ClrType` for streamlined activity resolution. - Simplified `TypedActivityProvider` by annotating it with `[UsedImplicitly]`. - Adjusted `ElsaScriptParser` to remove unnecessary options from string literal definitions. * Add HTTP-enabled "Hello World" workflow and support for additional HTTP activity constructors - Introduced a new ElsaScript example workflow `hello-world-http.elsa` with an HTTP endpoint and response. - Enhanced `HttpEndpoint` and `WriteHttpResponse` activities with additional constructors for improved flexibility. - Updated project to include the new workflow in the output directory. * Enhance `ElsaScriptParser` with a custom parser to handle nested raw expressions for ElsaScript workflows - Introduced `RawExpressionParser` to parse raw text after `=>` up to a matching closing parenthesis. - Updated `elsaExpressionWithLang` and `elsaExpressionWithoutLang` to use `RawExpressionParser`. - Trimmed whitespace in parsed expressions. - Added integration and parser tests for complex workflows with variables and expressions. - Updated example workflow `hello-world-http.elsa` to demonstrate expression usage. - Added `Elsa.Http` module reference to enable HTTP-based activities. * Update "Hello World" workflow to simplify naming and enhance response logic - Renamed workflow from `HelloWorldHttpDsl2` to `HelloWorldHttpDsl`. - Updated HTTP endpoint path to `/hello-world-dsl` for consistency. - Improved response logic by utilizing `getMessage()` JavaScript function. * Add support for `OriginalSource` in workflow materialization and enhance ElsaScript materializer - Introduced `OriginalSource` property in `WorkflowDefinition` and `MaterializedWorkflow` for preserving original source representation (e.g., ElsaScript, JSON, YAML). - Added `ElsaScriptWorkflowMaterializer` implementation to materialize workflows directly from ElsaScript source. - Updated `DefaultWorkflowDefinitionStorePopulator` to determine `StringData` or `OriginalSource` based on materialized workflow format. - Enhanced `WorkflowDefinitionMapper` to support symmetric round-tripping with `OriginalSource`. - Registered `ElsaScriptWorkflowMaterializer` in `ElsaScriptFeature` for dependency injection. - Updated `JsonBlobWorkflowFormatHandler` and added `OriginalSource` support for round-trip preservation. - Simplified `ElsaScriptParser` by aligning variable and parser naming. * Update V3_6 migrations for PostgreSQL, MySQL, and Oracle databases and associated designer files. * Handle disposal and race conditions in `ScheduledCronTask` - Added `_disposed` flag to prevent accessing disposed resources. - Updated `_executionSemaphore` and `_scopeFactory` logic to safely handle `ObjectDisposedException`. - Enhanced task scheduling and timer disposal with additional safeguards against race conditions. - Modified tests to ensure proper disposal and logging behavior when handling edge cases. * Add support for metadata in ElsaScript workflows and enhance parser and compiler functionality - Introduced metadata syntax in ElsaScript workflows (e.g., `DisplayName`, `Description`, `Version`) to enable metadata-driven behavior. - Enhanced `ElsaScriptCompiler` to process metadata and properly integrate it into `Workflow` objects. - Updated `ElsaScriptParser` to parse program-level AST with support for multiple workflows and global use statements. - Refactored tests to validate metadata parsing and ensure backward compatibility with existing workflows. - Added new test cases to cover scenarios like metadata parsing, compilation, and multi-workflow programs. * Add support for `foreach` loops in ElsaScript and remove `let` keyword - Introduced `foreach` loop syntax in `ElsaScriptParser` and `ElsaScriptCompiler`, enabling iteration over collections with optional variable declaration. - Updated `ForNode` and `ForEachNode` to include a `DeclaresVariable` flag for improved variable handling. - Removed support for the `let` keyword in variable declarations, streamlining syntax to use `var` and `const` only. - Enhanced `for` loop syntax to support optional `var` declaration and block or single-statement bodies. - Refactored test cases to validate `foreach` and `for` loop enhancements and ensure backward compatibility. * Simplify ElsaScript workflow syntax by removing redundant quotes in workflow identifiers and updating `for` loop syntax for clarity and consistency. * Remove redundant quotes from workflow identifiers in integration tests * Simplify Elsa scripts and improve error handling - Removed redundant braces in workflow declarations for streamlined syntax. - Enhanced logging in `JsonBlobWorkflowFormatHandler` and `ElsaScriptBlobWorkflowFormatHandler` to warn on parsing errors and provide context. - Updated configuration to log errors for `Elsa.Workflows.ActivityRegistry`. - Refined "Hello World" and "For Loop" workflows for clarity and added improved loop handling. * Refine Elsa workflows and update compiler logic - Simplified "Hello World" workflow by adding braces and improving consistency. - Adjusted "For Loop" workflow to rename and clarify logic, including expression updates and variable handling. - Fixed compiler mapping of `"cs"` to `"CSharp"` for better clarity. - Enhanced "Hello World HTTP" workflow to correctly reference `variables.message` in expressions. * Add flowchart support in ElsaScript parser, compiler, and integration tests - Introduced `flowchart` syntax in `ElsaScriptParser` to support flowchart-based workflows. - Updated `ElsaScriptCompiler` to compile `flowchart` nodes with labeled activities, connections, entry points, and variables. - Added integration tests for parsing and compiling empty and simple flowcharts. - Enhanced `FlowchartNode` and `LabeledActivityNode` for better representation of flowchart structures. - Improved error handling and logging for invalid flowchart configurations. * Add tests for compiling and parsing flowcharts with nodes, connections, and block nodes in ElsaScript - Added integration tests for compiling and validating flowchart structures, including activities, connections, and entry points. - Implemented parser tests for parsing flowcharts with node connections and block nodes. - Updated project files to include new workflow examples for testing. * Add Parlot package and update project file in integration tests - Added `Parlot` package version `0.0.27` to `Directory.Packages.props`. - Updated integration test project file to include a new `Include` directive for better targeting. * Update Parlot package to version 1.5.2 in Directory.Packages.props * Remove `elsa-server-and-studio.yml` workflow and update solution file - Deleted `elsa-server-and-studio.yml` workflow as it's no longer needed. - Updated `Elsa.sln` to remove reference to the deleted workflow. * Remove `elsa-studio.yml` workflow and update solution and packages - Deleted `elsa-studio.yml` workflow as it's no longer used. - Updated `Elsa.sln` to remove reference to the deleted workflow. - Changed `base_version` in `packages.yml` from `3.7.0` to `3.6.0`. * Downgrade Docker image in `elsa-server.yml` workflow from `v3.7.0-preview` to `v3.6.0-preview` * Update Docker image tag in `elsa-server.yml` workflow from `v3.6.0-preview` to `v3.6-preview` * Add logging support to `LocalScheduler` and replace `Debug.WriteLine` with `ILogger` * Remove unused `System.Collections.Generic` and `Elsa.Extensions` imports in `LocalScheduler` - Cleaned up unnecessary using directives to improve code readability and maintainability. - Minor whitespace adjustment for consistent formatting. * Remove unnecessary whitespace in `LocalScheduler` for consistent formatting * Improve exception handling in blob workflow format handlers - Updated exception handling in `ElsaScriptBlobWorkflowFormatHandler` and `JsonBlobWorkflowFormatHandler` to gracefully catch and log all exceptions during workflow parsing. - Adjusted comments to clarify behavior for invalid user-provided files, ensuring the workflow loading process is not disrupted. * Refactor blob workflow format handlers to use `SupportedExtensions` for improved file filtering - Added `SupportedExtensions` property to all blob format handlers to optimize blob storage browsing. - Simplified `CanHandle` logic by removing extension checks, leveraging `SupportedExtensions` for initial filtering. - Updated comments for clarity and consistency across handlers. * Refactor `DefaultWorkflowDefinitionStorePopulator` to simplify `stringData` assignment logic and improve readability * Remove outdated comment in `CompilerTests` about skipped tests * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Refactor `ElsaScriptCompiler` to streamline type conversion logic, improve language mapping, and enhance asynchronous flowchart compilation * [WIP] Update ParseError printing based on feedback (#7082) * Initial plan * Fix ParseError formatting to use Message and Position properties Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Replace `as` casts with direct casts in ParserTests for null safety (#7083) * Initial plan * Replace 'as' casts with direct casts in ParserTests for better null safety Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix Oracle column types for OriginalSource and other large text fields (#7079) * Initial plan * Fix Oracle OriginalSource and StringData column types to handle large data Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor tests to replace type checks with `Assert.IsType` for improved clarity and type safety * Initial plan (#7080) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * Add `Parlot` package reference and update solution structure by removing and reorganizing projects and workflows. * Set default expression language to "JavaScript" in `ElsaScriptCompiler`. * Add integration test to verify default expression language resets between ElsaScript compilations * Simplify UTF-8 encoding in JsonContentFactory (#7081) * Initial plan * Remove explicit UTF8Encoding in JsonContentFactory and use Encoding.UTF8 Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix test to use Encoding.UTF8.GetByteCount for multi-byte character support Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: Ender <37611092+zengande@users.noreply.github.com> Co-authored-by: Matt <knibbsy10@live.com> Co-authored-by: Max Brooks <45081361+MaxBrooks114@users.noreply.github.com> Co-authored-by: Max Brooks <Max@compyl.com> Co-authored-by: FuJa0815 <30809803+FuJa0815@users.noreply.github.com> Co-authored-by: Peter Klooster <crashkonijn@gmail.com> Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-25 18:57:50 +00:00
// After the initial attempts, return a proper future time to prevent timer from firing during test
SetupSystemClock(DefaultNow);
Add Elsa Script DSL (#7076) * Update packages.yml * Update elsa-server-and-studio.yml * Update elsa-server.yml * Update elsa-studio.yml (#6715) * Update ListWorkflowDefinitionsRequest.cs (#6761) Remove unnecessary line breaks * Correct namespace and import for `ConfigureEngineWithVariableTypes`. * Resolves build issues, update package versions and restructure project references - Updated multiple package versions in `Directory.Packages.props` for better dependency management, including `BenchmarkDotNet`, `FastEndpoints`, and `Microsoft.Extensions.Http.Resilience`. - Minor version upgrade for `System.Formats.Asn1` in `_build.csproj`. - Replaced project reference to `Elsa.csproj` with `Elsa.IO.Http.csproj` in `Elsa.ServerAndStudio.Web.csproj`, enhancing modularity. - Added new using directive for `Elsa.IO.Http.Features` in `Program.cs` to support new HTTP functionalities. * Remove unused project references from Elsa.sln These changes indicate that the associated projects or dependencies are no longer needed or have been replaced by other components in the solution. * Rename copilot-setup-steps.yml.yml to copilot-setup-steps.yml * Update RawStringContent encoding in JsonContentFactory (#6786) * Update RawStringContent encoding in JsonContentFactory Modified the instantiation of `RawStringContent` to use a new `UTF8Encoding` instance with `encoderShouldEmitUTF8Identifier` set to `false`, affecting the handling of the UTF-8 byte order mark (BOM) in serialized JSON content. Fixes a bug with content length being different than expected. * Refactor JsonContentFactory to reuse UTF8Encoding Introduced a private static readonly field `_utf8Encoding` in the `JsonContentFactory` class to improve code readability and performance. This change replaces the instantiation of `UTF8Encoding` in the `CreateHttpContent` method, allowing for the reuse of the same encoding instance. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Enhance thread safety with ConcurrentDictionary usage (#6760) * Enhance thread safety with ConcurrentDictionary usage Replaced `IDictionary` with `ConcurrentDictionary` for both `_scheduledTasks` and `_scheduledTaskKeys` to improve thread safety in a multi-threaded environment. Updated methods `RegisterScheduledTask`, `RemoveScheduledTask`, and `RemoveScheduledTasks` to utilize the `Remove` method of `ConcurrentDictionary`, ensuring safe and efficient removal of scheduled tasks. * Refactor task registration and removal logic Updated `RegisterScheduledTask` to use `AddOrUpdate` for streamlined task management. This change simplifies the addition and updating of scheduled tasks by consolidating logic into a single operation. Introduced `RemoveScheduledTask` method to handle task removal by name, improving code organization and clarity. * Improve task removal handling in LocalScheduler Modified the `LocalScheduler` class to enhance the removal process of scheduled tasks from the `_scheduledTaskKeys` collection. The removal operation now captures the result in a variable and includes a conditional check to log a warning if the task was not found, improving error handling and debugging capabilities. * Refactor task removal in LocalScheduler Updated the removal process for scheduled tasks in `_scheduledTasks`. The new implementation collects all corresponding keys and attempts to remove them individually, logging warnings for any failures. This enhances error handling and provides better debugging information. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Add IAsyncEnumerable check to ItemSourceActivityExecutionContextExtensions.GetItemSource (#6897) * Use FullName in WorkflowDictionary (#6923) * Fixed ParentWorkflowInstanceId not being set (#7029) Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> * Remove unused solution projects and update package references - Deleted several project references from `Elsa.sln` to clean up the solution. - Updated `Directory.Packages.props` for consistency and alignment with the latest package versions. * Simplify CI pipeline by removing `Test` step from `Compile+Test+Pack` process. * Initial plan * Add ElsaScript DSL module with parser and compiler Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add integration tests for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add comprehensive documentation for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor workflow activity instantiation logic - Removed `ActivityFactory` and its related interfaces and extensions. - Introduced `ActivityActivator` for handling activity creation. - Extended AST with support for comprehensive workflow structures: - Added nodes for flowcharts, if/else, loops, and variable declarations. - Updated `IElsaScriptCompiler` to use asynchronous methods. - Expanded `ElsaScriptParser` to simplify syntax for `UseNode` and argument parsing. - Adjusted compiler and parser for compatibility with new workflow AST model. * Refactor test method names for clarity and add new compiler and parser tests - Updated method names in `CompilerTests` and `ParserTests` for better readability and description of test intent. - Added tests for compiler and parser: - Support for workflows without the `workflow` keyword. * Refactor `ElsaScriptParser` to improve statement parsing and introduce a tokenizer - Added `TokenizeStatements` method to split source into statements for enhanced parsing accuracy. - Updated logic to process statements instead of raw lines, reducing parsing complexity and improving reliability. - Improved handling of workflow and statement parsing, including edge cases with braces, parentheses, and string literals. * Introduce ElsaScript support for BlobStorage workflow provider - Added the `Elsa.WorkflowProviders.BlobStorage.ElsaScript` module to enable ElsaScript-based workflow definitions for BlobStorage. - Implemented `ElsaScriptBlobWorkflowFormatHandler` for parsing ElsaScript workflows stored in BlobStorage. - Extended `ElsaScriptParser` to leverage Parlot for improved DSL parsing. - Introduced `IBlobWorkflowFormatHandler` to centralize workflow format handling and parsing. - Updated `Elsa.Server.Web` to reference the new module and include an ElsaScript "Hello World" example workflow. * Refactor ElsaScript services, update logging, and improve workflow handling - Changed `ElsaScriptCompiler` service registration from `Singleton` to `Scoped` for better dependency management. - Enhanced the "Hello World" example workflow and added `CopyToOutputDirectory` configuration. - Removed unused namespaces and adjusted references in multiple projects to improve maintainability. - Updated logging levels in `appsettings.json` to reduce unnecessary debug output. - Improved `PolymorphicObjectConverter` by removing redundant dependencies. - Added missing references to enhance feature support and ensure compatibility. * Refactor activity instantiation and improve argument handling in `ElsaScriptCompiler` - Added support for positional arguments with constructor matching logic. - Refactored `InstantiateActivityUsingConstructor` to enhance activity creation. - Updated `ActivityDescriptor` and related types to include `ClrType` for streamlined activity resolution. - Simplified `TypedActivityProvider` by annotating it with `[UsedImplicitly]`. - Adjusted `ElsaScriptParser` to remove unnecessary options from string literal definitions. * Add HTTP-enabled "Hello World" workflow and support for additional HTTP activity constructors - Introduced a new ElsaScript example workflow `hello-world-http.elsa` with an HTTP endpoint and response. - Enhanced `HttpEndpoint` and `WriteHttpResponse` activities with additional constructors for improved flexibility. - Updated project to include the new workflow in the output directory. * Enhance `ElsaScriptParser` with a custom parser to handle nested raw expressions for ElsaScript workflows - Introduced `RawExpressionParser` to parse raw text after `=>` up to a matching closing parenthesis. - Updated `elsaExpressionWithLang` and `elsaExpressionWithoutLang` to use `RawExpressionParser`. - Trimmed whitespace in parsed expressions. - Added integration and parser tests for complex workflows with variables and expressions. - Updated example workflow `hello-world-http.elsa` to demonstrate expression usage. - Added `Elsa.Http` module reference to enable HTTP-based activities. * Update "Hello World" workflow to simplify naming and enhance response logic - Renamed workflow from `HelloWorldHttpDsl2` to `HelloWorldHttpDsl`. - Updated HTTP endpoint path to `/hello-world-dsl` for consistency. - Improved response logic by utilizing `getMessage()` JavaScript function. * Add support for `OriginalSource` in workflow materialization and enhance ElsaScript materializer - Introduced `OriginalSource` property in `WorkflowDefinition` and `MaterializedWorkflow` for preserving original source representation (e.g., ElsaScript, JSON, YAML). - Added `ElsaScriptWorkflowMaterializer` implementation to materialize workflows directly from ElsaScript source. - Updated `DefaultWorkflowDefinitionStorePopulator` to determine `StringData` or `OriginalSource` based on materialized workflow format. - Enhanced `WorkflowDefinitionMapper` to support symmetric round-tripping with `OriginalSource`. - Registered `ElsaScriptWorkflowMaterializer` in `ElsaScriptFeature` for dependency injection. - Updated `JsonBlobWorkflowFormatHandler` and added `OriginalSource` support for round-trip preservation. - Simplified `ElsaScriptParser` by aligning variable and parser naming. * Update V3_6 migrations for PostgreSQL, MySQL, and Oracle databases and associated designer files. * Handle disposal and race conditions in `ScheduledCronTask` - Added `_disposed` flag to prevent accessing disposed resources. - Updated `_executionSemaphore` and `_scopeFactory` logic to safely handle `ObjectDisposedException`. - Enhanced task scheduling and timer disposal with additional safeguards against race conditions. - Modified tests to ensure proper disposal and logging behavior when handling edge cases. * Add support for metadata in ElsaScript workflows and enhance parser and compiler functionality - Introduced metadata syntax in ElsaScript workflows (e.g., `DisplayName`, `Description`, `Version`) to enable metadata-driven behavior. - Enhanced `ElsaScriptCompiler` to process metadata and properly integrate it into `Workflow` objects. - Updated `ElsaScriptParser` to parse program-level AST with support for multiple workflows and global use statements. - Refactored tests to validate metadata parsing and ensure backward compatibility with existing workflows. - Added new test cases to cover scenarios like metadata parsing, compilation, and multi-workflow programs. * Add support for `foreach` loops in ElsaScript and remove `let` keyword - Introduced `foreach` loop syntax in `ElsaScriptParser` and `ElsaScriptCompiler`, enabling iteration over collections with optional variable declaration. - Updated `ForNode` and `ForEachNode` to include a `DeclaresVariable` flag for improved variable handling. - Removed support for the `let` keyword in variable declarations, streamlining syntax to use `var` and `const` only. - Enhanced `for` loop syntax to support optional `var` declaration and block or single-statement bodies. - Refactored test cases to validate `foreach` and `for` loop enhancements and ensure backward compatibility. * Simplify ElsaScript workflow syntax by removing redundant quotes in workflow identifiers and updating `for` loop syntax for clarity and consistency. * Remove redundant quotes from workflow identifiers in integration tests * Simplify Elsa scripts and improve error handling - Removed redundant braces in workflow declarations for streamlined syntax. - Enhanced logging in `JsonBlobWorkflowFormatHandler` and `ElsaScriptBlobWorkflowFormatHandler` to warn on parsing errors and provide context. - Updated configuration to log errors for `Elsa.Workflows.ActivityRegistry`. - Refined "Hello World" and "For Loop" workflows for clarity and added improved loop handling. * Refine Elsa workflows and update compiler logic - Simplified "Hello World" workflow by adding braces and improving consistency. - Adjusted "For Loop" workflow to rename and clarify logic, including expression updates and variable handling. - Fixed compiler mapping of `"cs"` to `"CSharp"` for better clarity. - Enhanced "Hello World HTTP" workflow to correctly reference `variables.message` in expressions. * Add flowchart support in ElsaScript parser, compiler, and integration tests - Introduced `flowchart` syntax in `ElsaScriptParser` to support flowchart-based workflows. - Updated `ElsaScriptCompiler` to compile `flowchart` nodes with labeled activities, connections, entry points, and variables. - Added integration tests for parsing and compiling empty and simple flowcharts. - Enhanced `FlowchartNode` and `LabeledActivityNode` for better representation of flowchart structures. - Improved error handling and logging for invalid flowchart configurations. * Add tests for compiling and parsing flowcharts with nodes, connections, and block nodes in ElsaScript - Added integration tests for compiling and validating flowchart structures, including activities, connections, and entry points. - Implemented parser tests for parsing flowcharts with node connections and block nodes. - Updated project files to include new workflow examples for testing. * Add Parlot package and update project file in integration tests - Added `Parlot` package version `0.0.27` to `Directory.Packages.props`. - Updated integration test project file to include a new `Include` directive for better targeting. * Update Parlot package to version 1.5.2 in Directory.Packages.props * Remove `elsa-server-and-studio.yml` workflow and update solution file - Deleted `elsa-server-and-studio.yml` workflow as it's no longer needed. - Updated `Elsa.sln` to remove reference to the deleted workflow. * Remove `elsa-studio.yml` workflow and update solution and packages - Deleted `elsa-studio.yml` workflow as it's no longer used. - Updated `Elsa.sln` to remove reference to the deleted workflow. - Changed `base_version` in `packages.yml` from `3.7.0` to `3.6.0`. * Downgrade Docker image in `elsa-server.yml` workflow from `v3.7.0-preview` to `v3.6.0-preview` * Update Docker image tag in `elsa-server.yml` workflow from `v3.6.0-preview` to `v3.6-preview` * Add logging support to `LocalScheduler` and replace `Debug.WriteLine` with `ILogger` * Remove unused `System.Collections.Generic` and `Elsa.Extensions` imports in `LocalScheduler` - Cleaned up unnecessary using directives to improve code readability and maintainability. - Minor whitespace adjustment for consistent formatting. * Remove unnecessary whitespace in `LocalScheduler` for consistent formatting * Improve exception handling in blob workflow format handlers - Updated exception handling in `ElsaScriptBlobWorkflowFormatHandler` and `JsonBlobWorkflowFormatHandler` to gracefully catch and log all exceptions during workflow parsing. - Adjusted comments to clarify behavior for invalid user-provided files, ensuring the workflow loading process is not disrupted. * Refactor blob workflow format handlers to use `SupportedExtensions` for improved file filtering - Added `SupportedExtensions` property to all blob format handlers to optimize blob storage browsing. - Simplified `CanHandle` logic by removing extension checks, leveraging `SupportedExtensions` for initial filtering. - Updated comments for clarity and consistency across handlers. * Refactor `DefaultWorkflowDefinitionStorePopulator` to simplify `stringData` assignment logic and improve readability * Remove outdated comment in `CompilerTests` about skipped tests * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Refactor `ElsaScriptCompiler` to streamline type conversion logic, improve language mapping, and enhance asynchronous flowchart compilation * [WIP] Update ParseError printing based on feedback (#7082) * Initial plan * Fix ParseError formatting to use Message and Position properties Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Replace `as` casts with direct casts in ParserTests for null safety (#7083) * Initial plan * Replace 'as' casts with direct casts in ParserTests for better null safety Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix Oracle column types for OriginalSource and other large text fields (#7079) * Initial plan * Fix Oracle OriginalSource and StringData column types to handle large data Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor tests to replace type checks with `Assert.IsType` for improved clarity and type safety * Initial plan (#7080) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * Add `Parlot` package reference and update solution structure by removing and reorganizing projects and workflows. * Set default expression language to "JavaScript" in `ElsaScriptCompiler`. * Add integration test to verify default expression language resets between ElsaScript compilations * Simplify UTF-8 encoding in JsonContentFactory (#7081) * Initial plan * Remove explicit UTF8Encoding in JsonContentFactory and use Encoding.UTF8 Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix test to use Encoding.UTF8.GetByteCount for multi-byte character support Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: Ender <37611092+zengande@users.noreply.github.com> Co-authored-by: Matt <knibbsy10@live.com> Co-authored-by: Max Brooks <45081361+MaxBrooks114@users.noreply.github.com> Co-authored-by: Max Brooks <Max@compyl.com> Co-authored-by: FuJa0815 <30809803+FuJa0815@users.noreply.github.com> Co-authored-by: Peter Klooster <crashkonijn@gmail.com> Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-25 18:57:50 +00:00
SetupCronParser(DefaultNow, DefaultNow, DefaultNow.AddMinutes(5)); // First two return now, third returns future
// Act - This should not crash and should set up a timer with minimum delay
Improves workflow deletion and task scheduling (#7088) * Refactor workflow instance deletion to use `IWorkflowRuntime` for enhanced coordination and separation of concerns. * Remove `EnumerableTypeConverter` and update related usages for serialization. - Deleted the `EnumerableTypeConverter` class and its JSON serialization logic. - Removed associated type descriptor attribute in `DefaultFormattersFeature`. - Updated `ObjectFormatter` to handle collection serialization directly with JSON. * Remove `EnumerableTypeConverter` tests and consolidate serialization logic into `ObjectFormatter`. - Deleted `EnumerableTypeConverterTests` as the related functionality was removed. - Added comprehensive tests in `ObjectFormatterTests` to handle serialization of collections and arrays with JSON. * Add integration tests for `TriggerIndexer` to handle workflows with failing materialization - Introduced comprehensive test scenarios verifying `DeleteTriggersAsync` behavior when workflows fail to load or partially succeed. - Enhanced error handling in `TriggerIndexer` to skip failed workflows while ensuring remaining workflows are processed. * Add exception handling in `TriggerIndexer.DeleteTriggersAsync` and integration tests - Enhanced `DeleteTriggersAsync` with exception handling to skip failed workflows while processing others. - Logged warnings for failed workflows without halting execution. - Added comprehensive integration tests to verify behavior across success, failure, and mixed scenarios. - Refactored tests for improved clarity, maintainability, and consistency. * Add exception handling for `ResumeWorkflowTask` to skip deleted workflow instances - Enhanced `ResumeWorkflowTask.ExecuteAsync` to handle `WorkflowInstanceNotFoundException` gracefully when a scheduled workflow instance is missing. - Logged warnings for skipped executions to improve observability. - Ensured remaining workflows and scheduled tasks are processed seamlessly without disruption. * Add thread safety to `LocalScheduler` to prevent race conditions during concurrent scheduling - Introduced a `lock` object to synchronize access to internal dictionaries. - Resolved `IndexOutOfRangeException` caused by concurrent modifications during startup. - Ensured thread-safe operations in `ScheduleAsync`, `ClearScheduleAsync`, and related methods. - Improved reliability and stability of scheduling under concurrent workloads. * Improve exception handling, thread safety, and workflow instance deletion - Added exception handling in `TriggerIndexer.DeleteTriggersAsync` to skip failed workflows while continuing processing. - Enhanced `ResumeWorkflowTask` to handle missing workflow instances gracefully and log warnings. - Introduced thread synchronization in `LocalScheduler` with `lock` to prevent concurrent access issues. - Implemented and refactored tests to ensure behavior consistency and improve maintainability. - Added component tests for workflow deletion scenarios, covering running, completed, and non-existent workflows. * Add component tests for workflow instance deletion and refactor bulk delete logic - Added comprehensive component tests for workflow instance deletion scenarios (running, completed, bulk, and non-existent instances). - Refactored `BulkDelete` API to use `IWorkflowInstanceManager` for proper cleanup of related records (execution logs, activity executions, bookmarks). * Add integration tests and fakes for `TriggerIndexer` to verify behavior with failing and successful workflows - Introduced `FailingMaterializer` and `WorkingMaterializer` for simulating failing and successful workflow materializations. - Added `TriggerDeletionTestScenario`, `TriggerTestDataBuilder`, and related test data classes to define comprehensive test cases. - Updated `DeleteTriggersAsync` tests with scenarios for materialization failures and mixed success. - Improved test coverage and maintainability with reusable test data builders and utilities.
2025-11-21 19:58:38 +00:00
var task = CreateScheduledTask();
// Dispose immediately to prevent timer from firing and recursing
Add Elsa Script DSL (#7076) * Update packages.yml * Update elsa-server-and-studio.yml * Update elsa-server.yml * Update elsa-studio.yml (#6715) * Update ListWorkflowDefinitionsRequest.cs (#6761) Remove unnecessary line breaks * Correct namespace and import for `ConfigureEngineWithVariableTypes`. * Resolves build issues, update package versions and restructure project references - Updated multiple package versions in `Directory.Packages.props` for better dependency management, including `BenchmarkDotNet`, `FastEndpoints`, and `Microsoft.Extensions.Http.Resilience`. - Minor version upgrade for `System.Formats.Asn1` in `_build.csproj`. - Replaced project reference to `Elsa.csproj` with `Elsa.IO.Http.csproj` in `Elsa.ServerAndStudio.Web.csproj`, enhancing modularity. - Added new using directive for `Elsa.IO.Http.Features` in `Program.cs` to support new HTTP functionalities. * Remove unused project references from Elsa.sln These changes indicate that the associated projects or dependencies are no longer needed or have been replaced by other components in the solution. * Rename copilot-setup-steps.yml.yml to copilot-setup-steps.yml * Update RawStringContent encoding in JsonContentFactory (#6786) * Update RawStringContent encoding in JsonContentFactory Modified the instantiation of `RawStringContent` to use a new `UTF8Encoding` instance with `encoderShouldEmitUTF8Identifier` set to `false`, affecting the handling of the UTF-8 byte order mark (BOM) in serialized JSON content. Fixes a bug with content length being different than expected. * Refactor JsonContentFactory to reuse UTF8Encoding Introduced a private static readonly field `_utf8Encoding` in the `JsonContentFactory` class to improve code readability and performance. This change replaces the instantiation of `UTF8Encoding` in the `CreateHttpContent` method, allowing for the reuse of the same encoding instance. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Enhance thread safety with ConcurrentDictionary usage (#6760) * Enhance thread safety with ConcurrentDictionary usage Replaced `IDictionary` with `ConcurrentDictionary` for both `_scheduledTasks` and `_scheduledTaskKeys` to improve thread safety in a multi-threaded environment. Updated methods `RegisterScheduledTask`, `RemoveScheduledTask`, and `RemoveScheduledTasks` to utilize the `Remove` method of `ConcurrentDictionary`, ensuring safe and efficient removal of scheduled tasks. * Refactor task registration and removal logic Updated `RegisterScheduledTask` to use `AddOrUpdate` for streamlined task management. This change simplifies the addition and updating of scheduled tasks by consolidating logic into a single operation. Introduced `RemoveScheduledTask` method to handle task removal by name, improving code organization and clarity. * Improve task removal handling in LocalScheduler Modified the `LocalScheduler` class to enhance the removal process of scheduled tasks from the `_scheduledTaskKeys` collection. The removal operation now captures the result in a variable and includes a conditional check to log a warning if the task was not found, improving error handling and debugging capabilities. * Refactor task removal in LocalScheduler Updated the removal process for scheduled tasks in `_scheduledTasks`. The new implementation collects all corresponding keys and attempts to remove them individually, logging warnings for any failures. This enhances error handling and provides better debugging information. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Add IAsyncEnumerable check to ItemSourceActivityExecutionContextExtensions.GetItemSource (#6897) * Use FullName in WorkflowDictionary (#6923) * Fixed ParentWorkflowInstanceId not being set (#7029) Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> * Remove unused solution projects and update package references - Deleted several project references from `Elsa.sln` to clean up the solution. - Updated `Directory.Packages.props` for consistency and alignment with the latest package versions. * Simplify CI pipeline by removing `Test` step from `Compile+Test+Pack` process. * Initial plan * Add ElsaScript DSL module with parser and compiler Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add integration tests for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add comprehensive documentation for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor workflow activity instantiation logic - Removed `ActivityFactory` and its related interfaces and extensions. - Introduced `ActivityActivator` for handling activity creation. - Extended AST with support for comprehensive workflow structures: - Added nodes for flowcharts, if/else, loops, and variable declarations. - Updated `IElsaScriptCompiler` to use asynchronous methods. - Expanded `ElsaScriptParser` to simplify syntax for `UseNode` and argument parsing. - Adjusted compiler and parser for compatibility with new workflow AST model. * Refactor test method names for clarity and add new compiler and parser tests - Updated method names in `CompilerTests` and `ParserTests` for better readability and description of test intent. - Added tests for compiler and parser: - Support for workflows without the `workflow` keyword. * Refactor `ElsaScriptParser` to improve statement parsing and introduce a tokenizer - Added `TokenizeStatements` method to split source into statements for enhanced parsing accuracy. - Updated logic to process statements instead of raw lines, reducing parsing complexity and improving reliability. - Improved handling of workflow and statement parsing, including edge cases with braces, parentheses, and string literals. * Introduce ElsaScript support for BlobStorage workflow provider - Added the `Elsa.WorkflowProviders.BlobStorage.ElsaScript` module to enable ElsaScript-based workflow definitions for BlobStorage. - Implemented `ElsaScriptBlobWorkflowFormatHandler` for parsing ElsaScript workflows stored in BlobStorage. - Extended `ElsaScriptParser` to leverage Parlot for improved DSL parsing. - Introduced `IBlobWorkflowFormatHandler` to centralize workflow format handling and parsing. - Updated `Elsa.Server.Web` to reference the new module and include an ElsaScript "Hello World" example workflow. * Refactor ElsaScript services, update logging, and improve workflow handling - Changed `ElsaScriptCompiler` service registration from `Singleton` to `Scoped` for better dependency management. - Enhanced the "Hello World" example workflow and added `CopyToOutputDirectory` configuration. - Removed unused namespaces and adjusted references in multiple projects to improve maintainability. - Updated logging levels in `appsettings.json` to reduce unnecessary debug output. - Improved `PolymorphicObjectConverter` by removing redundant dependencies. - Added missing references to enhance feature support and ensure compatibility. * Refactor activity instantiation and improve argument handling in `ElsaScriptCompiler` - Added support for positional arguments with constructor matching logic. - Refactored `InstantiateActivityUsingConstructor` to enhance activity creation. - Updated `ActivityDescriptor` and related types to include `ClrType` for streamlined activity resolution. - Simplified `TypedActivityProvider` by annotating it with `[UsedImplicitly]`. - Adjusted `ElsaScriptParser` to remove unnecessary options from string literal definitions. * Add HTTP-enabled "Hello World" workflow and support for additional HTTP activity constructors - Introduced a new ElsaScript example workflow `hello-world-http.elsa` with an HTTP endpoint and response. - Enhanced `HttpEndpoint` and `WriteHttpResponse` activities with additional constructors for improved flexibility. - Updated project to include the new workflow in the output directory. * Enhance `ElsaScriptParser` with a custom parser to handle nested raw expressions for ElsaScript workflows - Introduced `RawExpressionParser` to parse raw text after `=>` up to a matching closing parenthesis. - Updated `elsaExpressionWithLang` and `elsaExpressionWithoutLang` to use `RawExpressionParser`. - Trimmed whitespace in parsed expressions. - Added integration and parser tests for complex workflows with variables and expressions. - Updated example workflow `hello-world-http.elsa` to demonstrate expression usage. - Added `Elsa.Http` module reference to enable HTTP-based activities. * Update "Hello World" workflow to simplify naming and enhance response logic - Renamed workflow from `HelloWorldHttpDsl2` to `HelloWorldHttpDsl`. - Updated HTTP endpoint path to `/hello-world-dsl` for consistency. - Improved response logic by utilizing `getMessage()` JavaScript function. * Add support for `OriginalSource` in workflow materialization and enhance ElsaScript materializer - Introduced `OriginalSource` property in `WorkflowDefinition` and `MaterializedWorkflow` for preserving original source representation (e.g., ElsaScript, JSON, YAML). - Added `ElsaScriptWorkflowMaterializer` implementation to materialize workflows directly from ElsaScript source. - Updated `DefaultWorkflowDefinitionStorePopulator` to determine `StringData` or `OriginalSource` based on materialized workflow format. - Enhanced `WorkflowDefinitionMapper` to support symmetric round-tripping with `OriginalSource`. - Registered `ElsaScriptWorkflowMaterializer` in `ElsaScriptFeature` for dependency injection. - Updated `JsonBlobWorkflowFormatHandler` and added `OriginalSource` support for round-trip preservation. - Simplified `ElsaScriptParser` by aligning variable and parser naming. * Update V3_6 migrations for PostgreSQL, MySQL, and Oracle databases and associated designer files. * Handle disposal and race conditions in `ScheduledCronTask` - Added `_disposed` flag to prevent accessing disposed resources. - Updated `_executionSemaphore` and `_scopeFactory` logic to safely handle `ObjectDisposedException`. - Enhanced task scheduling and timer disposal with additional safeguards against race conditions. - Modified tests to ensure proper disposal and logging behavior when handling edge cases. * Add support for metadata in ElsaScript workflows and enhance parser and compiler functionality - Introduced metadata syntax in ElsaScript workflows (e.g., `DisplayName`, `Description`, `Version`) to enable metadata-driven behavior. - Enhanced `ElsaScriptCompiler` to process metadata and properly integrate it into `Workflow` objects. - Updated `ElsaScriptParser` to parse program-level AST with support for multiple workflows and global use statements. - Refactored tests to validate metadata parsing and ensure backward compatibility with existing workflows. - Added new test cases to cover scenarios like metadata parsing, compilation, and multi-workflow programs. * Add support for `foreach` loops in ElsaScript and remove `let` keyword - Introduced `foreach` loop syntax in `ElsaScriptParser` and `ElsaScriptCompiler`, enabling iteration over collections with optional variable declaration. - Updated `ForNode` and `ForEachNode` to include a `DeclaresVariable` flag for improved variable handling. - Removed support for the `let` keyword in variable declarations, streamlining syntax to use `var` and `const` only. - Enhanced `for` loop syntax to support optional `var` declaration and block or single-statement bodies. - Refactored test cases to validate `foreach` and `for` loop enhancements and ensure backward compatibility. * Simplify ElsaScript workflow syntax by removing redundant quotes in workflow identifiers and updating `for` loop syntax for clarity and consistency. * Remove redundant quotes from workflow identifiers in integration tests * Simplify Elsa scripts and improve error handling - Removed redundant braces in workflow declarations for streamlined syntax. - Enhanced logging in `JsonBlobWorkflowFormatHandler` and `ElsaScriptBlobWorkflowFormatHandler` to warn on parsing errors and provide context. - Updated configuration to log errors for `Elsa.Workflows.ActivityRegistry`. - Refined "Hello World" and "For Loop" workflows for clarity and added improved loop handling. * Refine Elsa workflows and update compiler logic - Simplified "Hello World" workflow by adding braces and improving consistency. - Adjusted "For Loop" workflow to rename and clarify logic, including expression updates and variable handling. - Fixed compiler mapping of `"cs"` to `"CSharp"` for better clarity. - Enhanced "Hello World HTTP" workflow to correctly reference `variables.message` in expressions. * Add flowchart support in ElsaScript parser, compiler, and integration tests - Introduced `flowchart` syntax in `ElsaScriptParser` to support flowchart-based workflows. - Updated `ElsaScriptCompiler` to compile `flowchart` nodes with labeled activities, connections, entry points, and variables. - Added integration tests for parsing and compiling empty and simple flowcharts. - Enhanced `FlowchartNode` and `LabeledActivityNode` for better representation of flowchart structures. - Improved error handling and logging for invalid flowchart configurations. * Add tests for compiling and parsing flowcharts with nodes, connections, and block nodes in ElsaScript - Added integration tests for compiling and validating flowchart structures, including activities, connections, and entry points. - Implemented parser tests for parsing flowcharts with node connections and block nodes. - Updated project files to include new workflow examples for testing. * Add Parlot package and update project file in integration tests - Added `Parlot` package version `0.0.27` to `Directory.Packages.props`. - Updated integration test project file to include a new `Include` directive for better targeting. * Update Parlot package to version 1.5.2 in Directory.Packages.props * Remove `elsa-server-and-studio.yml` workflow and update solution file - Deleted `elsa-server-and-studio.yml` workflow as it's no longer needed. - Updated `Elsa.sln` to remove reference to the deleted workflow. * Remove `elsa-studio.yml` workflow and update solution and packages - Deleted `elsa-studio.yml` workflow as it's no longer used. - Updated `Elsa.sln` to remove reference to the deleted workflow. - Changed `base_version` in `packages.yml` from `3.7.0` to `3.6.0`. * Downgrade Docker image in `elsa-server.yml` workflow from `v3.7.0-preview` to `v3.6.0-preview` * Update Docker image tag in `elsa-server.yml` workflow from `v3.6.0-preview` to `v3.6-preview` * Add logging support to `LocalScheduler` and replace `Debug.WriteLine` with `ILogger` * Remove unused `System.Collections.Generic` and `Elsa.Extensions` imports in `LocalScheduler` - Cleaned up unnecessary using directives to improve code readability and maintainability. - Minor whitespace adjustment for consistent formatting. * Remove unnecessary whitespace in `LocalScheduler` for consistent formatting * Improve exception handling in blob workflow format handlers - Updated exception handling in `ElsaScriptBlobWorkflowFormatHandler` and `JsonBlobWorkflowFormatHandler` to gracefully catch and log all exceptions during workflow parsing. - Adjusted comments to clarify behavior for invalid user-provided files, ensuring the workflow loading process is not disrupted. * Refactor blob workflow format handlers to use `SupportedExtensions` for improved file filtering - Added `SupportedExtensions` property to all blob format handlers to optimize blob storage browsing. - Simplified `CanHandle` logic by removing extension checks, leveraging `SupportedExtensions` for initial filtering. - Updated comments for clarity and consistency across handlers. * Refactor `DefaultWorkflowDefinitionStorePopulator` to simplify `stringData` assignment logic and improve readability * Remove outdated comment in `CompilerTests` about skipped tests * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Refactor `ElsaScriptCompiler` to streamline type conversion logic, improve language mapping, and enhance asynchronous flowchart compilation * [WIP] Update ParseError printing based on feedback (#7082) * Initial plan * Fix ParseError formatting to use Message and Position properties Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Replace `as` casts with direct casts in ParserTests for null safety (#7083) * Initial plan * Replace 'as' casts with direct casts in ParserTests for better null safety Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix Oracle column types for OriginalSource and other large text fields (#7079) * Initial plan * Fix Oracle OriginalSource and StringData column types to handle large data Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor tests to replace type checks with `Assert.IsType` for improved clarity and type safety * Initial plan (#7080) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * Add `Parlot` package reference and update solution structure by removing and reorganizing projects and workflows. * Set default expression language to "JavaScript" in `ElsaScriptCompiler`. * Add integration test to verify default expression language resets between ElsaScript compilations * Simplify UTF-8 encoding in JsonContentFactory (#7081) * Initial plan * Remove explicit UTF8Encoding in JsonContentFactory and use Encoding.UTF8 Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix test to use Encoding.UTF8.GetByteCount for multi-byte character support Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: Ender <37611092+zengande@users.noreply.github.com> Co-authored-by: Matt <knibbsy10@live.com> Co-authored-by: Max Brooks <45081361+MaxBrooks114@users.noreply.github.com> Co-authored-by: Max Brooks <Max@compyl.com> Co-authored-by: FuJa0815 <30809803+FuJa0815@users.noreply.github.com> Co-authored-by: Peter Klooster <crashkonijn@gmail.com> Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-25 18:57:50 +00:00
_tasksToDispose.Remove(task);
Improves workflow deletion and task scheduling (#7088) * Refactor workflow instance deletion to use `IWorkflowRuntime` for enhanced coordination and separation of concerns. * Remove `EnumerableTypeConverter` and update related usages for serialization. - Deleted the `EnumerableTypeConverter` class and its JSON serialization logic. - Removed associated type descriptor attribute in `DefaultFormattersFeature`. - Updated `ObjectFormatter` to handle collection serialization directly with JSON. * Remove `EnumerableTypeConverter` tests and consolidate serialization logic into `ObjectFormatter`. - Deleted `EnumerableTypeConverterTests` as the related functionality was removed. - Added comprehensive tests in `ObjectFormatterTests` to handle serialization of collections and arrays with JSON. * Add integration tests for `TriggerIndexer` to handle workflows with failing materialization - Introduced comprehensive test scenarios verifying `DeleteTriggersAsync` behavior when workflows fail to load or partially succeed. - Enhanced error handling in `TriggerIndexer` to skip failed workflows while ensuring remaining workflows are processed. * Add exception handling in `TriggerIndexer.DeleteTriggersAsync` and integration tests - Enhanced `DeleteTriggersAsync` with exception handling to skip failed workflows while processing others. - Logged warnings for failed workflows without halting execution. - Added comprehensive integration tests to verify behavior across success, failure, and mixed scenarios. - Refactored tests for improved clarity, maintainability, and consistency. * Add exception handling for `ResumeWorkflowTask` to skip deleted workflow instances - Enhanced `ResumeWorkflowTask.ExecuteAsync` to handle `WorkflowInstanceNotFoundException` gracefully when a scheduled workflow instance is missing. - Logged warnings for skipped executions to improve observability. - Ensured remaining workflows and scheduled tasks are processed seamlessly without disruption. * Add thread safety to `LocalScheduler` to prevent race conditions during concurrent scheduling - Introduced a `lock` object to synchronize access to internal dictionaries. - Resolved `IndexOutOfRangeException` caused by concurrent modifications during startup. - Ensured thread-safe operations in `ScheduleAsync`, `ClearScheduleAsync`, and related methods. - Improved reliability and stability of scheduling under concurrent workloads. * Improve exception handling, thread safety, and workflow instance deletion - Added exception handling in `TriggerIndexer.DeleteTriggersAsync` to skip failed workflows while continuing processing. - Enhanced `ResumeWorkflowTask` to handle missing workflow instances gracefully and log warnings. - Introduced thread synchronization in `LocalScheduler` with `lock` to prevent concurrent access issues. - Implemented and refactored tests to ensure behavior consistency and improve maintainability. - Added component tests for workflow deletion scenarios, covering running, completed, and non-existent workflows. * Add component tests for workflow instance deletion and refactor bulk delete logic - Added comprehensive component tests for workflow instance deletion scenarios (running, completed, bulk, and non-existent instances). - Refactored `BulkDelete` API to use `IWorkflowInstanceManager` for proper cleanup of related records (execution logs, activity executions, bookmarks). * Add integration tests and fakes for `TriggerIndexer` to verify behavior with failing and successful workflows - Introduced `FailingMaterializer` and `WorkingMaterializer` for simulating failing and successful workflow materializations. - Added `TriggerDeletionTestScenario`, `TriggerTestDataBuilder`, and related test data classes to define comprehensive test cases. - Updated `DeleteTriggersAsync` tests with scenarios for materialization failures and mixed success. - Improved test coverage and maintainability with reusable test data builders and utilities.
2025-11-21 19:58:38 +00:00
((IDisposable)task).Dispose();
Improves workflow deletion and task scheduling (#7088) * Refactor workflow instance deletion to use `IWorkflowRuntime` for enhanced coordination and separation of concerns. * Remove `EnumerableTypeConverter` and update related usages for serialization. - Deleted the `EnumerableTypeConverter` class and its JSON serialization logic. - Removed associated type descriptor attribute in `DefaultFormattersFeature`. - Updated `ObjectFormatter` to handle collection serialization directly with JSON. * Remove `EnumerableTypeConverter` tests and consolidate serialization logic into `ObjectFormatter`. - Deleted `EnumerableTypeConverterTests` as the related functionality was removed. - Added comprehensive tests in `ObjectFormatterTests` to handle serialization of collections and arrays with JSON. * Add integration tests for `TriggerIndexer` to handle workflows with failing materialization - Introduced comprehensive test scenarios verifying `DeleteTriggersAsync` behavior when workflows fail to load or partially succeed. - Enhanced error handling in `TriggerIndexer` to skip failed workflows while ensuring remaining workflows are processed. * Add exception handling in `TriggerIndexer.DeleteTriggersAsync` and integration tests - Enhanced `DeleteTriggersAsync` with exception handling to skip failed workflows while processing others. - Logged warnings for failed workflows without halting execution. - Added comprehensive integration tests to verify behavior across success, failure, and mixed scenarios. - Refactored tests for improved clarity, maintainability, and consistency. * Add exception handling for `ResumeWorkflowTask` to skip deleted workflow instances - Enhanced `ResumeWorkflowTask.ExecuteAsync` to handle `WorkflowInstanceNotFoundException` gracefully when a scheduled workflow instance is missing. - Logged warnings for skipped executions to improve observability. - Ensured remaining workflows and scheduled tasks are processed seamlessly without disruption. * Add thread safety to `LocalScheduler` to prevent race conditions during concurrent scheduling - Introduced a `lock` object to synchronize access to internal dictionaries. - Resolved `IndexOutOfRangeException` caused by concurrent modifications during startup. - Ensured thread-safe operations in `ScheduleAsync`, `ClearScheduleAsync`, and related methods. - Improved reliability and stability of scheduling under concurrent workloads. * Improve exception handling, thread safety, and workflow instance deletion - Added exception handling in `TriggerIndexer.DeleteTriggersAsync` to skip failed workflows while continuing processing. - Enhanced `ResumeWorkflowTask` to handle missing workflow instances gracefully and log warnings. - Introduced thread synchronization in `LocalScheduler` with `lock` to prevent concurrent access issues. - Implemented and refactored tests to ensure behavior consistency and improve maintainability. - Added component tests for workflow deletion scenarios, covering running, completed, and non-existent workflows. * Add component tests for workflow instance deletion and refactor bulk delete logic - Added comprehensive component tests for workflow instance deletion scenarios (running, completed, bulk, and non-existent instances). - Refactored `BulkDelete` API to use `IWorkflowInstanceManager` for proper cleanup of related records (execution logs, activity executions, bookmarks). * Add integration tests and fakes for `TriggerIndexer` to verify behavior with failing and successful workflows - Introduced `FailingMaterializer` and `WorkingMaterializer` for simulating failing and successful workflow materializations. - Added `TriggerDeletionTestScenario`, `TriggerTestDataBuilder`, and related test data classes to define comprehensive test cases. - Updated `DeleteTriggersAsync` tests with scenarios for materialization failures and mixed success. - Improved test coverage and maintainability with reusable test data builders and utilities.
2025-11-21 19:58:38 +00:00
// Assert - Should call GetNextOccurrence at least twice (initial + retry)
// May be called more if timer fires before disposal and triggers Schedule() again
_cronParser.Received().GetNextOccurrence(DefaultCronExpression);
var calls = _cronParser.ReceivedCalls().Count(c => c.GetMethodInfo().Name == nameof(_cronParser.GetNextOccurrence));
Assert.True(calls >= 2, $"Expected at least 2 calls to GetNextOccurrence, but got {calls}");
AssertWarningLogged();
}
[Fact]
public void Schedule_WithNegativeDelayAfterRetry_ShouldLogWarningAndUseMinimumDelay()
{
// Arrange - simulate a case where even after retry, delay is negative
// This could happen due to system clock adjustments
Add Elsa Script DSL (#7076) * Update packages.yml * Update elsa-server-and-studio.yml * Update elsa-server.yml * Update elsa-studio.yml (#6715) * Update ListWorkflowDefinitionsRequest.cs (#6761) Remove unnecessary line breaks * Correct namespace and import for `ConfigureEngineWithVariableTypes`. * Resolves build issues, update package versions and restructure project references - Updated multiple package versions in `Directory.Packages.props` for better dependency management, including `BenchmarkDotNet`, `FastEndpoints`, and `Microsoft.Extensions.Http.Resilience`. - Minor version upgrade for `System.Formats.Asn1` in `_build.csproj`. - Replaced project reference to `Elsa.csproj` with `Elsa.IO.Http.csproj` in `Elsa.ServerAndStudio.Web.csproj`, enhancing modularity. - Added new using directive for `Elsa.IO.Http.Features` in `Program.cs` to support new HTTP functionalities. * Remove unused project references from Elsa.sln These changes indicate that the associated projects or dependencies are no longer needed or have been replaced by other components in the solution. * Rename copilot-setup-steps.yml.yml to copilot-setup-steps.yml * Update RawStringContent encoding in JsonContentFactory (#6786) * Update RawStringContent encoding in JsonContentFactory Modified the instantiation of `RawStringContent` to use a new `UTF8Encoding` instance with `encoderShouldEmitUTF8Identifier` set to `false`, affecting the handling of the UTF-8 byte order mark (BOM) in serialized JSON content. Fixes a bug with content length being different than expected. * Refactor JsonContentFactory to reuse UTF8Encoding Introduced a private static readonly field `_utf8Encoding` in the `JsonContentFactory` class to improve code readability and performance. This change replaces the instantiation of `UTF8Encoding` in the `CreateHttpContent` method, allowing for the reuse of the same encoding instance. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Enhance thread safety with ConcurrentDictionary usage (#6760) * Enhance thread safety with ConcurrentDictionary usage Replaced `IDictionary` with `ConcurrentDictionary` for both `_scheduledTasks` and `_scheduledTaskKeys` to improve thread safety in a multi-threaded environment. Updated methods `RegisterScheduledTask`, `RemoveScheduledTask`, and `RemoveScheduledTasks` to utilize the `Remove` method of `ConcurrentDictionary`, ensuring safe and efficient removal of scheduled tasks. * Refactor task registration and removal logic Updated `RegisterScheduledTask` to use `AddOrUpdate` for streamlined task management. This change simplifies the addition and updating of scheduled tasks by consolidating logic into a single operation. Introduced `RemoveScheduledTask` method to handle task removal by name, improving code organization and clarity. * Improve task removal handling in LocalScheduler Modified the `LocalScheduler` class to enhance the removal process of scheduled tasks from the `_scheduledTaskKeys` collection. The removal operation now captures the result in a variable and includes a conditional check to log a warning if the task was not found, improving error handling and debugging capabilities. * Refactor task removal in LocalScheduler Updated the removal process for scheduled tasks in `_scheduledTasks`. The new implementation collects all corresponding keys and attempts to remove them individually, logging warnings for any failures. This enhances error handling and provides better debugging information. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Add IAsyncEnumerable check to ItemSourceActivityExecutionContextExtensions.GetItemSource (#6897) * Use FullName in WorkflowDictionary (#6923) * Fixed ParentWorkflowInstanceId not being set (#7029) Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> * Remove unused solution projects and update package references - Deleted several project references from `Elsa.sln` to clean up the solution. - Updated `Directory.Packages.props` for consistency and alignment with the latest package versions. * Simplify CI pipeline by removing `Test` step from `Compile+Test+Pack` process. * Initial plan * Add ElsaScript DSL module with parser and compiler Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add integration tests for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add comprehensive documentation for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor workflow activity instantiation logic - Removed `ActivityFactory` and its related interfaces and extensions. - Introduced `ActivityActivator` for handling activity creation. - Extended AST with support for comprehensive workflow structures: - Added nodes for flowcharts, if/else, loops, and variable declarations. - Updated `IElsaScriptCompiler` to use asynchronous methods. - Expanded `ElsaScriptParser` to simplify syntax for `UseNode` and argument parsing. - Adjusted compiler and parser for compatibility with new workflow AST model. * Refactor test method names for clarity and add new compiler and parser tests - Updated method names in `CompilerTests` and `ParserTests` for better readability and description of test intent. - Added tests for compiler and parser: - Support for workflows without the `workflow` keyword. * Refactor `ElsaScriptParser` to improve statement parsing and introduce a tokenizer - Added `TokenizeStatements` method to split source into statements for enhanced parsing accuracy. - Updated logic to process statements instead of raw lines, reducing parsing complexity and improving reliability. - Improved handling of workflow and statement parsing, including edge cases with braces, parentheses, and string literals. * Introduce ElsaScript support for BlobStorage workflow provider - Added the `Elsa.WorkflowProviders.BlobStorage.ElsaScript` module to enable ElsaScript-based workflow definitions for BlobStorage. - Implemented `ElsaScriptBlobWorkflowFormatHandler` for parsing ElsaScript workflows stored in BlobStorage. - Extended `ElsaScriptParser` to leverage Parlot for improved DSL parsing. - Introduced `IBlobWorkflowFormatHandler` to centralize workflow format handling and parsing. - Updated `Elsa.Server.Web` to reference the new module and include an ElsaScript "Hello World" example workflow. * Refactor ElsaScript services, update logging, and improve workflow handling - Changed `ElsaScriptCompiler` service registration from `Singleton` to `Scoped` for better dependency management. - Enhanced the "Hello World" example workflow and added `CopyToOutputDirectory` configuration. - Removed unused namespaces and adjusted references in multiple projects to improve maintainability. - Updated logging levels in `appsettings.json` to reduce unnecessary debug output. - Improved `PolymorphicObjectConverter` by removing redundant dependencies. - Added missing references to enhance feature support and ensure compatibility. * Refactor activity instantiation and improve argument handling in `ElsaScriptCompiler` - Added support for positional arguments with constructor matching logic. - Refactored `InstantiateActivityUsingConstructor` to enhance activity creation. - Updated `ActivityDescriptor` and related types to include `ClrType` for streamlined activity resolution. - Simplified `TypedActivityProvider` by annotating it with `[UsedImplicitly]`. - Adjusted `ElsaScriptParser` to remove unnecessary options from string literal definitions. * Add HTTP-enabled "Hello World" workflow and support for additional HTTP activity constructors - Introduced a new ElsaScript example workflow `hello-world-http.elsa` with an HTTP endpoint and response. - Enhanced `HttpEndpoint` and `WriteHttpResponse` activities with additional constructors for improved flexibility. - Updated project to include the new workflow in the output directory. * Enhance `ElsaScriptParser` with a custom parser to handle nested raw expressions for ElsaScript workflows - Introduced `RawExpressionParser` to parse raw text after `=>` up to a matching closing parenthesis. - Updated `elsaExpressionWithLang` and `elsaExpressionWithoutLang` to use `RawExpressionParser`. - Trimmed whitespace in parsed expressions. - Added integration and parser tests for complex workflows with variables and expressions. - Updated example workflow `hello-world-http.elsa` to demonstrate expression usage. - Added `Elsa.Http` module reference to enable HTTP-based activities. * Update "Hello World" workflow to simplify naming and enhance response logic - Renamed workflow from `HelloWorldHttpDsl2` to `HelloWorldHttpDsl`. - Updated HTTP endpoint path to `/hello-world-dsl` for consistency. - Improved response logic by utilizing `getMessage()` JavaScript function. * Add support for `OriginalSource` in workflow materialization and enhance ElsaScript materializer - Introduced `OriginalSource` property in `WorkflowDefinition` and `MaterializedWorkflow` for preserving original source representation (e.g., ElsaScript, JSON, YAML). - Added `ElsaScriptWorkflowMaterializer` implementation to materialize workflows directly from ElsaScript source. - Updated `DefaultWorkflowDefinitionStorePopulator` to determine `StringData` or `OriginalSource` based on materialized workflow format. - Enhanced `WorkflowDefinitionMapper` to support symmetric round-tripping with `OriginalSource`. - Registered `ElsaScriptWorkflowMaterializer` in `ElsaScriptFeature` for dependency injection. - Updated `JsonBlobWorkflowFormatHandler` and added `OriginalSource` support for round-trip preservation. - Simplified `ElsaScriptParser` by aligning variable and parser naming. * Update V3_6 migrations for PostgreSQL, MySQL, and Oracle databases and associated designer files. * Handle disposal and race conditions in `ScheduledCronTask` - Added `_disposed` flag to prevent accessing disposed resources. - Updated `_executionSemaphore` and `_scopeFactory` logic to safely handle `ObjectDisposedException`. - Enhanced task scheduling and timer disposal with additional safeguards against race conditions. - Modified tests to ensure proper disposal and logging behavior when handling edge cases. * Add support for metadata in ElsaScript workflows and enhance parser and compiler functionality - Introduced metadata syntax in ElsaScript workflows (e.g., `DisplayName`, `Description`, `Version`) to enable metadata-driven behavior. - Enhanced `ElsaScriptCompiler` to process metadata and properly integrate it into `Workflow` objects. - Updated `ElsaScriptParser` to parse program-level AST with support for multiple workflows and global use statements. - Refactored tests to validate metadata parsing and ensure backward compatibility with existing workflows. - Added new test cases to cover scenarios like metadata parsing, compilation, and multi-workflow programs. * Add support for `foreach` loops in ElsaScript and remove `let` keyword - Introduced `foreach` loop syntax in `ElsaScriptParser` and `ElsaScriptCompiler`, enabling iteration over collections with optional variable declaration. - Updated `ForNode` and `ForEachNode` to include a `DeclaresVariable` flag for improved variable handling. - Removed support for the `let` keyword in variable declarations, streamlining syntax to use `var` and `const` only. - Enhanced `for` loop syntax to support optional `var` declaration and block or single-statement bodies. - Refactored test cases to validate `foreach` and `for` loop enhancements and ensure backward compatibility. * Simplify ElsaScript workflow syntax by removing redundant quotes in workflow identifiers and updating `for` loop syntax for clarity and consistency. * Remove redundant quotes from workflow identifiers in integration tests * Simplify Elsa scripts and improve error handling - Removed redundant braces in workflow declarations for streamlined syntax. - Enhanced logging in `JsonBlobWorkflowFormatHandler` and `ElsaScriptBlobWorkflowFormatHandler` to warn on parsing errors and provide context. - Updated configuration to log errors for `Elsa.Workflows.ActivityRegistry`. - Refined "Hello World" and "For Loop" workflows for clarity and added improved loop handling. * Refine Elsa workflows and update compiler logic - Simplified "Hello World" workflow by adding braces and improving consistency. - Adjusted "For Loop" workflow to rename and clarify logic, including expression updates and variable handling. - Fixed compiler mapping of `"cs"` to `"CSharp"` for better clarity. - Enhanced "Hello World HTTP" workflow to correctly reference `variables.message` in expressions. * Add flowchart support in ElsaScript parser, compiler, and integration tests - Introduced `flowchart` syntax in `ElsaScriptParser` to support flowchart-based workflows. - Updated `ElsaScriptCompiler` to compile `flowchart` nodes with labeled activities, connections, entry points, and variables. - Added integration tests for parsing and compiling empty and simple flowcharts. - Enhanced `FlowchartNode` and `LabeledActivityNode` for better representation of flowchart structures. - Improved error handling and logging for invalid flowchart configurations. * Add tests for compiling and parsing flowcharts with nodes, connections, and block nodes in ElsaScript - Added integration tests for compiling and validating flowchart structures, including activities, connections, and entry points. - Implemented parser tests for parsing flowcharts with node connections and block nodes. - Updated project files to include new workflow examples for testing. * Add Parlot package and update project file in integration tests - Added `Parlot` package version `0.0.27` to `Directory.Packages.props`. - Updated integration test project file to include a new `Include` directive for better targeting. * Update Parlot package to version 1.5.2 in Directory.Packages.props * Remove `elsa-server-and-studio.yml` workflow and update solution file - Deleted `elsa-server-and-studio.yml` workflow as it's no longer needed. - Updated `Elsa.sln` to remove reference to the deleted workflow. * Remove `elsa-studio.yml` workflow and update solution and packages - Deleted `elsa-studio.yml` workflow as it's no longer used. - Updated `Elsa.sln` to remove reference to the deleted workflow. - Changed `base_version` in `packages.yml` from `3.7.0` to `3.6.0`. * Downgrade Docker image in `elsa-server.yml` workflow from `v3.7.0-preview` to `v3.6.0-preview` * Update Docker image tag in `elsa-server.yml` workflow from `v3.6.0-preview` to `v3.6-preview` * Add logging support to `LocalScheduler` and replace `Debug.WriteLine` with `ILogger` * Remove unused `System.Collections.Generic` and `Elsa.Extensions` imports in `LocalScheduler` - Cleaned up unnecessary using directives to improve code readability and maintainability. - Minor whitespace adjustment for consistent formatting. * Remove unnecessary whitespace in `LocalScheduler` for consistent formatting * Improve exception handling in blob workflow format handlers - Updated exception handling in `ElsaScriptBlobWorkflowFormatHandler` and `JsonBlobWorkflowFormatHandler` to gracefully catch and log all exceptions during workflow parsing. - Adjusted comments to clarify behavior for invalid user-provided files, ensuring the workflow loading process is not disrupted. * Refactor blob workflow format handlers to use `SupportedExtensions` for improved file filtering - Added `SupportedExtensions` property to all blob format handlers to optimize blob storage browsing. - Simplified `CanHandle` logic by removing extension checks, leveraging `SupportedExtensions` for initial filtering. - Updated comments for clarity and consistency across handlers. * Refactor `DefaultWorkflowDefinitionStorePopulator` to simplify `stringData` assignment logic and improve readability * Remove outdated comment in `CompilerTests` about skipped tests * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Refactor `ElsaScriptCompiler` to streamline type conversion logic, improve language mapping, and enhance asynchronous flowchart compilation * [WIP] Update ParseError printing based on feedback (#7082) * Initial plan * Fix ParseError formatting to use Message and Position properties Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Replace `as` casts with direct casts in ParserTests for null safety (#7083) * Initial plan * Replace 'as' casts with direct casts in ParserTests for better null safety Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix Oracle column types for OriginalSource and other large text fields (#7079) * Initial plan * Fix Oracle OriginalSource and StringData column types to handle large data Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor tests to replace type checks with `Assert.IsType` for improved clarity and type safety * Initial plan (#7080) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * Add `Parlot` package reference and update solution structure by removing and reorganizing projects and workflows. * Set default expression language to "JavaScript" in `ElsaScriptCompiler`. * Add integration test to verify default expression language resets between ElsaScript compilations * Simplify UTF-8 encoding in JsonContentFactory (#7081) * Initial plan * Remove explicit UTF8Encoding in JsonContentFactory and use Encoding.UTF8 Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix test to use Encoding.UTF8.GetByteCount for multi-byte character support Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: Ender <37611092+zengande@users.noreply.github.com> Co-authored-by: Matt <knibbsy10@live.com> Co-authored-by: Max Brooks <45081361+MaxBrooks114@users.noreply.github.com> Co-authored-by: Max Brooks <Max@compyl.com> Co-authored-by: FuJa0815 <30809803+FuJa0815@users.noreply.github.com> Co-authored-by: Peter Klooster <crashkonijn@gmail.com> Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-25 18:57:50 +00:00
// After the initial attempts, return a proper future time to prevent timer from firing during test
SetupSystemClock(DefaultNow, DefaultNow);
Add Elsa Script DSL (#7076) * Update packages.yml * Update elsa-server-and-studio.yml * Update elsa-server.yml * Update elsa-studio.yml (#6715) * Update ListWorkflowDefinitionsRequest.cs (#6761) Remove unnecessary line breaks * Correct namespace and import for `ConfigureEngineWithVariableTypes`. * Resolves build issues, update package versions and restructure project references - Updated multiple package versions in `Directory.Packages.props` for better dependency management, including `BenchmarkDotNet`, `FastEndpoints`, and `Microsoft.Extensions.Http.Resilience`. - Minor version upgrade for `System.Formats.Asn1` in `_build.csproj`. - Replaced project reference to `Elsa.csproj` with `Elsa.IO.Http.csproj` in `Elsa.ServerAndStudio.Web.csproj`, enhancing modularity. - Added new using directive for `Elsa.IO.Http.Features` in `Program.cs` to support new HTTP functionalities. * Remove unused project references from Elsa.sln These changes indicate that the associated projects or dependencies are no longer needed or have been replaced by other components in the solution. * Rename copilot-setup-steps.yml.yml to copilot-setup-steps.yml * Update RawStringContent encoding in JsonContentFactory (#6786) * Update RawStringContent encoding in JsonContentFactory Modified the instantiation of `RawStringContent` to use a new `UTF8Encoding` instance with `encoderShouldEmitUTF8Identifier` set to `false`, affecting the handling of the UTF-8 byte order mark (BOM) in serialized JSON content. Fixes a bug with content length being different than expected. * Refactor JsonContentFactory to reuse UTF8Encoding Introduced a private static readonly field `_utf8Encoding` in the `JsonContentFactory` class to improve code readability and performance. This change replaces the instantiation of `UTF8Encoding` in the `CreateHttpContent` method, allowing for the reuse of the same encoding instance. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Enhance thread safety with ConcurrentDictionary usage (#6760) * Enhance thread safety with ConcurrentDictionary usage Replaced `IDictionary` with `ConcurrentDictionary` for both `_scheduledTasks` and `_scheduledTaskKeys` to improve thread safety in a multi-threaded environment. Updated methods `RegisterScheduledTask`, `RemoveScheduledTask`, and `RemoveScheduledTasks` to utilize the `Remove` method of `ConcurrentDictionary`, ensuring safe and efficient removal of scheduled tasks. * Refactor task registration and removal logic Updated `RegisterScheduledTask` to use `AddOrUpdate` for streamlined task management. This change simplifies the addition and updating of scheduled tasks by consolidating logic into a single operation. Introduced `RemoveScheduledTask` method to handle task removal by name, improving code organization and clarity. * Improve task removal handling in LocalScheduler Modified the `LocalScheduler` class to enhance the removal process of scheduled tasks from the `_scheduledTaskKeys` collection. The removal operation now captures the result in a variable and includes a conditional check to log a warning if the task was not found, improving error handling and debugging capabilities. * Refactor task removal in LocalScheduler Updated the removal process for scheduled tasks in `_scheduledTasks`. The new implementation collects all corresponding keys and attempts to remove them individually, logging warnings for any failures. This enhances error handling and provides better debugging information. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Add IAsyncEnumerable check to ItemSourceActivityExecutionContextExtensions.GetItemSource (#6897) * Use FullName in WorkflowDictionary (#6923) * Fixed ParentWorkflowInstanceId not being set (#7029) Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> * Remove unused solution projects and update package references - Deleted several project references from `Elsa.sln` to clean up the solution. - Updated `Directory.Packages.props` for consistency and alignment with the latest package versions. * Simplify CI pipeline by removing `Test` step from `Compile+Test+Pack` process. * Initial plan * Add ElsaScript DSL module with parser and compiler Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add integration tests for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add comprehensive documentation for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor workflow activity instantiation logic - Removed `ActivityFactory` and its related interfaces and extensions. - Introduced `ActivityActivator` for handling activity creation. - Extended AST with support for comprehensive workflow structures: - Added nodes for flowcharts, if/else, loops, and variable declarations. - Updated `IElsaScriptCompiler` to use asynchronous methods. - Expanded `ElsaScriptParser` to simplify syntax for `UseNode` and argument parsing. - Adjusted compiler and parser for compatibility with new workflow AST model. * Refactor test method names for clarity and add new compiler and parser tests - Updated method names in `CompilerTests` and `ParserTests` for better readability and description of test intent. - Added tests for compiler and parser: - Support for workflows without the `workflow` keyword. * Refactor `ElsaScriptParser` to improve statement parsing and introduce a tokenizer - Added `TokenizeStatements` method to split source into statements for enhanced parsing accuracy. - Updated logic to process statements instead of raw lines, reducing parsing complexity and improving reliability. - Improved handling of workflow and statement parsing, including edge cases with braces, parentheses, and string literals. * Introduce ElsaScript support for BlobStorage workflow provider - Added the `Elsa.WorkflowProviders.BlobStorage.ElsaScript` module to enable ElsaScript-based workflow definitions for BlobStorage. - Implemented `ElsaScriptBlobWorkflowFormatHandler` for parsing ElsaScript workflows stored in BlobStorage. - Extended `ElsaScriptParser` to leverage Parlot for improved DSL parsing. - Introduced `IBlobWorkflowFormatHandler` to centralize workflow format handling and parsing. - Updated `Elsa.Server.Web` to reference the new module and include an ElsaScript "Hello World" example workflow. * Refactor ElsaScript services, update logging, and improve workflow handling - Changed `ElsaScriptCompiler` service registration from `Singleton` to `Scoped` for better dependency management. - Enhanced the "Hello World" example workflow and added `CopyToOutputDirectory` configuration. - Removed unused namespaces and adjusted references in multiple projects to improve maintainability. - Updated logging levels in `appsettings.json` to reduce unnecessary debug output. - Improved `PolymorphicObjectConverter` by removing redundant dependencies. - Added missing references to enhance feature support and ensure compatibility. * Refactor activity instantiation and improve argument handling in `ElsaScriptCompiler` - Added support for positional arguments with constructor matching logic. - Refactored `InstantiateActivityUsingConstructor` to enhance activity creation. - Updated `ActivityDescriptor` and related types to include `ClrType` for streamlined activity resolution. - Simplified `TypedActivityProvider` by annotating it with `[UsedImplicitly]`. - Adjusted `ElsaScriptParser` to remove unnecessary options from string literal definitions. * Add HTTP-enabled "Hello World" workflow and support for additional HTTP activity constructors - Introduced a new ElsaScript example workflow `hello-world-http.elsa` with an HTTP endpoint and response. - Enhanced `HttpEndpoint` and `WriteHttpResponse` activities with additional constructors for improved flexibility. - Updated project to include the new workflow in the output directory. * Enhance `ElsaScriptParser` with a custom parser to handle nested raw expressions for ElsaScript workflows - Introduced `RawExpressionParser` to parse raw text after `=>` up to a matching closing parenthesis. - Updated `elsaExpressionWithLang` and `elsaExpressionWithoutLang` to use `RawExpressionParser`. - Trimmed whitespace in parsed expressions. - Added integration and parser tests for complex workflows with variables and expressions. - Updated example workflow `hello-world-http.elsa` to demonstrate expression usage. - Added `Elsa.Http` module reference to enable HTTP-based activities. * Update "Hello World" workflow to simplify naming and enhance response logic - Renamed workflow from `HelloWorldHttpDsl2` to `HelloWorldHttpDsl`. - Updated HTTP endpoint path to `/hello-world-dsl` for consistency. - Improved response logic by utilizing `getMessage()` JavaScript function. * Add support for `OriginalSource` in workflow materialization and enhance ElsaScript materializer - Introduced `OriginalSource` property in `WorkflowDefinition` and `MaterializedWorkflow` for preserving original source representation (e.g., ElsaScript, JSON, YAML). - Added `ElsaScriptWorkflowMaterializer` implementation to materialize workflows directly from ElsaScript source. - Updated `DefaultWorkflowDefinitionStorePopulator` to determine `StringData` or `OriginalSource` based on materialized workflow format. - Enhanced `WorkflowDefinitionMapper` to support symmetric round-tripping with `OriginalSource`. - Registered `ElsaScriptWorkflowMaterializer` in `ElsaScriptFeature` for dependency injection. - Updated `JsonBlobWorkflowFormatHandler` and added `OriginalSource` support for round-trip preservation. - Simplified `ElsaScriptParser` by aligning variable and parser naming. * Update V3_6 migrations for PostgreSQL, MySQL, and Oracle databases and associated designer files. * Handle disposal and race conditions in `ScheduledCronTask` - Added `_disposed` flag to prevent accessing disposed resources. - Updated `_executionSemaphore` and `_scopeFactory` logic to safely handle `ObjectDisposedException`. - Enhanced task scheduling and timer disposal with additional safeguards against race conditions. - Modified tests to ensure proper disposal and logging behavior when handling edge cases. * Add support for metadata in ElsaScript workflows and enhance parser and compiler functionality - Introduced metadata syntax in ElsaScript workflows (e.g., `DisplayName`, `Description`, `Version`) to enable metadata-driven behavior. - Enhanced `ElsaScriptCompiler` to process metadata and properly integrate it into `Workflow` objects. - Updated `ElsaScriptParser` to parse program-level AST with support for multiple workflows and global use statements. - Refactored tests to validate metadata parsing and ensure backward compatibility with existing workflows. - Added new test cases to cover scenarios like metadata parsing, compilation, and multi-workflow programs. * Add support for `foreach` loops in ElsaScript and remove `let` keyword - Introduced `foreach` loop syntax in `ElsaScriptParser` and `ElsaScriptCompiler`, enabling iteration over collections with optional variable declaration. - Updated `ForNode` and `ForEachNode` to include a `DeclaresVariable` flag for improved variable handling. - Removed support for the `let` keyword in variable declarations, streamlining syntax to use `var` and `const` only. - Enhanced `for` loop syntax to support optional `var` declaration and block or single-statement bodies. - Refactored test cases to validate `foreach` and `for` loop enhancements and ensure backward compatibility. * Simplify ElsaScript workflow syntax by removing redundant quotes in workflow identifiers and updating `for` loop syntax for clarity and consistency. * Remove redundant quotes from workflow identifiers in integration tests * Simplify Elsa scripts and improve error handling - Removed redundant braces in workflow declarations for streamlined syntax. - Enhanced logging in `JsonBlobWorkflowFormatHandler` and `ElsaScriptBlobWorkflowFormatHandler` to warn on parsing errors and provide context. - Updated configuration to log errors for `Elsa.Workflows.ActivityRegistry`. - Refined "Hello World" and "For Loop" workflows for clarity and added improved loop handling. * Refine Elsa workflows and update compiler logic - Simplified "Hello World" workflow by adding braces and improving consistency. - Adjusted "For Loop" workflow to rename and clarify logic, including expression updates and variable handling. - Fixed compiler mapping of `"cs"` to `"CSharp"` for better clarity. - Enhanced "Hello World HTTP" workflow to correctly reference `variables.message` in expressions. * Add flowchart support in ElsaScript parser, compiler, and integration tests - Introduced `flowchart` syntax in `ElsaScriptParser` to support flowchart-based workflows. - Updated `ElsaScriptCompiler` to compile `flowchart` nodes with labeled activities, connections, entry points, and variables. - Added integration tests for parsing and compiling empty and simple flowcharts. - Enhanced `FlowchartNode` and `LabeledActivityNode` for better representation of flowchart structures. - Improved error handling and logging for invalid flowchart configurations. * Add tests for compiling and parsing flowcharts with nodes, connections, and block nodes in ElsaScript - Added integration tests for compiling and validating flowchart structures, including activities, connections, and entry points. - Implemented parser tests for parsing flowcharts with node connections and block nodes. - Updated project files to include new workflow examples for testing. * Add Parlot package and update project file in integration tests - Added `Parlot` package version `0.0.27` to `Directory.Packages.props`. - Updated integration test project file to include a new `Include` directive for better targeting. * Update Parlot package to version 1.5.2 in Directory.Packages.props * Remove `elsa-server-and-studio.yml` workflow and update solution file - Deleted `elsa-server-and-studio.yml` workflow as it's no longer needed. - Updated `Elsa.sln` to remove reference to the deleted workflow. * Remove `elsa-studio.yml` workflow and update solution and packages - Deleted `elsa-studio.yml` workflow as it's no longer used. - Updated `Elsa.sln` to remove reference to the deleted workflow. - Changed `base_version` in `packages.yml` from `3.7.0` to `3.6.0`. * Downgrade Docker image in `elsa-server.yml` workflow from `v3.7.0-preview` to `v3.6.0-preview` * Update Docker image tag in `elsa-server.yml` workflow from `v3.6.0-preview` to `v3.6-preview` * Add logging support to `LocalScheduler` and replace `Debug.WriteLine` with `ILogger` * Remove unused `System.Collections.Generic` and `Elsa.Extensions` imports in `LocalScheduler` - Cleaned up unnecessary using directives to improve code readability and maintainability. - Minor whitespace adjustment for consistent formatting. * Remove unnecessary whitespace in `LocalScheduler` for consistent formatting * Improve exception handling in blob workflow format handlers - Updated exception handling in `ElsaScriptBlobWorkflowFormatHandler` and `JsonBlobWorkflowFormatHandler` to gracefully catch and log all exceptions during workflow parsing. - Adjusted comments to clarify behavior for invalid user-provided files, ensuring the workflow loading process is not disrupted. * Refactor blob workflow format handlers to use `SupportedExtensions` for improved file filtering - Added `SupportedExtensions` property to all blob format handlers to optimize blob storage browsing. - Simplified `CanHandle` logic by removing extension checks, leveraging `SupportedExtensions` for initial filtering. - Updated comments for clarity and consistency across handlers. * Refactor `DefaultWorkflowDefinitionStorePopulator` to simplify `stringData` assignment logic and improve readability * Remove outdated comment in `CompilerTests` about skipped tests * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Refactor `ElsaScriptCompiler` to streamline type conversion logic, improve language mapping, and enhance asynchronous flowchart compilation * [WIP] Update ParseError printing based on feedback (#7082) * Initial plan * Fix ParseError formatting to use Message and Position properties Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Replace `as` casts with direct casts in ParserTests for null safety (#7083) * Initial plan * Replace 'as' casts with direct casts in ParserTests for better null safety Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix Oracle column types for OriginalSource and other large text fields (#7079) * Initial plan * Fix Oracle OriginalSource and StringData column types to handle large data Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor tests to replace type checks with `Assert.IsType` for improved clarity and type safety * Initial plan (#7080) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * Add `Parlot` package reference and update solution structure by removing and reorganizing projects and workflows. * Set default expression language to "JavaScript" in `ElsaScriptCompiler`. * Add integration test to verify default expression language resets between ElsaScript compilations * Simplify UTF-8 encoding in JsonContentFactory (#7081) * Initial plan * Remove explicit UTF8Encoding in JsonContentFactory and use Encoding.UTF8 Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix test to use Encoding.UTF8.GetByteCount for multi-byte character support Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: Ender <37611092+zengande@users.noreply.github.com> Co-authored-by: Matt <knibbsy10@live.com> Co-authored-by: Max Brooks <45081361+MaxBrooks114@users.noreply.github.com> Co-authored-by: Max Brooks <Max@compyl.com> Co-authored-by: FuJa0815 <30809803+FuJa0815@users.noreply.github.com> Co-authored-by: Peter Klooster <crashkonijn@gmail.com> Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-25 18:57:50 +00:00
SetupCronParser(DefaultNow.AddMilliseconds(-100), DefaultNow.AddMilliseconds(-50), DefaultNow.AddMinutes(5));
// Act - Should handle negative delay gracefully
Improves workflow deletion and task scheduling (#7088) * Refactor workflow instance deletion to use `IWorkflowRuntime` for enhanced coordination and separation of concerns. * Remove `EnumerableTypeConverter` and update related usages for serialization. - Deleted the `EnumerableTypeConverter` class and its JSON serialization logic. - Removed associated type descriptor attribute in `DefaultFormattersFeature`. - Updated `ObjectFormatter` to handle collection serialization directly with JSON. * Remove `EnumerableTypeConverter` tests and consolidate serialization logic into `ObjectFormatter`. - Deleted `EnumerableTypeConverterTests` as the related functionality was removed. - Added comprehensive tests in `ObjectFormatterTests` to handle serialization of collections and arrays with JSON. * Add integration tests for `TriggerIndexer` to handle workflows with failing materialization - Introduced comprehensive test scenarios verifying `DeleteTriggersAsync` behavior when workflows fail to load or partially succeed. - Enhanced error handling in `TriggerIndexer` to skip failed workflows while ensuring remaining workflows are processed. * Add exception handling in `TriggerIndexer.DeleteTriggersAsync` and integration tests - Enhanced `DeleteTriggersAsync` with exception handling to skip failed workflows while processing others. - Logged warnings for failed workflows without halting execution. - Added comprehensive integration tests to verify behavior across success, failure, and mixed scenarios. - Refactored tests for improved clarity, maintainability, and consistency. * Add exception handling for `ResumeWorkflowTask` to skip deleted workflow instances - Enhanced `ResumeWorkflowTask.ExecuteAsync` to handle `WorkflowInstanceNotFoundException` gracefully when a scheduled workflow instance is missing. - Logged warnings for skipped executions to improve observability. - Ensured remaining workflows and scheduled tasks are processed seamlessly without disruption. * Add thread safety to `LocalScheduler` to prevent race conditions during concurrent scheduling - Introduced a `lock` object to synchronize access to internal dictionaries. - Resolved `IndexOutOfRangeException` caused by concurrent modifications during startup. - Ensured thread-safe operations in `ScheduleAsync`, `ClearScheduleAsync`, and related methods. - Improved reliability and stability of scheduling under concurrent workloads. * Improve exception handling, thread safety, and workflow instance deletion - Added exception handling in `TriggerIndexer.DeleteTriggersAsync` to skip failed workflows while continuing processing. - Enhanced `ResumeWorkflowTask` to handle missing workflow instances gracefully and log warnings. - Introduced thread synchronization in `LocalScheduler` with `lock` to prevent concurrent access issues. - Implemented and refactored tests to ensure behavior consistency and improve maintainability. - Added component tests for workflow deletion scenarios, covering running, completed, and non-existent workflows. * Add component tests for workflow instance deletion and refactor bulk delete logic - Added comprehensive component tests for workflow instance deletion scenarios (running, completed, bulk, and non-existent instances). - Refactored `BulkDelete` API to use `IWorkflowInstanceManager` for proper cleanup of related records (execution logs, activity executions, bookmarks). * Add integration tests and fakes for `TriggerIndexer` to verify behavior with failing and successful workflows - Introduced `FailingMaterializer` and `WorkingMaterializer` for simulating failing and successful workflow materializations. - Added `TriggerDeletionTestScenario`, `TriggerTestDataBuilder`, and related test data classes to define comprehensive test cases. - Updated `DeleteTriggersAsync` tests with scenarios for materialization failures and mixed success. - Improved test coverage and maintainability with reusable test data builders and utilities.
2025-11-21 19:58:38 +00:00
var task = CreateScheduledTask();
// Dispose immediately to prevent timer from firing
Add Elsa Script DSL (#7076) * Update packages.yml * Update elsa-server-and-studio.yml * Update elsa-server.yml * Update elsa-studio.yml (#6715) * Update ListWorkflowDefinitionsRequest.cs (#6761) Remove unnecessary line breaks * Correct namespace and import for `ConfigureEngineWithVariableTypes`. * Resolves build issues, update package versions and restructure project references - Updated multiple package versions in `Directory.Packages.props` for better dependency management, including `BenchmarkDotNet`, `FastEndpoints`, and `Microsoft.Extensions.Http.Resilience`. - Minor version upgrade for `System.Formats.Asn1` in `_build.csproj`. - Replaced project reference to `Elsa.csproj` with `Elsa.IO.Http.csproj` in `Elsa.ServerAndStudio.Web.csproj`, enhancing modularity. - Added new using directive for `Elsa.IO.Http.Features` in `Program.cs` to support new HTTP functionalities. * Remove unused project references from Elsa.sln These changes indicate that the associated projects or dependencies are no longer needed or have been replaced by other components in the solution. * Rename copilot-setup-steps.yml.yml to copilot-setup-steps.yml * Update RawStringContent encoding in JsonContentFactory (#6786) * Update RawStringContent encoding in JsonContentFactory Modified the instantiation of `RawStringContent` to use a new `UTF8Encoding` instance with `encoderShouldEmitUTF8Identifier` set to `false`, affecting the handling of the UTF-8 byte order mark (BOM) in serialized JSON content. Fixes a bug with content length being different than expected. * Refactor JsonContentFactory to reuse UTF8Encoding Introduced a private static readonly field `_utf8Encoding` in the `JsonContentFactory` class to improve code readability and performance. This change replaces the instantiation of `UTF8Encoding` in the `CreateHttpContent` method, allowing for the reuse of the same encoding instance. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Enhance thread safety with ConcurrentDictionary usage (#6760) * Enhance thread safety with ConcurrentDictionary usage Replaced `IDictionary` with `ConcurrentDictionary` for both `_scheduledTasks` and `_scheduledTaskKeys` to improve thread safety in a multi-threaded environment. Updated methods `RegisterScheduledTask`, `RemoveScheduledTask`, and `RemoveScheduledTasks` to utilize the `Remove` method of `ConcurrentDictionary`, ensuring safe and efficient removal of scheduled tasks. * Refactor task registration and removal logic Updated `RegisterScheduledTask` to use `AddOrUpdate` for streamlined task management. This change simplifies the addition and updating of scheduled tasks by consolidating logic into a single operation. Introduced `RemoveScheduledTask` method to handle task removal by name, improving code organization and clarity. * Improve task removal handling in LocalScheduler Modified the `LocalScheduler` class to enhance the removal process of scheduled tasks from the `_scheduledTaskKeys` collection. The removal operation now captures the result in a variable and includes a conditional check to log a warning if the task was not found, improving error handling and debugging capabilities. * Refactor task removal in LocalScheduler Updated the removal process for scheduled tasks in `_scheduledTasks`. The new implementation collects all corresponding keys and attempts to remove them individually, logging warnings for any failures. This enhances error handling and provides better debugging information. --------- Co-authored-by: Max Brooks <Max@compyl.com> * Add IAsyncEnumerable check to ItemSourceActivityExecutionContextExtensions.GetItemSource (#6897) * Use FullName in WorkflowDictionary (#6923) * Fixed ParentWorkflowInstanceId not being set (#7029) Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> * Remove unused solution projects and update package references - Deleted several project references from `Elsa.sln` to clean up the solution. - Updated `Directory.Packages.props` for consistency and alignment with the latest package versions. * Simplify CI pipeline by removing `Test` step from `Compile+Test+Pack` process. * Initial plan * Add ElsaScript DSL module with parser and compiler Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add integration tests for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Add comprehensive documentation for ElsaScript DSL Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor workflow activity instantiation logic - Removed `ActivityFactory` and its related interfaces and extensions. - Introduced `ActivityActivator` for handling activity creation. - Extended AST with support for comprehensive workflow structures: - Added nodes for flowcharts, if/else, loops, and variable declarations. - Updated `IElsaScriptCompiler` to use asynchronous methods. - Expanded `ElsaScriptParser` to simplify syntax for `UseNode` and argument parsing. - Adjusted compiler and parser for compatibility with new workflow AST model. * Refactor test method names for clarity and add new compiler and parser tests - Updated method names in `CompilerTests` and `ParserTests` for better readability and description of test intent. - Added tests for compiler and parser: - Support for workflows without the `workflow` keyword. * Refactor `ElsaScriptParser` to improve statement parsing and introduce a tokenizer - Added `TokenizeStatements` method to split source into statements for enhanced parsing accuracy. - Updated logic to process statements instead of raw lines, reducing parsing complexity and improving reliability. - Improved handling of workflow and statement parsing, including edge cases with braces, parentheses, and string literals. * Introduce ElsaScript support for BlobStorage workflow provider - Added the `Elsa.WorkflowProviders.BlobStorage.ElsaScript` module to enable ElsaScript-based workflow definitions for BlobStorage. - Implemented `ElsaScriptBlobWorkflowFormatHandler` for parsing ElsaScript workflows stored in BlobStorage. - Extended `ElsaScriptParser` to leverage Parlot for improved DSL parsing. - Introduced `IBlobWorkflowFormatHandler` to centralize workflow format handling and parsing. - Updated `Elsa.Server.Web` to reference the new module and include an ElsaScript "Hello World" example workflow. * Refactor ElsaScript services, update logging, and improve workflow handling - Changed `ElsaScriptCompiler` service registration from `Singleton` to `Scoped` for better dependency management. - Enhanced the "Hello World" example workflow and added `CopyToOutputDirectory` configuration. - Removed unused namespaces and adjusted references in multiple projects to improve maintainability. - Updated logging levels in `appsettings.json` to reduce unnecessary debug output. - Improved `PolymorphicObjectConverter` by removing redundant dependencies. - Added missing references to enhance feature support and ensure compatibility. * Refactor activity instantiation and improve argument handling in `ElsaScriptCompiler` - Added support for positional arguments with constructor matching logic. - Refactored `InstantiateActivityUsingConstructor` to enhance activity creation. - Updated `ActivityDescriptor` and related types to include `ClrType` for streamlined activity resolution. - Simplified `TypedActivityProvider` by annotating it with `[UsedImplicitly]`. - Adjusted `ElsaScriptParser` to remove unnecessary options from string literal definitions. * Add HTTP-enabled "Hello World" workflow and support for additional HTTP activity constructors - Introduced a new ElsaScript example workflow `hello-world-http.elsa` with an HTTP endpoint and response. - Enhanced `HttpEndpoint` and `WriteHttpResponse` activities with additional constructors for improved flexibility. - Updated project to include the new workflow in the output directory. * Enhance `ElsaScriptParser` with a custom parser to handle nested raw expressions for ElsaScript workflows - Introduced `RawExpressionParser` to parse raw text after `=>` up to a matching closing parenthesis. - Updated `elsaExpressionWithLang` and `elsaExpressionWithoutLang` to use `RawExpressionParser`. - Trimmed whitespace in parsed expressions. - Added integration and parser tests for complex workflows with variables and expressions. - Updated example workflow `hello-world-http.elsa` to demonstrate expression usage. - Added `Elsa.Http` module reference to enable HTTP-based activities. * Update "Hello World" workflow to simplify naming and enhance response logic - Renamed workflow from `HelloWorldHttpDsl2` to `HelloWorldHttpDsl`. - Updated HTTP endpoint path to `/hello-world-dsl` for consistency. - Improved response logic by utilizing `getMessage()` JavaScript function. * Add support for `OriginalSource` in workflow materialization and enhance ElsaScript materializer - Introduced `OriginalSource` property in `WorkflowDefinition` and `MaterializedWorkflow` for preserving original source representation (e.g., ElsaScript, JSON, YAML). - Added `ElsaScriptWorkflowMaterializer` implementation to materialize workflows directly from ElsaScript source. - Updated `DefaultWorkflowDefinitionStorePopulator` to determine `StringData` or `OriginalSource` based on materialized workflow format. - Enhanced `WorkflowDefinitionMapper` to support symmetric round-tripping with `OriginalSource`. - Registered `ElsaScriptWorkflowMaterializer` in `ElsaScriptFeature` for dependency injection. - Updated `JsonBlobWorkflowFormatHandler` and added `OriginalSource` support for round-trip preservation. - Simplified `ElsaScriptParser` by aligning variable and parser naming. * Update V3_6 migrations for PostgreSQL, MySQL, and Oracle databases and associated designer files. * Handle disposal and race conditions in `ScheduledCronTask` - Added `_disposed` flag to prevent accessing disposed resources. - Updated `_executionSemaphore` and `_scopeFactory` logic to safely handle `ObjectDisposedException`. - Enhanced task scheduling and timer disposal with additional safeguards against race conditions. - Modified tests to ensure proper disposal and logging behavior when handling edge cases. * Add support for metadata in ElsaScript workflows and enhance parser and compiler functionality - Introduced metadata syntax in ElsaScript workflows (e.g., `DisplayName`, `Description`, `Version`) to enable metadata-driven behavior. - Enhanced `ElsaScriptCompiler` to process metadata and properly integrate it into `Workflow` objects. - Updated `ElsaScriptParser` to parse program-level AST with support for multiple workflows and global use statements. - Refactored tests to validate metadata parsing and ensure backward compatibility with existing workflows. - Added new test cases to cover scenarios like metadata parsing, compilation, and multi-workflow programs. * Add support for `foreach` loops in ElsaScript and remove `let` keyword - Introduced `foreach` loop syntax in `ElsaScriptParser` and `ElsaScriptCompiler`, enabling iteration over collections with optional variable declaration. - Updated `ForNode` and `ForEachNode` to include a `DeclaresVariable` flag for improved variable handling. - Removed support for the `let` keyword in variable declarations, streamlining syntax to use `var` and `const` only. - Enhanced `for` loop syntax to support optional `var` declaration and block or single-statement bodies. - Refactored test cases to validate `foreach` and `for` loop enhancements and ensure backward compatibility. * Simplify ElsaScript workflow syntax by removing redundant quotes in workflow identifiers and updating `for` loop syntax for clarity and consistency. * Remove redundant quotes from workflow identifiers in integration tests * Simplify Elsa scripts and improve error handling - Removed redundant braces in workflow declarations for streamlined syntax. - Enhanced logging in `JsonBlobWorkflowFormatHandler` and `ElsaScriptBlobWorkflowFormatHandler` to warn on parsing errors and provide context. - Updated configuration to log errors for `Elsa.Workflows.ActivityRegistry`. - Refined "Hello World" and "For Loop" workflows for clarity and added improved loop handling. * Refine Elsa workflows and update compiler logic - Simplified "Hello World" workflow by adding braces and improving consistency. - Adjusted "For Loop" workflow to rename and clarify logic, including expression updates and variable handling. - Fixed compiler mapping of `"cs"` to `"CSharp"` for better clarity. - Enhanced "Hello World HTTP" workflow to correctly reference `variables.message` in expressions. * Add flowchart support in ElsaScript parser, compiler, and integration tests - Introduced `flowchart` syntax in `ElsaScriptParser` to support flowchart-based workflows. - Updated `ElsaScriptCompiler` to compile `flowchart` nodes with labeled activities, connections, entry points, and variables. - Added integration tests for parsing and compiling empty and simple flowcharts. - Enhanced `FlowchartNode` and `LabeledActivityNode` for better representation of flowchart structures. - Improved error handling and logging for invalid flowchart configurations. * Add tests for compiling and parsing flowcharts with nodes, connections, and block nodes in ElsaScript - Added integration tests for compiling and validating flowchart structures, including activities, connections, and entry points. - Implemented parser tests for parsing flowcharts with node connections and block nodes. - Updated project files to include new workflow examples for testing. * Add Parlot package and update project file in integration tests - Added `Parlot` package version `0.0.27` to `Directory.Packages.props`. - Updated integration test project file to include a new `Include` directive for better targeting. * Update Parlot package to version 1.5.2 in Directory.Packages.props * Remove `elsa-server-and-studio.yml` workflow and update solution file - Deleted `elsa-server-and-studio.yml` workflow as it's no longer needed. - Updated `Elsa.sln` to remove reference to the deleted workflow. * Remove `elsa-studio.yml` workflow and update solution and packages - Deleted `elsa-studio.yml` workflow as it's no longer used. - Updated `Elsa.sln` to remove reference to the deleted workflow. - Changed `base_version` in `packages.yml` from `3.7.0` to `3.6.0`. * Downgrade Docker image in `elsa-server.yml` workflow from `v3.7.0-preview` to `v3.6.0-preview` * Update Docker image tag in `elsa-server.yml` workflow from `v3.6.0-preview` to `v3.6-preview` * Add logging support to `LocalScheduler` and replace `Debug.WriteLine` with `ILogger` * Remove unused `System.Collections.Generic` and `Elsa.Extensions` imports in `LocalScheduler` - Cleaned up unnecessary using directives to improve code readability and maintainability. - Minor whitespace adjustment for consistent formatting. * Remove unnecessary whitespace in `LocalScheduler` for consistent formatting * Improve exception handling in blob workflow format handlers - Updated exception handling in `ElsaScriptBlobWorkflowFormatHandler` and `JsonBlobWorkflowFormatHandler` to gracefully catch and log all exceptions during workflow parsing. - Adjusted comments to clarify behavior for invalid user-provided files, ensuring the workflow loading process is not disrupted. * Refactor blob workflow format handlers to use `SupportedExtensions` for improved file filtering - Added `SupportedExtensions` property to all blob format handlers to optimize blob storage browsing. - Simplified `CanHandle` logic by removing extension checks, leveraging `SupportedExtensions` for initial filtering. - Updated comments for clarity and consistency across handlers. * Refactor `DefaultWorkflowDefinitionStorePopulator` to simplify `stringData` assignment logic and improve readability * Remove outdated comment in `CompilerTests` about skipped tests * Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Refactor `ElsaScriptCompiler` to streamline type conversion logic, improve language mapping, and enhance asynchronous flowchart compilation * [WIP] Update ParseError printing based on feedback (#7082) * Initial plan * Fix ParseError formatting to use Message and Position properties Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Replace `as` casts with direct casts in ParserTests for null safety (#7083) * Initial plan * Replace 'as' casts with direct casts in ParserTests for better null safety Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix Oracle column types for OriginalSource and other large text fields (#7079) * Initial plan * Fix Oracle OriginalSource and StringData column types to handle large data Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Refactor tests to replace type checks with `Assert.IsType` for improved clarity and type safety * Initial plan (#7080) Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> * Add `Parlot` package reference and update solution structure by removing and reorganizing projects and workflows. * Set default expression language to "JavaScript" in `ElsaScriptCompiler`. * Add integration test to verify default expression language resets between ElsaScript compilations * Simplify UTF-8 encoding in JsonContentFactory (#7081) * Initial plan * Remove explicit UTF8Encoding in JsonContentFactory and use Encoding.UTF8 Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> * Fix test to use Encoding.UTF8.GetByteCount for multi-byte character support Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> --------- Co-authored-by: Ender <37611092+zengande@users.noreply.github.com> Co-authored-by: Matt <knibbsy10@live.com> Co-authored-by: Max Brooks <45081361+MaxBrooks114@users.noreply.github.com> Co-authored-by: Max Brooks <Max@compyl.com> Co-authored-by: FuJa0815 <30809803+FuJa0815@users.noreply.github.com> Co-authored-by: Peter Klooster <crashkonijn@gmail.com> Co-authored-by: Peter Klooster <peter.klooster@autotaalglas.nl> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-25 18:57:50 +00:00
_tasksToDispose.Remove(task);
Improves workflow deletion and task scheduling (#7088) * Refactor workflow instance deletion to use `IWorkflowRuntime` for enhanced coordination and separation of concerns. * Remove `EnumerableTypeConverter` and update related usages for serialization. - Deleted the `EnumerableTypeConverter` class and its JSON serialization logic. - Removed associated type descriptor attribute in `DefaultFormattersFeature`. - Updated `ObjectFormatter` to handle collection serialization directly with JSON. * Remove `EnumerableTypeConverter` tests and consolidate serialization logic into `ObjectFormatter`. - Deleted `EnumerableTypeConverterTests` as the related functionality was removed. - Added comprehensive tests in `ObjectFormatterTests` to handle serialization of collections and arrays with JSON. * Add integration tests for `TriggerIndexer` to handle workflows with failing materialization - Introduced comprehensive test scenarios verifying `DeleteTriggersAsync` behavior when workflows fail to load or partially succeed. - Enhanced error handling in `TriggerIndexer` to skip failed workflows while ensuring remaining workflows are processed. * Add exception handling in `TriggerIndexer.DeleteTriggersAsync` and integration tests - Enhanced `DeleteTriggersAsync` with exception handling to skip failed workflows while processing others. - Logged warnings for failed workflows without halting execution. - Added comprehensive integration tests to verify behavior across success, failure, and mixed scenarios. - Refactored tests for improved clarity, maintainability, and consistency. * Add exception handling for `ResumeWorkflowTask` to skip deleted workflow instances - Enhanced `ResumeWorkflowTask.ExecuteAsync` to handle `WorkflowInstanceNotFoundException` gracefully when a scheduled workflow instance is missing. - Logged warnings for skipped executions to improve observability. - Ensured remaining workflows and scheduled tasks are processed seamlessly without disruption. * Add thread safety to `LocalScheduler` to prevent race conditions during concurrent scheduling - Introduced a `lock` object to synchronize access to internal dictionaries. - Resolved `IndexOutOfRangeException` caused by concurrent modifications during startup. - Ensured thread-safe operations in `ScheduleAsync`, `ClearScheduleAsync`, and related methods. - Improved reliability and stability of scheduling under concurrent workloads. * Improve exception handling, thread safety, and workflow instance deletion - Added exception handling in `TriggerIndexer.DeleteTriggersAsync` to skip failed workflows while continuing processing. - Enhanced `ResumeWorkflowTask` to handle missing workflow instances gracefully and log warnings. - Introduced thread synchronization in `LocalScheduler` with `lock` to prevent concurrent access issues. - Implemented and refactored tests to ensure behavior consistency and improve maintainability. - Added component tests for workflow deletion scenarios, covering running, completed, and non-existent workflows. * Add component tests for workflow instance deletion and refactor bulk delete logic - Added comprehensive component tests for workflow instance deletion scenarios (running, completed, bulk, and non-existent instances). - Refactored `BulkDelete` API to use `IWorkflowInstanceManager` for proper cleanup of related records (execution logs, activity executions, bookmarks). * Add integration tests and fakes for `TriggerIndexer` to verify behavior with failing and successful workflows - Introduced `FailingMaterializer` and `WorkingMaterializer` for simulating failing and successful workflow materializations. - Added `TriggerDeletionTestScenario`, `TriggerTestDataBuilder`, and related test data classes to define comprehensive test cases. - Updated `DeleteTriggersAsync` tests with scenarios for materialization failures and mixed success. - Improved test coverage and maintainability with reusable test data builders and utilities.
2025-11-21 19:58:38 +00:00
((IDisposable)task).Dispose();
// Assert - Should log a warning and still set up timer
AssertWarningLogged();
}
[Fact]
public void ReproduceOriginalIssue_WithRealCronParser_DemonstratesBugScenario()
{
// This test reproduces the exact scenario from the original issue report
// Using the real CronosCronParser with specific times that trigger the bug
// Arrange - Use the exact times from the issue that cause delay.Milliseconds to be 0
var now = new DateTimeOffset(2025, 11, 06, 22, 50, 00, 0, TimeZoneInfo.Utc.GetUtcOffset(DateTimeOffset.UtcNow));
var systemClock = Substitute.For<ISystemClock>();
systemClock.UtcNow.Returns(now);
var realCronParser = new Elsa.Scheduling.Services.CronosCronParser(systemClock);
// Act - Create scheduled task with real cron parser
// Before the fix: This would silently fail to schedule if delay <= 0
// After the fix: This should log warning and use minimum delay
CreateScheduledTask(cronParser: realCronParser, systemClock: systemClock);
// Assert - The key is that the task was created successfully without throwing or silently failing
// This test passes with the fix, demonstrating the issue is resolved
}
public void Dispose()
{
Added IEnumerableTypeConverter (#7020) * Added IEnumerableTypeConverter * fixed bug and added tests * Add resource disposal mechanism in ScheduledCronTask - Introduced `_disposed` flag to prevent execution after disposal. - Updated disposal logic to ensure proper release of resources. - Adjusted unit tests to verify new disposal behavior and prevent unintended timer actions. * Enhance scheduling tasks with edge case handling and disposal improvements - Added `_disposed` flag to `ScheduledRecurringTask` and `ScheduledSpecificInstantTask` to prevent execution after disposal. - Adjusted timer setup logic to handle zero/negative delays with a minimum delay of 1ms. - Updated disposal logic to ensure proper resource cleanup even during timer callbacks. - Introduced extensive unit tests for edge cases such as small, zero, or negative delay scenarios and proper disposal behavior. * Update test/component/Elsa.Workflows.ComponentTests/Scenarios/VariablesArray/Activities/RemoveTopElementStep.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/Elsa.Common/Serialization/IEnumerableTypeConverter.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/modules/Elsa.Common/Serialization/IEnumerableTypeConverter.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Add integration tests for EnumerableTypeConverter and update solution file - Introduced `Elsa.Common.IntegrationTests` project for testing serialization behavior in `EnumerableTypeConverter`. - Added tests to verify proper handling of strings, byte arrays, and collections during JSON serialization. - Registered `EnumerableTypeConverter` in `DefaultFormattersFeature`. - Renamed `IEnumerableTypeConverter` to `EnumerableTypeConverter` for consistency. - Updated solution file to include the new integration test project. --------- Co-authored-by: Sipke Schoorstra <sipkeschoorstra@outlook.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-12 10:07:33 +00:00
// Dispose tasks first to stop timers before disposing ServiceProvider
foreach (var task in _tasksToDispose)
{
((IDisposable)task).Dispose();
}
_serviceProvider.Dispose();
}
}