65 lines
2.0 KiB
C#
65 lines
2.0 KiB
C#
// <copyright file="InMemoryHlcStateStoreTests.Save.cs" company="StellaOps">
|
|
// Copyright (c) StellaOps. Licensed under BUSL-1.1.
|
|
// </copyright>
|
|
using FluentAssertions;
|
|
using System;
|
|
using System.Threading;
|
|
using Xunit;
|
|
|
|
namespace StellaOps.HybridLogicalClock.Tests;
|
|
|
|
public sealed partial class InMemoryHlcStateStoreTests
|
|
{
|
|
[Fact]
|
|
public async Task SaveAsync_ThenLoadAsync_ReturnsStateAsync()
|
|
{
|
|
var store = new InMemoryHlcStateStore();
|
|
var timestamp = CreateTimestamp("node1", 1000, 5);
|
|
|
|
await store.SaveAsync(timestamp, CancellationToken.None);
|
|
var result = await store.LoadAsync("node1", CancellationToken.None);
|
|
|
|
result.Should().Be(timestamp);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task SaveAsync_GreaterTimestamp_UpdatesAsync()
|
|
{
|
|
var store = new InMemoryHlcStateStore();
|
|
var first = CreateTimestamp("node1", 1000, 5);
|
|
var second = CreateTimestamp("node1", 1000, 10);
|
|
|
|
await store.SaveAsync(first, CancellationToken.None);
|
|
await store.SaveAsync(second, CancellationToken.None);
|
|
var result = await store.LoadAsync("node1", CancellationToken.None);
|
|
|
|
result.Should().Be(second);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task SaveAsync_SmallerTimestamp_DoesNotUpdateAsync()
|
|
{
|
|
var store = new InMemoryHlcStateStore();
|
|
var first = CreateTimestamp("node1", 1000, 10);
|
|
var second = CreateTimestamp("node1", 1000, 5);
|
|
|
|
await store.SaveAsync(first, CancellationToken.None);
|
|
await store.SaveAsync(second, CancellationToken.None);
|
|
var result = await store.LoadAsync("node1", CancellationToken.None);
|
|
|
|
result.Should().Be(first);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task SaveAsync_Cancelled_ThrowsOperationCanceledExceptionAsync()
|
|
{
|
|
var store = new InMemoryHlcStateStore();
|
|
using var cts = new CancellationTokenSource();
|
|
cts.Cancel();
|
|
|
|
var act = () => store.SaveAsync(CreateTimestamp("node1", 1000, 1), cts.Token);
|
|
|
|
await act.Should().ThrowAsync<OperationCanceledException>();
|
|
}
|
|
}
|