Reformat / cleanup
All checks were successful
NuGet Publish / build-and-pack (push) Successful in 46s
NuGet Publish / publish-to-gitea (push) Successful in 56s

This commit is contained in:
Joseph Doherty
2026-02-21 08:10:36 -05:00
parent 4c6aaa5a3f
commit a70d8befae
176 changed files with 50555 additions and 49587 deletions

View File

@@ -1,29 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ZB.MOM.WW.CBDD.Core.CDC;
using ZB.MOM.WW.CBDD.Shared;
using Xunit;
namespace ZB.MOM.WW.CBDD.Tests;
public class CdcScalabilityTests : IDisposable
{
private readonly Shared.TestDbContext _db;
private readonly TestDbContext _db;
private readonly string _dbPath;
/// <summary>
/// Initializes a new instance of the <see cref="CdcScalabilityTests"/> class.
/// Initializes a new instance of the <see cref="CdcScalabilityTests" /> class.
/// </summary>
public CdcScalabilityTests()
{
_dbPath = Path.Combine(Path.GetTempPath(), $"cdc_scaling_{Guid.NewGuid()}.db");
_db = new Shared.TestDbContext(_dbPath);
_db = new TestDbContext(_dbPath);
}
/// <summary>
/// Verifies CDC dispatch reaches all registered subscribers.
/// Disposes test resources and removes temporary files.
/// </summary>
public void Dispose()
{
_db.Dispose();
if (File.Exists(_dbPath)) File.Delete(_dbPath);
string wal = Path.ChangeExtension(_dbPath, ".wal");
if (File.Exists(wal)) File.Delete(wal);
}
/// <summary>
/// Verifies CDC dispatch reaches all registered subscribers.
/// </summary>
[Fact]
public async Task Test_Cdc_1000_Subscribers_Receive_Events()
@@ -34,13 +39,10 @@ public class CdcScalabilityTests : IDisposable
var subscriptions = new List<IDisposable>();
// 1. Create 1000 subscribers
for (int i = 0; i < SubscriberCount; i++)
for (var i = 0; i < SubscriberCount; i++)
{
int index = i;
var sub = _db.People.Watch().Subscribe(_ =>
{
Interlocked.Increment(ref eventCounts[index]);
});
var sub = _db.People.Watch().Subscribe(_ => { Interlocked.Increment(ref eventCounts[index]); });
subscriptions.Add(sub);
}
@@ -53,16 +55,13 @@ public class CdcScalabilityTests : IDisposable
await Task.Delay(1000, ct);
// 4. Verify all subscribers received both events
for (int i = 0; i < SubscriberCount; i++)
{
eventCounts[i].ShouldBe(2);
}
for (var i = 0; i < SubscriberCount; i++) eventCounts[i].ShouldBe(2);
foreach (var sub in subscriptions) sub.Dispose();
}
/// <summary>
/// Verifies a slow subscriber does not block other subscribers.
/// Verifies a slow subscriber does not block other subscribers.
/// </summary>
[Fact(Skip = "Performance test - run manually when needed")]
public async Task Test_Cdc_Slow_Subscriber_Does_Not_Block_Others()
@@ -80,10 +79,7 @@ public class CdcScalabilityTests : IDisposable
});
// 2. Register a fast subscriber
using var fastSub = _db.People.Watch().Subscribe(_ =>
{
Interlocked.Increment(ref fastEventCount);
});
using var fastSub = _db.People.Watch().Subscribe(_ => { Interlocked.Increment(ref fastEventCount); });
// 3. Perform a write
_db.People.Insert(new Person { Id = 1, Name = "John", Age = 30 });
@@ -107,15 +103,4 @@ public class CdcScalabilityTests : IDisposable
await Task.Delay(2500, ct); // Wait for the second one in slow sub to be processed after the first Sleep
slowEventCount.ShouldBe(2);
}
/// <summary>
/// Disposes test resources and removes temporary files.
/// </summary>
public void Dispose()
{
_db.Dispose();
if (File.Exists(_dbPath)) File.Delete(_dbPath);
var wal = Path.ChangeExtension(_dbPath, ".wal");
if (File.Exists(wal)) File.Delete(wal);
}
}
}