513fa1aa16
Comment/XML-doc changes only: - add summaries to ~10k test methods, fixtures, fakes and helpers (+ <param> on theories, <returns> on async Task methods, <inheritdoc/> on interface implementations the checker can resolve) - strip ~2.6k project-tracking references (WP*, P*-*, row-NN, Task N, #NN, Component-0NN) from comments, keeping the explanatory text; reword false positives in comments only - real docs on fakes implementing BCL/library interfaces (IDisposable, ILogger, IOptionsMonitor, IAsyncLifetime) - reword the last 5 src/ false positives (CWE-1236, failures-1, year-0001, M365) Only non-comment edits: four one-line nested classes split across lines so members can carry docs. Build 0 errors / 0 warnings.
64 lines
2.6 KiB
C#
64 lines
2.6 KiB
C#
using Microsoft.Extensions.Logging;
|
|
using Microsoft.Extensions.Logging.Abstractions;
|
|
using ZB.MOM.WW.Audit;
|
|
using ZB.MOM.WW.ScadaBridge.Commons.Types.Audit;
|
|
|
|
namespace ZB.MOM.WW.ScadaBridge.InboundAPI.Tests;
|
|
|
|
/// <summary>
|
|
/// Flow Debugger step logs (design 2026-09-09 D7): the central <c>Log</c> global's per-message cap.
|
|
/// The site runtime's <c>ScriptLogger.Clip</c> already backed off a char when the
|
|
/// cap landed between the halves of a surrogate pair; this side did not, so an emoji straddling the
|
|
/// boundary left a LONE surrogate on the row (which breaks JSON serialization further down the pipe).
|
|
/// </summary>
|
|
public class InboundScriptLoggerTests
|
|
{
|
|
private static (InboundScriptLogger Logger, List<AuditEvent> Rows) MakeTraced(int maxLines = 200)
|
|
{
|
|
var rows = new List<AuditEvent>();
|
|
var logger = new InboundScriptLogger(
|
|
NullLogger.Instance, rows.Add, maxLines, "DelmiaRecipeDownload", Guid.NewGuid(), "central-a");
|
|
return (logger, rows);
|
|
}
|
|
|
|
/// <summary>Verifies that a surrogate pair straddling the cap: is dropped whole.</summary>
|
|
[Fact]
|
|
public void ASurrogatePairStraddlingTheCap_IsDroppedWhole()
|
|
{
|
|
var (logger, rows) = MakeTraced();
|
|
var straddling = new string('x', InboundScriptLogger.MaxMessageChars - 1) + "🚀" + new string('y', 10);
|
|
|
|
logger.Info(straddling);
|
|
|
|
var message = Assert.Single(rows).AsRow().RequestSummary!;
|
|
Assert.Equal(InboundScriptLogger.MaxMessageChars, message.Length);
|
|
Assert.EndsWith("…", message);
|
|
Assert.DoesNotContain(message, static c => char.IsSurrogate(c));
|
|
}
|
|
|
|
/// <summary>Verifies that an overlong message with no surrogate at the boundary: keeps the full cap.</summary>
|
|
[Fact]
|
|
public void AnOverlongMessageWithNoSurrogateAtTheBoundary_KeepsTheFullCap()
|
|
{
|
|
var (logger, rows) = MakeTraced();
|
|
|
|
logger.Info(new string('x', InboundScriptLogger.MaxMessageChars + 500));
|
|
|
|
var message = Assert.Single(rows).AsRow().RequestSummary!;
|
|
Assert.Equal(InboundScriptLogger.MaxMessageChars + 1, message.Length); // cap + the ellipsis
|
|
Assert.Equal(new string('x', InboundScriptLogger.MaxMessageChars) + "…", message);
|
|
}
|
|
|
|
/// <summary>Verifies that a message exactly at the cap: passes through unclipped.</summary>
|
|
[Fact]
|
|
public void AMessageExactlyAtTheCap_PassesThroughUnclipped()
|
|
{
|
|
var (logger, rows) = MakeTraced();
|
|
var exact = new string('x', InboundScriptLogger.MaxMessageChars);
|
|
|
|
logger.Info(exact);
|
|
|
|
Assert.Equal(exact, Assert.Single(rows).AsRow().RequestSummary);
|
|
}
|
|
}
|