diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests/Sdk2LifecycleSoakTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests/Sdk2LifecycleSoakTests.cs index 65323b96..53fd05c9 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests/Sdk2LifecycleSoakTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.IntegrationTests/Sdk2LifecycleSoakTests.cs @@ -100,6 +100,8 @@ public sealed class Sdk2LifecycleSoakTests await ExerciseAsync(rig, config, ++cycles, evidence, ct); await EventuallyAsync(() => PublicCounts(rig) == (0, 0, 0), ct); var sample = await CaptureAsync(rig, config.CertificateManager, watch.Elapsed, cycles, clientRoot, serverRoot, ct); + // Retain the failing observation too; only the later quiescent row proves every gate passed. + await LogAsync(evidence, new { kind = "resource-observation", resources = sample }); sample.Sessions.ShouldBe(0); sample.Subscriptions.ShouldBe(0); sample.Items.ShouldBe(0); sample.BrowsePoints.ShouldBe(0); sample.HistoryPoints.ShouldBe(0); sample.LiveDataItems.ShouldBe(0); sample.LiveEventItems.ShouldBe(0); sample.MonitoredNodes.ShouldBe(0); @@ -421,7 +423,8 @@ public sealed class Sdk2LifecycleSoakTests int BrowsePoints, int HistoryPoints, int LiveDataItems, int LiveEventItems, int MonitoredNodes, int Variables, int Folders, int Conditions, int CachedCertificateStores, int Descriptors, int PkiDescriptors, long ManagedBytes, long RssBytes, long AllocatedBytes, - int Gen0, int Gen1, int Gen2); + int Gen0, int Gen1, int Gen2, long GcCommittedBytes, long GcHeapBytes, long GcFragmentedBytes, + long PinnedObjects, long PendingFinalizers, long JitMethods, long JitIlBytes, long ActiveTimers, int Threads); private static async Task CaptureAsync(ServerEventRig rig, object clientManager, TimeSpan elapsed, int cycle, string clientRoot, string serverRoot, CancellationToken ct) @@ -430,6 +433,7 @@ public sealed class Sdk2LifecycleSoakTests var points = rig.Server.CurrentInstance.SessionManager.GetSessions().Select(ContinuationCounts).ToArray(); var descriptors = await DescriptorCountsAsync(ct, clientRoot, serverRoot); var retained = GC.GetTotalMemory(forceFullCollection: true); + var memory = GC.GetGCMemoryInfo(); using var process = Process.GetCurrentProcess(); process.Refresh(); return new Sample(cycle, elapsed.TotalSeconds, counts.Sessions, counts.Subscriptions, counts.Items, @@ -437,7 +441,10 @@ public sealed class Sdk2LifecycleSoakTests rig.Nm.MonitoredNodeCount, rig.Nm.VariableCount, rig.Nm.FolderCount, rig.Nm.AlarmConditionCount, CertificateCores(rig.Server.CertificateManager!).Sum(CachedStores) + CertificateCores(clientManager).Sum(CachedStores), descriptors.Total, descriptors.Pki, retained, process.WorkingSet64, GC.GetTotalAllocatedBytes(), - GC.CollectionCount(0), GC.CollectionCount(1), GC.CollectionCount(2)); + GC.CollectionCount(0), GC.CollectionCount(1), GC.CollectionCount(2), memory.TotalCommittedBytes, + memory.HeapSizeBytes, memory.FragmentedBytes, memory.PinnedObjectsCount, memory.FinalizationPendingCount, + System.Runtime.JitInfo.GetCompiledMethodCount(), System.Runtime.JitInfo.GetCompiledILBytes(), Timer.ActiveCount, + process.Threads.Count); } public static bool DescriptorProbeSupported => OperatingSystem.IsLinux() || OperatingSystem.IsMacOS();