58 lines
2.2 KiB
C#
58 lines
2.2 KiB
C#
// <copyright file="HybridLogicalClockTests.Initialize.cs" company="StellaOps">
|
|
// Copyright (c) StellaOps. Licensed under BUSL-1.1.
|
|
// </copyright>
|
|
using FluentAssertions;
|
|
using System.Threading;
|
|
using Xunit;
|
|
|
|
namespace StellaOps.HybridLogicalClock.Tests;
|
|
|
|
public sealed partial class HybridLogicalClockTests
|
|
{
|
|
[Fact]
|
|
public async Task InitializeFromStateAsync_NoState_ReturnsFalseAsync()
|
|
{
|
|
var timeProvider = CreateTimeProvider(FixedTime);
|
|
var clock = CreateClock(timeProvider);
|
|
|
|
var result = await clock.InitializeFromStateAsync(CancellationToken.None);
|
|
|
|
result.Should().BeFalse();
|
|
clock.Current.PhysicalTime.Should().Be(0);
|
|
clock.Current.LogicalCounter.Should().Be(0);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task InitializeFromStateAsync_PersistedAhead_UsesPersistedTimeAsync()
|
|
{
|
|
var timeProvider = CreateTimeProvider(FixedTime);
|
|
var stateStore = new InMemoryHlcStateStore();
|
|
var persisted = CreateRemoteTimestamp(FixedTime.AddMilliseconds(10), 3, TestNodeId);
|
|
await stateStore.SaveAsync(persisted, CancellationToken.None);
|
|
var clock = CreateClock(timeProvider, store: stateStore);
|
|
|
|
var result = await clock.InitializeFromStateAsync(CancellationToken.None);
|
|
|
|
result.Should().BeTrue();
|
|
clock.Current.PhysicalTime.Should().Be(persisted.PhysicalTime);
|
|
clock.Current.LogicalCounter.Should().Be(persisted.LogicalCounter + 1);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task InitializeFromStateAsync_PhysicalNowAhead_ResetsCounterAsync()
|
|
{
|
|
var physicalNow = FixedTime.AddMilliseconds(50);
|
|
var timeProvider = CreateTimeProvider(physicalNow);
|
|
var stateStore = new InMemoryHlcStateStore();
|
|
var persisted = CreateRemoteTimestamp(FixedTime, 7, TestNodeId);
|
|
await stateStore.SaveAsync(persisted, CancellationToken.None);
|
|
var clock = CreateClock(timeProvider, store: stateStore);
|
|
|
|
var result = await clock.InitializeFromStateAsync(CancellationToken.None);
|
|
|
|
result.Should().BeTrue();
|
|
clock.Current.PhysicalTime.Should().Be(physicalNow.ToUnixTimeMilliseconds());
|
|
clock.Current.LogicalCounter.Should().Be(0);
|
|
}
|
|
}
|