in src/Elastic.Transport.VirtualizedCluster/Audit/Auditor.cs [232:266]
private static void AssertTrailOnResponse(ClientCall callTrace, IEnumerable<Diagnostics.Auditing.Audit> auditTrail, bool sync, int nthCall)
{
var typeOfTrail = (sync ? "synchronous" : "asynchronous") + " audit trail";
var nthClientCall = (nthCall + 1).ToOrdinal();
var actualAuditTrail = auditTrail.Aggregate(new StringBuilder(Environment.NewLine),
(sb, a) => sb.AppendLine($"-> {a}"),
sb => sb.ToString());
var traceEvents = callTrace.Select(c => c.Event).ToList();
var auditEvents = auditTrail.Select(a => a.Event).ToList();
if (!traceEvents.SequenceEqual(auditEvents))
throw new Exception($"the {nthClientCall} client call's {typeOfTrail} should assert ALL audit trail items{actualAuditTrail}");
foreach (var t in auditTrail.Select((a, i) => new { a, i }))
{
var i = t.i;
var audit = t.a;
var nthAuditTrailItem = (i + 1).ToOrdinal();
var because = $"thats the {{0}} specified on the {nthAuditTrailItem} item in the {nthClientCall} client call's {typeOfTrail}";
var c = callTrace[i];
if (audit.Event != c.Event)
throw new Exception(string.Format(because, "event"));
if (c.Port.HasValue && audit.Node.Uri.Port != c.Port.Value)
throw new Exception(string.Format(because, "port"));
c.SimpleAssert?.Invoke(audit);
c.AssertWithBecause?.Invoke(string.Format(because, "custom assertion"), audit);
}
if (auditTrail is ICollection<Diagnostics.Auditing.Audit> at && callTrace.Count != at.Count)
throw new Exception($"callTrace has {callTrace.Count} items. Actual auditTrail {actualAuditTrail}");
else if (callTrace.Count != auditTrail.Count())
throw new Exception($"callTrace has {callTrace.Count} items. Actual auditTrail {actualAuditTrail}");
}