Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public void CompletedStoredEffectWithResultCanBeSerializedAndDeserialized()
{
var effectId = new EffectId("SomeEffect", EffectType.Effect, Context: "");
var result = "SomeResult"u8.ToArray();
var storedEffect = StoredEffect.CreateCompleted(effectId, result);
var storedEffect = StoredEffect.CreateCompleted(effectId, result, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -28,7 +28,7 @@ public void CompletedStoredEffectWithResultCanBeSerializedAndDeserialized()
public void CompletedStoredEffectWithoutResultCanBeSerializedAndDeserialized()
{
var effectId = new EffectId("SomeEffect", EffectType.Effect, Context: "");
var storedEffect = StoredEffect.CreateCompleted(effectId);
var storedEffect = StoredEffect.CreateCompleted(effectId, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -43,7 +43,7 @@ public void CompletedStoredEffectWithoutResultCanBeSerializedAndDeserialized()
public void StartedStoredEffectCanBeSerializedAndDeserialized()
{
var effectId = new EffectId("SomeEffect", EffectType.Effect, Context: "");
var storedEffect = StoredEffect.CreateStarted(effectId);
var storedEffect = StoredEffect.CreateStarted(effectId, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -63,7 +63,7 @@ public void FailedStoredEffectWithExceptionCanBeSerializedAndDeserialized()
ExceptionStackTrace: "at SomeMethod() in SomeFile.cs:line 42",
ExceptionType: "System.InvalidOperationException"
);
var storedEffect = StoredEffect.CreateFailed(effectId, storedException);
var storedEffect = StoredEffect.CreateFailed(effectId, storedException, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -82,7 +82,7 @@ public void StoredEffectWithStateTypeCanBeSerializedAndDeserialized()
{
var effectId = new EffectId("SomeState", EffectType.State, Context: "");
var result = "{\"key\":\"value\"}"u8.ToArray();
var storedEffect = StoredEffect.CreateCompleted(effectId, result);
var storedEffect = StoredEffect.CreateCompleted(effectId, result, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -99,7 +99,7 @@ public void StoredEffectWithContextCanBeSerializedAndDeserialized()
var parentEffect = new EffectId("ParentEffect", EffectType.Effect, Context: "");
var effectId = new EffectId("ChildEffect", EffectType.Effect, Context: parentEffect.Serialize().Value);
var result = "SomeData"u8.ToArray();
var storedEffect = StoredEffect.CreateCompleted(effectId, result);
var storedEffect = StoredEffect.CreateCompleted(effectId, result, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -114,7 +114,7 @@ public void StoredEffectWithContextCanBeSerializedAndDeserialized()
public void StoredEffectWithTimeoutTypeCanBeSerializedAndDeserialized()
{
var effectId = new EffectId("SomeTimeout", EffectType.Timeout, Context: "");
var storedEffect = StoredEffect.CreateStarted(effectId);
var storedEffect = StoredEffect.CreateStarted(effectId, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -128,7 +128,7 @@ public void StoredEffectWithTimeoutTypeCanBeSerializedAndDeserialized()
public void StoredEffectWithRetryTypeCanBeSerializedAndDeserialized()
{
var effectId = new EffectId("SomeRetry", EffectType.Retry, Context: "");
var storedEffect = StoredEffect.CreateCompleted(effectId);
var storedEffect = StoredEffect.CreateCompleted(effectId, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -142,7 +142,7 @@ public void StoredEffectWithRetryTypeCanBeSerializedAndDeserialized()
public void StoredEffectWithSystemTypeCanBeSerializedAndDeserialized()
{
var effectId = new EffectId("SomeSystem", EffectType.System, Context: "");
var storedEffect = StoredEffect.CreateCompleted(effectId);
var storedEffect = StoredEffect.CreateCompleted(effectId, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -160,7 +160,7 @@ public void StoredEffectWithLargeResultCanBeSerializedAndDeserialized()
for (int i = 0; i < largeResult.Length; i++)
largeResult[i] = (byte)(i % 256);

var storedEffect = StoredEffect.CreateCompleted(effectId, largeResult);
var storedEffect = StoredEffect.CreateCompleted(effectId, largeResult, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -175,7 +175,7 @@ public void StoredEffectWithSpecialCharactersInIdCanBeSerializedAndDeserialized(
{
var effectId = new EffectId("Effect.With\\Special.Characters", EffectType.Effect, Context: "");
var result = "Data"u8.ToArray();
var storedEffect = StoredEffect.CreateCompleted(effectId, result);
var storedEffect = StoredEffect.CreateCompleted(effectId, result, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -190,7 +190,7 @@ public void StoredEffectWithSpecialCharactersInIdCanBeSerializedAndDeserialized(
public void StoredEffectWithEmptyIdCanBeSerializedAndDeserialized()
{
var effectId = new EffectId("", EffectType.Effect, Context: "");
var storedEffect = StoredEffect.CreateCompleted(effectId);
var storedEffect = StoredEffect.CreateCompleted(effectId, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand All @@ -209,7 +209,7 @@ public void StoredEffectWithNullStackTraceCanBeSerializedAndDeserialized()
ExceptionStackTrace: null,
ExceptionType: "System.Exception"
);
var storedEffect = StoredEffect.CreateFailed(effectId, storedException);
var storedEffect = StoredEffect.CreateFailed(effectId, storedException, alias: null);

var serialized = storedEffect.Serialize();
var deserialized = StoredEffect.Deserialize(serialized);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ async Task(string param, Workflow workflow) =>
{
await workflow.Effect
.Capture(
id: "id",
"id",
work: () =>
{
counter.Increment();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
{
var (effect, _) = workflow;
await effect.Capture(
id: "Test",
"Test",
work: () => syncedCounter.Increment()
);
});
Expand All @@ -46,14 +46,14 @@

syncedCounter.Current.ShouldBe(1);
var effectResults = await store.EffectsStore.GetEffectResults(storedId);
effectResults.Single(r => r.EffectId == "Test".ToEffectId()).WorkStatus.ShouldBe(WorkStatus.Completed);
effectResults.Single(r => r.Alias == "Test").WorkStatus.ShouldBe(WorkStatus.Completed);

var controlPanel = await rAction.ControlPanel(flowId.Instance);
controlPanel.ShouldNotBeNull();
await controlPanel.Restart();

effectResults = await store.EffectsStore.GetEffectResults(storedId);
effectResults.Single(r => r.EffectId == "Test".ToEffectId()).WorkStatus.ShouldBe(WorkStatus.Completed);
effectResults.Single(r => r.Alias == "Test").WorkStatus.ShouldBe(WorkStatus.Completed);
syncedCounter.Current.ShouldBe(1);
}

Expand All @@ -71,7 +71,7 @@
{
var (effect, _) = workflow;
await effect.Capture(
id: "Test",
"Test",
work: () => { syncedCounter.Increment(); return Task.CompletedTask; });
});

Expand All @@ -84,14 +84,14 @@

syncedCounter.Current.ShouldBe(1);
var effectResults = await store.EffectsStore.GetEffectResults(storedId);
effectResults.Single(r => r.EffectId == "Test".ToEffectId()).WorkStatus.ShouldBe(WorkStatus.Completed);
effectResults.Single(r => r.Alias == "Test").WorkStatus.ShouldBe(WorkStatus.Completed);

var controlPanel = await rAction.ControlPanel(flowId.Instance);
controlPanel.ShouldNotBeNull();
await controlPanel.Restart();

effectResults = await store.EffectsStore.GetEffectResults(storedId);
effectResults.Single(r => r.EffectId == "Test".ToEffectId()).WorkStatus.ShouldBe(WorkStatus.Completed);
effectResults.Single(r => r.Alias == "Test").WorkStatus.ShouldBe(WorkStatus.Completed);
syncedCounter.Current.ShouldBe(1);
}

Expand All @@ -109,7 +109,7 @@
{
var (effect, _) = workflow;
await effect.Capture(
id: "Test",
"Test",
work: () =>
{
syncedCounter.Increment();
Expand All @@ -126,7 +126,7 @@

syncedCounter.Current.ShouldBe(1);
var effectResults = await store.EffectsStore.GetEffectResults(storedId);
var storedEffect = effectResults.Single(r => r.EffectId == "Test".ToEffectId());
var storedEffect = effectResults.Single(r => r.Alias == "Test");
storedEffect.WorkStatus.ShouldBe(WorkStatus.Completed);
storedEffect.Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<string>().ShouldBe("hello");

Expand All @@ -135,7 +135,7 @@
await controlPanel.Restart();

effectResults = await store.EffectsStore.GetEffectResults(storedId);
storedEffect = effectResults.Single(r => r.EffectId == "Test".ToEffectId());
storedEffect = effectResults.Single(r => r.Alias == "Test");
storedEffect.WorkStatus.ShouldBe(WorkStatus.Completed);
storedEffect.Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<string>().ShouldBe("hello");
syncedCounter.Current.ShouldBe(1);
Expand All @@ -155,7 +155,7 @@
{
var (effect, _) = workflow;
await effect.Capture(
id: "Test",
"Test",
work: () =>
{
syncedCounter.Increment();
Expand All @@ -172,7 +172,7 @@

syncedCounter.Current.ShouldBe(1);
var effectResults = await store.EffectsStore.GetEffectResults(storedId);
var storedEffect = effectResults.Single(r => r.EffectId == "Test".ToEffectId());
var storedEffect = effectResults.Single(r => r.Alias == "Test");
storedEffect.WorkStatus.ShouldBe(WorkStatus.Completed);
storedEffect.Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<string>().ShouldBe("hello");

Expand All @@ -181,7 +181,7 @@
await controlPanel.Restart();

effectResults = await store.EffectsStore.GetEffectResults(storedId);
storedEffect = effectResults.Single(r => r.EffectId == "Test".ToEffectId());
storedEffect = effectResults.Single(r => r.Alias == "Test");
storedEffect.WorkStatus.ShouldBe(WorkStatus.Completed);
storedEffect.Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<string>().ShouldBe("hello");
syncedCounter.Current.ShouldBe(1);
Expand All @@ -201,7 +201,7 @@
{
var (effect, _) = workflow;
await effect.Capture(
id: "Test",
"Test",
work: () =>
{
syncedCounter.Increment();
Expand All @@ -218,7 +218,7 @@

syncedCounter.Current.ShouldBe(1);
var effectResults = await store.EffectsStore.GetEffectResults(storedId);
var storedEffect = effectResults.Single(r => r.EffectId == "Test".ToEffectId());
var storedEffect = effectResults.Single(r => r.Alias == "Test");
storedEffect.WorkStatus.ShouldBe(WorkStatus.Failed);
storedEffect.StoredException.ShouldNotBeNull();
storedEffect.StoredException.ExceptionType.ShouldContain("InvalidOperationException");
Expand All @@ -228,7 +228,7 @@
await Should.ThrowAsync<FatalWorkflowException>(() => controlPanel.Restart());

effectResults = await store.EffectsStore.GetEffectResults(storedId);
storedEffect = effectResults.Single(r => r.EffectId == "Test".ToEffectId());
storedEffect = effectResults.Single(r => r.Alias == "Test");
storedEffect.WorkStatus.ShouldBe(WorkStatus.Failed);
storedEffect.StoredException.ShouldNotBeNull();
storedEffect.StoredException.ExceptionType.ShouldContain("InvalidOperationException");
Expand Down Expand Up @@ -257,7 +257,7 @@

var storedId = rAction.MapToStoredId(flowId.Instance);
var effectResults = await store.EffectsStore.GetEffectResults(storedId);
var storedEffect = effectResults.Single(r => r.EffectId == "WhenAny".ToEffectId());
var storedEffect = effectResults.Single(r => r.Alias == "WhenAny");
storedEffect.WorkStatus.ShouldBe(WorkStatus.Completed);
storedEffect.Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<int>().ShouldBe(2);
}
Expand All @@ -284,7 +284,7 @@

var storedId = rAction.MapToStoredId(flowId.Instance);
var effectResults = await store.EffectsStore.GetEffectResults(storedId);
var storedEffect = effectResults.Single(r => r.EffectId == "WhenAll".ToEffectId());
var storedEffect = effectResults.Single(r => r.Alias == "WhenAll");
storedEffect.WorkStatus.ShouldBe(WorkStatus.Completed);
storedEffect.Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<int[]>().ShouldBe(new [] {1, 2});
}
Expand Down Expand Up @@ -487,10 +487,11 @@
var effectResults = await store.EffectsStore.GetEffectResults(storedId);

var subEffectValue1Id = effectResults.Single(se => se.EffectId.Id == "SubEffectValue1").EffectId;
subEffectValue1Id.Context.ShouldBe("EGrandParent.EMother");

// With implicit IDs for Capture effects, context uses implicit IDs
subEffectValue1Id.Context.ShouldBe("E0.E0");

var subEffectValue2Id = effectResults.Single(se => se.EffectId.Id == "SubEffectValue2").EffectId;
subEffectValue2Id.Context.ShouldBe("EGrandParent.EFather");
subEffectValue2Id.Context.ShouldBe("E0.E1");
}

public abstract Task ExceptionThrownInsideEffectBecomesFatalWorkflowException();
Expand Down Expand Up @@ -572,7 +573,7 @@
{
var (effect, _) = workflow;
return await effect.Capture(
id: "Test",
"Test",
work: () => Option.Create(message)
);
});
Expand Down Expand Up @@ -661,42 +662,23 @@
public async Task CaptureUsingAtLeastOnceWithoutFlushResiliencyDelaysFlush(Task<IFunctionStore> storeTask)
{
var store = await storeTask;
var storedId = TestStoredId.Create();
var session = await store.CreateFunction(
storedId,
"SomeInstance",
param: null,
leaseExpiration: 0,
postponeUntil: null,
timestamp: 0,
parent: null,
owner: ReplicaId.NewId()
);

var effectStore = store.EffectsStore;
var effectResults = new EffectResults(
TestFlowId.Create(),
storedId,
lazyExistingEffects: new Lazy<Task<IReadOnlyList<StoredEffect>>>(
() => new List<StoredEffect>().CastTo<IReadOnlyList<StoredEffect>>().ToTask()
),
effectStore,
DefaultSerializer.Instance,
session
);
var effect = new Effect(effectResults, utcNow: () => DateTime.UtcNow, new FlowMinimumTimeout());

var result = await effect.Capture("1", () => "hello world", ResiliencyLevel.AtLeastOnceDelayFlush);
result.ShouldBe("hello world");
var id = TestFlowId.Create();

await effectStore.GetEffectResults(storedId).ShouldBeEmptyAsync();
using var registry = new FunctionsRegistry(store);
var afterCaptureFlag = new SyncedFlag();
var completeFunction = new SyncedFlag();
var registration = registry.RegisterParamless(
id.Type,
inner: async workflow =>
{
await workflow.Effect.Capture("Alias", () => "hello world", ResiliencyLevel.AtLeastOnceDelayFlush);
afterCaptureFlag.Raise();
await completeFunction.WaitForRaised();
});

registration.Schedule(storedId.)

Check failure on line 679 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

; expected

Check failure on line 679 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

Identifier expected

Check failure on line 679 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

; expected

Check failure on line 679 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

Identifier expected

Check failure on line 679 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

; expected

Check failure on line 679 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

Identifier expected

Check failure on line 679 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

; expected

Check failure on line 679 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

Identifier expected
registration.ControlPanel()

Check failure on line 680 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

; expected

Check failure on line 680 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

; expected

Check failure on line 680 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

; expected

Check failure on line 680 in Core/Cleipnir.ResilientFunctions.Tests/TestTemplates/FunctionTests/EffectTests.cs

View workflow job for this annotation

GitHub Actions / build

; expected

await effect.Capture("2", () => "hello universe");

var storedEffects = await effectStore.GetEffectResults(storedId);
storedEffects.Count.ShouldBe(2);
storedEffects.Single(se => se.EffectId.Id == "1").Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<string>().ShouldBe("hello world");
storedEffects.Single(se => se.EffectId.Id == "2").Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<string>().ShouldBe("hello universe");
}

public abstract Task CaptureUsingAtLeastOnceWithoutFlushResiliencyDelaysFlushInFlow();
Expand Down Expand Up @@ -737,7 +719,7 @@
await cp.Refresh();
effectIds = (await cp.Effects.AllIds).ToList();
effectIds.Count().ShouldBe(1);
effectIds.Single().Id.ShouldBe("SomeEffectId");
// Effect can be retrieved by alias
(await cp.Effects.GetValue<Guid>("SomeEffectId")).ShouldBe(someEffectIdValue);
}

Expand Down Expand Up @@ -777,8 +759,9 @@

var storedEffects = await effectStore.GetEffectResults(storedId);
storedEffects.Count.ShouldBe(2);
storedEffects.Single(se => se.EffectId.Id == "1").Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<string>().ShouldBe("hello world again");
storedEffects.Single(se => se.EffectId.Id == "2").Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<string>().ShouldBe("hello universe");
// "1" and "2" are now aliases
storedEffects.Single(se => se.Alias == "1").Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<string>().ShouldBe("hello world again");
storedEffects.Single(se => se.Alias == "2").Result!.ToStringFromUtf8Bytes().DeserializeFromJsonTo<string>().ShouldBe("hello universe");
}

public abstract Task CaptureEffectWithRetryPolicy();
Expand Down
Loading
Loading