diff --git a/src/WorkflowCore.Testing/WorkflowTest.cs b/src/WorkflowCore.Testing/WorkflowTest.cs index bf0eb97ab..1bda5ef1e 100644 --- a/src/WorkflowCore.Testing/WorkflowTest.cs +++ b/src/WorkflowCore.Testing/WorkflowTest.cs @@ -17,6 +17,7 @@ public abstract class WorkflowTest : IDisposable protected IWorkflowHost Host; protected IPersistenceProvider PersistenceProvider; protected List UnhandledStepErrors = new List(); + private bool isDisposed; protected virtual void Setup() { @@ -116,9 +117,22 @@ protected TData GetData(string workflowId) return (TData)instance.Data; } + protected virtual void Dispose(bool disposing) + { + if (!isDisposed) + { + if (disposing) + { + Host.Stop(); + } + isDisposed = true; + } + } + public void Dispose() { - Host.Stop(); + Dispose(disposing: true); + GC.SuppressFinalize(this); } } diff --git a/src/WorkflowCore/Services/BackgroundTasks/WorkflowConsumer.cs b/src/WorkflowCore/Services/BackgroundTasks/WorkflowConsumer.cs index b092f41f6..ad845beed 100644 --- a/src/WorkflowCore/Services/BackgroundTasks/WorkflowConsumer.cs +++ b/src/WorkflowCore/Services/BackgroundTasks/WorkflowConsumer.cs @@ -55,7 +55,7 @@ protected override async Task ProcessItem(string itemId, CancellationToken cance finally { WorkflowActivity.Enrich(result); - await _persistenceStore.PersistWorkflow(workflow, result?.Subscriptions, cancellationToken); + await _persistenceStore.PersistWorkflow(workflow, result?.Subscriptions); await QueueProvider.QueueWork(itemId, QueueType.Index); _greylist.Remove($"wf:{itemId}"); } diff --git a/test/Docker.Testify/Docker.Testify.csproj b/test/Docker.Testify/Docker.Testify.csproj index a83648df4..cff2d13e8 100644 --- a/test/Docker.Testify/Docker.Testify.csproj +++ b/test/Docker.Testify/Docker.Testify.csproj @@ -1,7 +1,7 @@  - + diff --git a/test/WorkflowCore.IntegrationTests/Scenarios/StopScenario.cs b/test/WorkflowCore.IntegrationTests/Scenarios/StopScenario.cs new file mode 100644 index 000000000..e487a4053 --- /dev/null +++ b/test/WorkflowCore.IntegrationTests/Scenarios/StopScenario.cs @@ -0,0 +1,47 @@ +using System.Threading; +using System.Threading.Tasks; +using FluentAssertions; +using WorkflowCore.Interface; +using WorkflowCore.Models; +using WorkflowCore.Models.LifeCycleEvents; +using WorkflowCore.Testing; +using Xunit; + +namespace WorkflowCore.IntegrationTests.Scenarios +{ + public class StopScenario : WorkflowTest + { + public class StopWorkflow : IWorkflow + { + public string Id => "StopWorkflow"; + public int Version => 1; + public void Build(IWorkflowBuilder builder) + { + builder.StartWith(context => ExecutionResult.Next()); + } + } + + public StopScenario() => Setup(); + + [Fact] + public async Task Scenario() + { + var tcs = new TaskCompletionSource(); + Host.OnLifeCycleEvent += async (evt) => + { + if (evt is WorkflowCompleted) + { + await Host.StopAsync(CancellationToken.None); + tcs.SetResult(default); + } + }; + + var workflowId = StartWorkflow(default); + await tcs.Task; + + GetStatus(workflowId).Should().Be(WorkflowStatus.Complete); + } + + protected override void Dispose(bool disposing) { } + } +} diff --git a/test/WorkflowCore.Tests.DynamoDB/Scenarios/DynamoStopScenario.cs b/test/WorkflowCore.Tests.DynamoDB/Scenarios/DynamoStopScenario.cs new file mode 100644 index 000000000..6900460d3 --- /dev/null +++ b/test/WorkflowCore.Tests.DynamoDB/Scenarios/DynamoStopScenario.cs @@ -0,0 +1,18 @@ +using System; +using Amazon.DynamoDBv2; +using Microsoft.Extensions.DependencyInjection; +using WorkflowCore.IntegrationTests.Scenarios; +using Xunit; + +namespace WorkflowCore.Tests.DynamoDB.Scenarios +{ + [Collection("DynamoDb collection")] + public class DynamoStopScenario : StopScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + var cfg = new AmazonDynamoDBConfig {ServiceURL = DynamoDbDockerSetup.ConnectionString}; + services.AddWorkflow(x => x.UseAwsDynamoPersistence(DynamoDbDockerSetup.Credentials, cfg, "tests-")); + } + } +} diff --git a/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoStopScenario.cs b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoStopScenario.cs new file mode 100644 index 000000000..050c203c0 --- /dev/null +++ b/test/WorkflowCore.Tests.MongoDB/Scenarios/MongoStopScenario.cs @@ -0,0 +1,16 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using WorkflowCore.IntegrationTests.Scenarios; +using Xunit; + +namespace WorkflowCore.Tests.MongoDB.Scenarios +{ + [Collection("Mongo collection")] + public class MongoStopScenario : StopScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseMongoDB(MongoDockerSetup.ConnectionString, "integration-tests")); + } + } +} diff --git a/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlStopScenario.cs b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlStopScenario.cs new file mode 100644 index 000000000..e00b738d1 --- /dev/null +++ b/test/WorkflowCore.Tests.MySQL/Scenarios/MysqlStopScenario.cs @@ -0,0 +1,16 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using WorkflowCore.IntegrationTests.Scenarios; +using Xunit; + +namespace WorkflowCore.Tests.MySQL.Scenarios +{ + [Collection("Mysql collection")] + public class MysqlStopScenario : StopScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseMySQL(MysqlDockerSetup.ScenarioConnectionString, true, true)); + } + } +} diff --git a/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresStopScenario.cs b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresStopScenario.cs new file mode 100644 index 000000000..995681160 --- /dev/null +++ b/test/WorkflowCore.Tests.PostgreSQL/Scenarios/PostgresStopScenario.cs @@ -0,0 +1,16 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using WorkflowCore.IntegrationTests.Scenarios; +using Xunit; + +namespace WorkflowCore.Tests.PostgreSQL.Scenarios +{ + [Collection("Postgres collection")] + public class PostgresStopScenario : StopScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UsePostgreSQL(PostgresDockerSetup.ScenarioConnectionString, true, true)); + } + } +} diff --git a/test/WorkflowCore.Tests.Redis/Scenarios/RedisStopScenario.cs b/test/WorkflowCore.Tests.Redis/Scenarios/RedisStopScenario.cs new file mode 100644 index 000000000..fad60c3fc --- /dev/null +++ b/test/WorkflowCore.Tests.Redis/Scenarios/RedisStopScenario.cs @@ -0,0 +1,16 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using WorkflowCore.IntegrationTests.Scenarios; +using Xunit; + +namespace WorkflowCore.Tests.Redis.Scenarios +{ + [Collection("Redis collection")] + public class RedisStopScenario : StopScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseRedisPersistence(RedisDockerSetup.ConnectionString, "scenario-")); + } + } +} diff --git a/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerStopScenario.cs b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerStopScenario.cs new file mode 100644 index 000000000..de4e06ec1 --- /dev/null +++ b/test/WorkflowCore.Tests.SqlServer/Scenarios/SqlServerStopScenario.cs @@ -0,0 +1,16 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using WorkflowCore.IntegrationTests.Scenarios; +using Xunit; + +namespace WorkflowCore.Tests.SqlServer.Scenarios +{ + [Collection("SqlServer collection")] + public class SqlServerStopScenario : StopScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlServer(SqlDockerSetup.ScenarioConnectionString, true, true)); + } + } +} diff --git a/test/WorkflowCore.Tests.Sqlite/Scenarios/SqliteStopScenario.cs b/test/WorkflowCore.Tests.Sqlite/Scenarios/SqliteStopScenario.cs new file mode 100644 index 000000000..0b3d7e188 --- /dev/null +++ b/test/WorkflowCore.Tests.Sqlite/Scenarios/SqliteStopScenario.cs @@ -0,0 +1,17 @@ +using System; +using Microsoft.Extensions.DependencyInjection; +using WorkflowCore.IntegrationTests.Scenarios; +using WorkflowCore.Tests.Sqlite; +using Xunit; + +namespace WorkflowCore.Tests.Sqlite.Scenarios +{ + [Collection("Sqlite collection")] + public class SqliteStopScenario : StopScenario + { + protected override void ConfigureServices(IServiceCollection services) + { + services.AddWorkflow(x => x.UseSqlite(SqliteSetup.ConnectionString, true)); + } + } +} diff --git a/test/WorkflowCore.Tests.Sqlite/SqliteCollection.cs b/test/WorkflowCore.Tests.Sqlite/SqliteCollection.cs index 69ed8c41a..41906a519 100644 --- a/test/WorkflowCore.Tests.Sqlite/SqliteCollection.cs +++ b/test/WorkflowCore.Tests.Sqlite/SqliteCollection.cs @@ -10,7 +10,7 @@ public class SqliteCollection : ICollectionFixture public class SqliteSetup : IDisposable { - public string ConnectionString { get; set; } + public static string ConnectionString { get; set; } public SqliteSetup() { diff --git a/test/WorkflowCore.Tests.Sqlite/SqlitePersistenceProviderFixture.cs b/test/WorkflowCore.Tests.Sqlite/SqlitePersistenceProviderFixture.cs index f8318ad9b..ded55751f 100644 --- a/test/WorkflowCore.Tests.Sqlite/SqlitePersistenceProviderFixture.cs +++ b/test/WorkflowCore.Tests.Sqlite/SqlitePersistenceProviderFixture.cs @@ -10,18 +10,15 @@ namespace WorkflowCore.Tests.Sqlite [Collection("Sqlite collection")] public class SqlitePersistenceProviderFixture : BasePersistenceFixture { - string _connectionString; - public SqlitePersistenceProviderFixture(SqliteSetup setup) { - _connectionString = setup.ConnectionString; } protected override IPersistenceProvider Subject { get - { - var db = new EntityFrameworkPersistenceProvider(new SqliteContextFactory(_connectionString), true, false); + { + var db = new EntityFrameworkPersistenceProvider(new SqliteContextFactory(SqliteSetup.ConnectionString), true, false); db.EnsureStoreExists(); return db; }