Implement TimeProvider injection for deterministic timestamps across various services and modules
This commit is contained in:
@@ -55,6 +55,7 @@ public sealed class FacetDriftVexWorkflow
|
||||
private readonly FacetDriftVexEmitter _emitter;
|
||||
private readonly IFacetDriftVexDraftStore _draftStore;
|
||||
private readonly ILogger<FacetDriftVexWorkflow> _logger;
|
||||
private readonly TimeProvider _timeProvider;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="FacetDriftVexWorkflow"/> class.
|
||||
@@ -62,11 +63,13 @@ public sealed class FacetDriftVexWorkflow
|
||||
public FacetDriftVexWorkflow(
|
||||
FacetDriftVexEmitter emitter,
|
||||
IFacetDriftVexDraftStore draftStore,
|
||||
ILogger<FacetDriftVexWorkflow>? logger = null)
|
||||
ILogger<FacetDriftVexWorkflow>? logger = null,
|
||||
TimeProvider? timeProvider = null)
|
||||
{
|
||||
_emitter = emitter ?? throw new ArgumentNullException(nameof(emitter));
|
||||
_draftStore = draftStore ?? throw new ArgumentNullException(nameof(draftStore));
|
||||
_logger = logger ?? NullLogger<FacetDriftVexWorkflow>.Instance;
|
||||
_timeProvider = timeProvider ?? TimeProvider.System;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -261,6 +264,6 @@ public sealed class FacetDriftVexWorkflow
|
||||
/// </summary>
|
||||
public Task<ImmutableArray<FacetDriftVexDraft>> GetOverdueDraftsAsync(CancellationToken ct = default)
|
||||
{
|
||||
return _draftStore.GetOverdueAsync(DateTimeOffset.UtcNow, ct);
|
||||
return _draftStore.GetOverdueAsync(_timeProvider.GetUtcNow(), ct);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,16 @@ public sealed class InMemoryFacetSealStore : IFacetSealStore
|
||||
private readonly ConcurrentDictionary<string, FacetSeal> _sealsByRoot = new();
|
||||
private readonly ConcurrentDictionary<string, SortedSet<string>> _rootsByImage = new();
|
||||
private readonly object _lock = new();
|
||||
private readonly TimeProvider _timeProvider;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="InMemoryFacetSealStore"/> class.
|
||||
/// </summary>
|
||||
/// <param name="timeProvider">Time provider for deterministic timestamps.</param>
|
||||
public InMemoryFacetSealStore(TimeProvider? timeProvider = null)
|
||||
{
|
||||
_timeProvider = timeProvider ?? TimeProvider.System;
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public Task<FacetSeal?> GetLatestSealAsync(string imageDigest, CancellationToken ct = default)
|
||||
@@ -170,7 +180,7 @@ public sealed class InMemoryFacetSealStore : IFacetSealStore
|
||||
ct.ThrowIfCancellationRequested();
|
||||
ArgumentOutOfRangeException.ThrowIfNegativeOrZero(keepAtLeast);
|
||||
|
||||
var cutoff = DateTimeOffset.UtcNow - retentionPeriod;
|
||||
var cutoff = _timeProvider.GetUtcNow() - retentionPeriod;
|
||||
int purged = 0;
|
||||
|
||||
lock (_lock)
|
||||
|
||||
Reference in New Issue
Block a user