Adds the Persistence vNext proof of concept, including provider-neutral schema/document abstractions, relational and document provider POCs, Elsa integration, runtime-defined entities, physicalization planning, workflow runtime evaluation, and focused tests.
99 lines
3.7 KiB
C#
99 lines
3.7 KiB
C#
using Elsa.Persistence.VNext.Runtime.Evaluation;
|
|
|
|
namespace Elsa.Persistence.VNext.UnitTests;
|
|
|
|
public class WorkflowRuntimePersistenceEvaluatorTests
|
|
{
|
|
private readonly WorkflowRuntimePersistenceEvaluator _evaluator = new();
|
|
|
|
[Fact]
|
|
public void Evaluator_AdoptsMetadataStoreWithProviderContractTests()
|
|
{
|
|
var candidate = new WorkflowRuntimePersistenceCandidate(
|
|
"WorkflowDefinitions",
|
|
WorkflowRuntimePersistenceArea.Management,
|
|
WorkflowRuntimePersistenceWorkload.Metadata,
|
|
RequiresDistributedLocking: false,
|
|
RequiresOrderedAppend: false,
|
|
HasRepresentativeBenchmark: false,
|
|
HasProviderContractTests: true);
|
|
|
|
var decision = _evaluator.Evaluate(candidate);
|
|
|
|
Assert.Equal(WorkflowRuntimePersistenceDecisionKind.AdoptVNext, decision.Kind);
|
|
Assert.Contains("Metadata workloads fit", decision.Reasons.Single());
|
|
}
|
|
|
|
[Fact]
|
|
public void Evaluator_DefersHotDistributedLookupWithoutBenchmarkEvidence()
|
|
{
|
|
var candidate = new WorkflowRuntimePersistenceCandidate(
|
|
"Bookmarks",
|
|
WorkflowRuntimePersistenceArea.Bookmarks,
|
|
WorkflowRuntimePersistenceWorkload.HotLookup,
|
|
RequiresDistributedLocking: true,
|
|
RequiresOrderedAppend: false,
|
|
HasRepresentativeBenchmark: false,
|
|
HasProviderContractTests: true);
|
|
|
|
var decision = _evaluator.Evaluate(candidate);
|
|
|
|
Assert.Equal(WorkflowRuntimePersistenceDecisionKind.DeferUntilBenchmarked, decision.Kind);
|
|
Assert.Contains("benchmark and lock/concurrency evidence", decision.Reasons.Single());
|
|
}
|
|
|
|
[Fact]
|
|
public void Evaluator_AllowsPhysicalizedHotLookupWhenEvidenceExists()
|
|
{
|
|
var candidate = new WorkflowRuntimePersistenceCandidate(
|
|
"Triggers",
|
|
WorkflowRuntimePersistenceArea.Triggers,
|
|
WorkflowRuntimePersistenceWorkload.HotLookup,
|
|
RequiresDistributedLocking: true,
|
|
RequiresOrderedAppend: false,
|
|
HasRepresentativeBenchmark: true,
|
|
HasProviderContractTests: true);
|
|
|
|
var decision = _evaluator.Evaluate(candidate);
|
|
|
|
Assert.Equal(WorkflowRuntimePersistenceDecisionKind.AdoptWithPhysicalization, decision.Kind);
|
|
Assert.Contains("physicalization policy", decision.RequiredEvidence.Single());
|
|
}
|
|
|
|
[Fact]
|
|
public void Evaluator_KeepsQueueWorkloadSpecialized()
|
|
{
|
|
var candidate = new WorkflowRuntimePersistenceCandidate(
|
|
"BookmarkQueue",
|
|
WorkflowRuntimePersistenceArea.Bookmarks,
|
|
WorkflowRuntimePersistenceWorkload.Queue,
|
|
RequiresDistributedLocking: true,
|
|
RequiresOrderedAppend: false,
|
|
HasRepresentativeBenchmark: true,
|
|
HasProviderContractTests: true);
|
|
|
|
var decision = _evaluator.Evaluate(candidate);
|
|
|
|
Assert.Equal(WorkflowRuntimePersistenceDecisionKind.KeepSpecializedProvider, decision.Kind);
|
|
Assert.Contains("Queue workloads need", decision.Reasons.Single());
|
|
}
|
|
|
|
[Fact]
|
|
public void Evaluator_KeepsOrderedLogSpecialized()
|
|
{
|
|
var candidate = new WorkflowRuntimePersistenceCandidate(
|
|
"WorkflowExecutionLog",
|
|
WorkflowRuntimePersistenceArea.ExecutionLogs,
|
|
WorkflowRuntimePersistenceWorkload.AppendOnlyLog,
|
|
RequiresDistributedLocking: false,
|
|
RequiresOrderedAppend: true,
|
|
HasRepresentativeBenchmark: true,
|
|
HasProviderContractTests: true);
|
|
|
|
var decision = _evaluator.Evaluate(candidate);
|
|
|
|
Assert.Equal(WorkflowRuntimePersistenceDecisionKind.KeepSpecializedProvider, decision.Kind);
|
|
Assert.Contains("ordered append", decision.Reasons.Single());
|
|
}
|
|
}
|