Commit graph

160 commits

Author SHA1 Message Date
Sipke Schoorstra ca268c16ad
Enhances distributed lock handling with resilience (#7161)
* Add retry mechanism for distributed locks with transient error handling and logging

- Introduced Polly-based retry pipeline for distributed lock acquisition in `DistributedWorkflowClient` to handle transient errors such as network issues or database connection failures.
- Added detailed logging for retry attempts and lock release errors.
- Updated project dependencies to include Polly.

* Refactor transient exception handling to shared resilience module.

Migrated transient exception detection logic from scheduling module to a new shared resilience module. Updated services, jobs, and features to utilize the centralized `ITransientExceptionDetectionService`. This change improves maintainability and promotes reusability across modules.

* Add unit tests for transient exception detection and resilience strategy evaluation.

- Introduced comprehensive unit tests for `DefaultTransientExceptionDetector`, `ResilienceStrategyCatalog`, `ResilienceStrategyConfigEvaluator`, and `TransientExceptionDetectionService`.
- Added helper classes and test data factories to facilitate reusable test patterns for resilience modules.
- Updated solution to include `Elsa.Resilience.Core.UnitTests` project.

* Add component tests for distributed lock resilience

- Introduced new tests to verify retry behavior during transient lock acquisition and release failures.
- Added `TestDistributedLockProvider` and related mocks for simulating transient failures.
- Updated `WorkflowServer` test services to support the new distributed lock test scenarios.

* Refactor distributed lock resilience tests

- Consolidated test logic: streamlined test providers, injected services, and reusable test patterns.
- Simplified `TestDistributedLockProvider` implementation with enhanced initialization and failure simulation.
- Reorganized tests for transient acquisition/release failures to use parameterized `Theory` for improved maintainability.

* Refactor transient exception handling: rename interfaces and classes for consistency, update references across codebase, and improve code readability.

* Apply suggestion from @Copilot

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Simplify WorkflowServer setup and DistributedLockResilienceTests by replacing IDistributedLockProvider with TestDistributedLockProvider.

* Remove unused `using` directives in unit tests to improve code cleanliness.

* Remove `TransientExceptionTypes` helper and inline its usage in tests for improved maintainability.

* Add descriptive `DisplayName` attributes to unit tests for improved test clarity.

* Fix redundant exception checking in TransientExceptionDetector (#7162)

* Initial plan

* Fix redundant exception checking in TransientExceptionDetector

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>

* Extract MaxRetryAttempts constant in DistributedLockResilienceTests (#7164)

* Initial plan

* Extract MaxRetryAttempts constant to eliminate hardcoded magic number

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>

* Make TestDistributedLockProvider thread-safe with Interlocked operations (#7163)

* Initial plan

* Make TestDistributedLockProvider thread-safe using Interlocked operations

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>

* Update src/modules/Elsa.Workflows.Runtime.Distributed/Services/DistributedWorkflowClient.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update test/component/Elsa.Workflows.ComponentTests/Scenarios/DistributedLockResilience/DistributedLockResilienceTests.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/modules/Elsa.Workflows.Runtime.Distributed/Services/DistributedWorkflowClient.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/modules/Elsa.Resilience.Core/Services/DefaultTransientExceptionStrategy.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Include `CancellationToken` in distributed lock handling methods for improved cancellation support.

* Initial plan (#7168)

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>

* Cache detector list in TransientExceptionDetector to avoid repeated allocations (#7167)

* Initial plan

* Cache detector list in field to avoid repeated allocations

Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com>

* Use IReadOnlyList instead of List for better intent expression

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 TestDistributedLockProvider registration to properly decorate IDistributedLockProvider (#7166)

* Initial plan

* Fix TestDistributedLockProvider registration to use Decorate pattern and fix variable reference bug

Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com>

* Add runtime check for TestDistributedLockProvider registration

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 `DistributedWorkflowClient` to simplify `Lazy<ResiliencePipeline>` initialization.

* Add integration tests for DistributedWorkflowClient lock resilience (#7165)

* Initial plan

* Fix compilation error: use correct parameter name transientExceptionDetector

Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com>

* Add integration tests for DistributedWorkflowClient lock resilience

- Add SimpleWorkflow for testing distributed lock scenarios
- Add tests exercising RunInstanceAsync with transient lock failures
- Verify retry logic works correctly with actual workflow execution
- Test both acquisition and release failure scenarios
- Decorate IDistributedLockProvider to use TestDistributedLockProvider

Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com>

* Address code review feedback

- Add explanatory comment for TestDistributedLockProvider cast
- Remove unnecessary blank line for consistent formatting

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: Sipke Schoorstra <sipkeschoorstra@outlook.com>

* Simplify transient exception strategy by refactoring message pattern matching logic.

* Enhance distributed lock mock to support per-lock failure configuration and improve resilience tests.

* Refactor `TestDistributedLockProvider` to streamline failure handling logic and improve code clarity.

* Remove unused methods and redundant test case from `DistributedLockResilienceTests`.

* Refactor `DistributedLockResilienceTests` to simplify workflow client creation, consolidate assertion logic, and remove redundant test cases.

* Format `ResilienceStrategyCatalogTests` by removing redundant line breaks in test setup.

* Refactor `TransientExceptionDetectorTests` to simplify test setup, consolidate test cases, and remove redundant logic.

* Handle `InvalidOperationException` in `XunitLogger` to suppress logging errors during inactive tests.

* Update workflows to use .NET 10 and adjust resilience tests project configuration.

* Refactor distributed runtime feature and integrations to improve resilience handling, configure services fluently, and add cancellation safeguards in background services.

* Update `base_version` to `3.7.0` in GitHub workflow configuration.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com>
2025-12-29 19:53:48 +01:00
Sipke Schoorstra 103063ee69
Refactor Finish activity tests and workflows. Migrate integration tests to component tests, introduce new workflows for advanced scenarios, and enhance runner utilities to simplify execution logic. 2025-12-20 15:53:57 +01:00
Sipke Schoorstra dd6bfbb6b0
Comment out SQL Server image configuration in component test infrastructure. 2025-12-11 10:05:39 +01:00
Sipke Schoorstra 14189494b2
Switch component tests database configuration from PostgreSQL to SQL Server. 2025-12-11 09:58:45 +01:00
Sipke Schoorstra 183934c1af
Revert component tests database configuration from SQL Server to PostgreSQL. 2025-12-11 09:54:16 +01:00
Sipke Schoorstra 1107b48200
Switch component tests from PostgreSQL to SQL Server and update related configurations. 2025-12-11 09:45:37 +01:00
Sipke Schoorstra c79275fcca
Restore Scope.Dispose in AppComponentTest to ensure proper resource cleanup during test execution. 2025-12-10 11:25:29 +01:00
Sipke Schoorstra 8730f0cdeb
Restore Scope.Dispose in AppComponentTest and update WorkflowServer DB connection string with pool size configuration 2025-12-10 11:25:17 +01:00
Sipke Schoorstra da88712e75
Increase PostgreSQL test container max connections to 100 for improved parallelism in component tests 2025-12-10 11:10:45 +01:00
Sipke Schoorstra bcb613cf86
Remove redundant database configuration and simplify connection string in WorkflowServer. 2025-12-10 11:01:52 +01:00
Sipke Schoorstra 56089c95f1
Update workflow to dump Docker logs on failure and improve PostgreSQL container configuration
- Add Docker logs capturing step in GitHub Actions workflow for better debugging.
- Update PostgreSQL test container to use `postgres:16-alpine` with enhanced configuration options.
- Set database connection `Max Pool Size` to 20 in component tests.
2025-12-10 10:55:52 +01:00
Sipke Schoorstra fdf3e385b1
Fix Race Condition Causing Duplicate Trigger Registration in Multi-Engine Environments + Add Concurrency Tests to Prevent Regression (#7131)
* Add component tests for concurrent trigger indexing to prevent duplicate trigger registration in multi-engine workflows (#7130)

* Pin `dotnet-ef` version in `.config/dotnet-tools.json` to address migration bug, update EF Core script modules, and enhance `DesignTimeDbContextFactoryBase` with improved option description.

* Add migrations for EF Core SQLite and MySQL to include unique indexing on triggers.

* Update ConcurrentTriggerIndexing test to verify unique constraint enforcement and throw `DbUpdateException` for duplicate triggers

* Update src/modules/Elsa.Persistence.EFCore/Modules/Runtime/TriggerStore.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update src/modules/Elsa.Persistence.EFCore/Modules/Runtime/TriggerStore.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Update EF Core script to include `Management` module and restore `Sqlite` provider in migration process

* Rename `SimpleHttpApiWorkflow.cs` to `HttpWorkflow.cs` in ConcurrentTriggerIndexing test.

* Remove 'locks' folder from project

Removed the 'locks' folder from the project structure.

* Clean up migration script by removing redundant column type changes

* Update EF Core Oracle migrations to change NVARCHAR2 fields to NCLOB for larger data storage

* Update EF Core Oracle migrations to use NCLOB for larger data storage

* Remove retry logic and logger dependency from EFCoreTriggerStore in TriggerStore implementation

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-05 09:17:14 +01:00
lucas.hipolito ea3c5c67aa Merge remote-tracking branch 'origin/feat/tests-http-endpoint' into feat/tests-http-endpoint 2025-12-03 16:20:02 +01:00
lucas.hipolito dbfd5b65c9 Removing duplicate test 2025-12-03 16:19:59 +01:00
lukhipolito-nexxbiz 904cff75ef
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:18:13 +01:00
lukhipolito-nexxbiz b000b2b794
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/README.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:17:56 +01:00
lukhipolito-nexxbiz 8987e043e9
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/README.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:17:07 +01:00
lukhipolito-nexxbiz 94b409b08a
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/Workflows/JsonContentWorkflow.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:16:48 +01:00
lukhipolito-nexxbiz 6501262486
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/Workflows/RouteParametersWorkflow.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:16:28 +01:00
lukhipolito-nexxbiz d9e460e0d4
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/README.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:15:59 +01:00
lukhipolito-nexxbiz 90af851962
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/Workflows/FileUploadWorkflow.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:15:39 +01:00
lukhipolito-nexxbiz 859a14ede2
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/Workflows/BlockedFileExtensionWorkflow.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:14:52 +01:00
lukhipolito-nexxbiz 2f9d6c1ec3
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/Workflows/BasicHttpEndpointWorkflow.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:14:39 +01:00
lukhipolito-nexxbiz f023e1f994
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/README.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:14:03 +01:00
lukhipolito-nexxbiz c791843860
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointRouteParametersTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:13:49 +01:00
lukhipolito-nexxbiz d8b929a5bd
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/Workflows/QueryStringAndHeadersWorkflow.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:13:38 +01:00
lukhipolito-nexxbiz 1f0aa37780
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/Workflows/MultipleHttpMethodsWorkflow.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:13:28 +01:00
lukhipolito-nexxbiz 9f0220e088
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/Workflows/FormDataWorkflow.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 16:13:17 +01:00
lucas.hipolito 0074061990 fixing build after merge 2025-12-03 15:31:33 +01:00
lucas.hipolito 2f93f498b4 Merge remote-tracking branch 'origin/feat/tests-http-endpoint' into feat/tests-http-endpoint 2025-12-03 15:30:20 +01:00
lucas.hipolito 7184336f8e PR comments 2025-12-03 15:30:17 +01:00
lukhipolito-nexxbiz fc14e99ed4
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 15:30:00 +01:00
lukhipolito-nexxbiz 536e908898
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 14:33:14 +01:00
lukhipolito-nexxbiz eaac09dfd6
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/README.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 14:08:21 +01:00
lucas.hipolito 570b0d4678 Removed unnecessary tests, small refactors for readability +organization 2025-12-03 11:48:53 +01:00
lucas.hipolito 9e7b04b48d Merge remote-tracking branch 'origin/feat/tests-http-endpoint' into feat/tests-http-endpoint 2025-12-03 11:25:10 +01:00
lukhipolito-nexxbiz c4f1fcdef4
Merge pull request #7126 from elsa-workflows/copilot/sub-pr-7125
Remove test that validates web server behavior rather than Elsa functionality
2025-12-03 11:24:36 +01:00
lucas.hipolito bbf9378d83 Merge remote-tracking branch 'origin/feat/tests-http-endpoint' into feat/tests-http-endpoint 2025-12-03 11:22:06 +01:00
lucas.hipolito ad9bc2ef70 Removing ambiguous assertions 2025-12-03 11:20:51 +01:00
lukhipolito-nexxbiz e3149ea3c2
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 11:19:57 +01:00
lukhipolito-nexxbiz a87cbe34a2
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointSecurityAndEdgeCasesTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 11:18:21 +01:00
lukhipolito-nexxbiz 46004b33c4
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointSecurityAndEdgeCasesTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 11:18:06 +01:00
lukhipolito-nexxbiz 4712782e6d
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointQueryStringAndHeadersTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 11:17:21 +01:00
lukhipolito-nexxbiz 466f62f016
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/Workflows/FormDataWorkflow.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 11:06:34 +01:00
lukhipolito-nexxbiz b0ee28008e
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/Workflows/RouteParametersWorkflow.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-03 08:20:27 +01:00
copilot-swe-agent[bot] 0a337fe251 Remove HttpEndpoint_ExtremelyLongPath_HandlesGracefully test per reviewer feedback
Co-authored-by: sfmskywalker <938393+sfmskywalker@users.noreply.github.com>
2025-12-02 17:23:04 +00:00
lucas.hipolito eb05233f36 small QoL improvements 2025-12-02 17:19:25 +01:00
lukhipolito-nexxbiz bacca3f890
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointSecurityAndEdgeCasesTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-02 16:51:43 +01:00
lukhipolito-nexxbiz e281ff229a
Update test/component/Elsa.Workflows.ComponentTests/Scenarios/Activities/Http/HttpEndpointQueryStringAndHeadersTests.cs
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-02 16:50:42 +01:00
lucas.hipolito 7091d07dc3 Merge remote-tracking branch 'origin/feat/tests-http-endpoint' into feat/tests-http-endpoint 2025-12-02 15:36:05 +01:00