Initial import of the CBDDC codebase with docs and tests. Add a .NET-focused gitignore to keep generated artifacts out of source control.
Some checks failed
CI / verify (push) Has been cancelled
Some checks failed
CI / verify (push) Has been cancelled
This commit is contained in:
108
tests/ZB.MOM.WW.CBDDC.Network.Tests/TelemetryTests.cs
Executable file
108
tests/ZB.MOM.WW.CBDDC.Network.Tests/TelemetryTests.cs
Executable file
@@ -0,0 +1,108 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using ZB.MOM.WW.CBDDC.Network.Telemetry;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
using Xunit;
|
||||
|
||||
namespace ZB.MOM.WW.CBDDC.Network.Tests
|
||||
{
|
||||
public class TelemetryTests : IDisposable
|
||||
{
|
||||
private readonly string _tempFile;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="TelemetryTests"/> class.
|
||||
/// </summary>
|
||||
public TelemetryTests()
|
||||
{
|
||||
_tempFile = Path.GetTempFileName();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Cleans up temporary test artifacts created for telemetry persistence validation.
|
||||
/// </summary>
|
||||
public void Dispose()
|
||||
{
|
||||
if (File.Exists(_tempFile)) File.Delete(_tempFile);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that telemetry metrics are recorded and persisted to disk.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public async Task Should_Record_And_Persist_Metrics()
|
||||
{
|
||||
// Arrange
|
||||
using var service = new NetworkTelemetryService(NullLogger<NetworkTelemetryService>.Instance, _tempFile);
|
||||
|
||||
// Act
|
||||
// Record some values for CompressionRatio
|
||||
service.RecordValue(MetricType.CompressionRatio, 0.5);
|
||||
service.RecordValue(MetricType.CompressionRatio, 0.7);
|
||||
|
||||
// Record time metric
|
||||
using (var timer = service.StartMetric(MetricType.EncryptionTime))
|
||||
{
|
||||
await Task.Delay(10); // Should be > 0 ms
|
||||
}
|
||||
|
||||
// Allow channel to process
|
||||
await Task.Delay(500);
|
||||
|
||||
// Force persist to file
|
||||
service.ForcePersist();
|
||||
|
||||
// Assert
|
||||
File.Exists(_tempFile).ShouldBeTrue();
|
||||
var fileInfo = new FileInfo(_tempFile);
|
||||
fileInfo.Length.ShouldBeGreaterThan(0);
|
||||
|
||||
using var fs = File.OpenRead(_tempFile);
|
||||
using var br = new BinaryReader(fs);
|
||||
|
||||
// Header
|
||||
byte version = br.ReadByte();
|
||||
version.ShouldBe((byte)1);
|
||||
long timestamp = br.ReadInt64();
|
||||
var now = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
||||
timestamp.ShouldBeInRange(now - 5, now + 5);
|
||||
|
||||
// Metrics
|
||||
// We expect all MetricTypes
|
||||
int typeCount = Enum.GetValues(typeof(MetricType)).Length;
|
||||
|
||||
bool foundCompression = false;
|
||||
bool foundEncryption = false;
|
||||
|
||||
for (int i = 0; i < typeCount; i++)
|
||||
{
|
||||
int typeInt = br.ReadInt32();
|
||||
var type = (MetricType)typeInt;
|
||||
|
||||
// 4 Windows per type
|
||||
for (int w = 0; w < 4; w++)
|
||||
{
|
||||
int window = br.ReadInt32(); // 60, 300, 600, 1800
|
||||
double avg = br.ReadDouble();
|
||||
|
||||
if (type == MetricType.CompressionRatio && window == 60)
|
||||
{
|
||||
// Avg of 0.5 and 0.7 is 0.6
|
||||
avg.ShouldBe(0.6, 0.001);
|
||||
foundCompression = true;
|
||||
}
|
||||
|
||||
if (type == MetricType.EncryptionTime && window == 60)
|
||||
{
|
||||
avg.ShouldBeGreaterThan(0);
|
||||
foundEncryption = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foundCompression.ShouldBeTrue();
|
||||
foundEncryption.ShouldBeTrue();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user