diff --git a/Core/Cleipnir.ResilientFunctions.Tests/InMemoryTests/RFunctionTests/ActivitiesTests.cs b/Core/Cleipnir.ResilientFunctions.Tests/InMemoryTests/RFunctionTests/ActivitiesTests.cs index 40bc74dc..cb0af548 100644 --- a/Core/Cleipnir.ResilientFunctions.Tests/InMemoryTests/RFunctionTests/ActivitiesTests.cs +++ b/Core/Cleipnir.ResilientFunctions.Tests/InMemoryTests/RFunctionTests/ActivitiesTests.cs @@ -31,4 +31,8 @@ public override Task ExceptionThrowingActionTest() [TestMethod] public override Task TaskWhenAnyFuncTest() => TaskWhenAnyFuncTest(new InMemoryFunctionStore().CastTo().ToTask()); + + [TestMethod] + public override Task ClearActivityTest() + => ClearActivityTest(new InMemoryFunctionStore().CastTo().ToTask()); } \ No newline at end of file diff --git a/Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/RFunctionTests/ActivitiesTests.cs b/Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/RFunctionTests/ActivitiesTests.cs index 6f14e7d3..c6dbc150 100644 --- a/Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/RFunctionTests/ActivitiesTests.cs +++ b/Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/RFunctionTests/ActivitiesTests.cs @@ -250,4 +250,39 @@ async Task (string param, Context context) => storedActivity.WorkStatus.ShouldBe(WorkStatus.Completed); storedActivity.Result!.DeserializeFromJsonTo().ShouldBe(2); } + + public abstract Task ClearActivityTest(); + public async Task ClearActivityTest(Task storeTask) + { + var store = await storeTask; + using var rFunctions = new RFunctions(store); + var functionId = TestFunctionId.Create(); + var (functionTypeId, functionInstanceId) = functionId; + + await store.CreateFunction( + functionId, + Test.SimpleStoredParameter, + Test.SimpleStoredScrapbook, + leaseExpiration: DateTime.Now.Ticks, + postponeUntil: null, + timestamp: DateTime.Now.Ticks + ); + + var registration = rFunctions.RegisterAction( + functionTypeId, + async Task (string param, Context context) => + { + var (activities, _) = context; + await activities.Clear("SomeActivity"); + }); + + var controlPanel = await registration.ControlPanel(functionId.InstanceId); + controlPanel.ShouldNotBeNull(); + + await controlPanel.Activities.SetSucceeded("SomeActivity"); + await controlPanel.ReInvoke(); + + await controlPanel.Refresh(); + controlPanel.Activities.All.Count.ShouldBe(0); + } } \ No newline at end of file diff --git a/Core/Cleipnir.ResilientFunctions.Tests/Utils/Test.cs b/Core/Cleipnir.ResilientFunctions.Tests/Utils/Test.cs index 71ca29fc..6f6956e7 100644 --- a/Core/Cleipnir.ResilientFunctions.Tests/Utils/Test.cs +++ b/Core/Cleipnir.ResilientFunctions.Tests/Utils/Test.cs @@ -7,7 +7,7 @@ namespace Cleipnir.ResilientFunctions.Tests.Utils; public static class Test { public static StoredParameter SimpleStoredParameter { get; } = - new(ParamJson: "hello world", ParamType: typeof(string).SimpleQualifiedName()); + new(ParamJson: "hello world".ToJson(), ParamType: typeof(string).SimpleQualifiedName()); public static StoredScrapbook SimpleStoredScrapbook { get; } = new(ScrapbookJson: new RScrapbook().ToJson(), ScrapbookType: typeof(RScrapbook).SimpleQualifiedName()); diff --git a/Core/Cleipnir.ResilientFunctions/Domain/Activities.cs b/Core/Cleipnir.ResilientFunctions/Domain/Activities.cs index f5c04228..e3cedb29 100644 --- a/Core/Cleipnir.ResilientFunctions/Domain/Activities.cs +++ b/Core/Cleipnir.ResilientFunctions/Domain/Activities.cs @@ -146,6 +146,17 @@ await _activityStore.SetActivityResult( return result; } + + public async Task Clear(string id) + { + lock (_sync) + if (!_activityResults.ContainsKey(id)) + return; + + await _activityStore.DeleteActivityResult(_functionId, id); + lock (_sync) + _activityResults.Remove(id); + } public Task WhenAny(string id, params Task[] tasks) => Do(id, async () => await await Task.WhenAny(tasks)); diff --git a/Stores/AzureBlob/Cleipnir.ResilientFunctions.AzureBlob.Tests/RFunctionTests/ActivitiesTests.cs b/Stores/AzureBlob/Cleipnir.ResilientFunctions.AzureBlob.Tests/RFunctionTests/ActivitiesTests.cs index eb87bb1c..a6d06ae9 100644 --- a/Stores/AzureBlob/Cleipnir.ResilientFunctions.AzureBlob.Tests/RFunctionTests/ActivitiesTests.cs +++ b/Stores/AzureBlob/Cleipnir.ResilientFunctions.AzureBlob.Tests/RFunctionTests/ActivitiesTests.cs @@ -29,4 +29,8 @@ public override Task ExceptionThrowingActionTest() [TestMethod] public override Task TaskWhenAnyFuncTest() => TaskWhenAnyFuncTest(FunctionStoreFactory.Create()); + + [TestMethod] + public override Task ClearActivityTest() + => ClearActivityTest(FunctionStoreFactory.Create()); } \ No newline at end of file diff --git a/Stores/MySQL/Cleipnir.ResilientFunctions.MySQL.Tests/RFunctionTests/ActivitiesTests.cs b/Stores/MySQL/Cleipnir.ResilientFunctions.MySQL.Tests/RFunctionTests/ActivitiesTests.cs index e44870bb..55b80531 100644 --- a/Stores/MySQL/Cleipnir.ResilientFunctions.MySQL.Tests/RFunctionTests/ActivitiesTests.cs +++ b/Stores/MySQL/Cleipnir.ResilientFunctions.MySQL.Tests/RFunctionTests/ActivitiesTests.cs @@ -28,4 +28,8 @@ public override Task ExceptionThrowingActionTest() [TestMethod] public override Task TaskWhenAnyFuncTest() => TaskWhenAnyFuncTest(FunctionStoreFactory.Create()); + + [TestMethod] + public override Task ClearActivityTest() + => ClearActivityTest(FunctionStoreFactory.Create()); } \ No newline at end of file diff --git a/Stores/PostgreSQL/Cleipnir.ResilientFunctions.PostgreSQL.Tests/RFunctionTests/ActivitiesTests.cs b/Stores/PostgreSQL/Cleipnir.ResilientFunctions.PostgreSQL.Tests/RFunctionTests/ActivitiesTests.cs index 59e1e00b..5e3e490d 100644 --- a/Stores/PostgreSQL/Cleipnir.ResilientFunctions.PostgreSQL.Tests/RFunctionTests/ActivitiesTests.cs +++ b/Stores/PostgreSQL/Cleipnir.ResilientFunctions.PostgreSQL.Tests/RFunctionTests/ActivitiesTests.cs @@ -29,4 +29,8 @@ public override Task ExceptionThrowingActionTest() [TestMethod] public override Task TaskWhenAnyFuncTest() => TaskWhenAnyFuncTest(FunctionStoreFactory.Create()); + + [TestMethod] + public override Task ClearActivityTest() + => ClearActivityTest(FunctionStoreFactory.Create()); } \ No newline at end of file diff --git a/Stores/SqlServer/Cleipnir.ResilientFunctions.SqlServer.Tests/ActivitiesTests.cs b/Stores/SqlServer/Cleipnir.ResilientFunctions.SqlServer.Tests/ActivitiesTests.cs index 7f7e2574..42845901 100644 --- a/Stores/SqlServer/Cleipnir.ResilientFunctions.SqlServer.Tests/ActivitiesTests.cs +++ b/Stores/SqlServer/Cleipnir.ResilientFunctions.SqlServer.Tests/ActivitiesTests.cs @@ -29,4 +29,8 @@ public override Task ExceptionThrowingActionTest() [TestMethod] public override Task TaskWhenAnyFuncTest() => TaskWhenAnyFuncTest(FunctionStoreFactory.Create()); + + [TestMethod] + public override Task ClearActivityTest() + => ClearActivityTest(FunctionStoreFactory.Create()); } \ No newline at end of file