109 lines
3.5 KiB
C#
Executable File
109 lines
3.5 KiB
C#
Executable File
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();
|
|
}
|
|
}
|
|
}
|