Skip to content

Commit b2c81a1

Browse files
committed
Add unit tests for deferred telemetry pipe attachment
Test BufferingTelemetryListener: buffer and replay, stop after replay, bounded cap, second replay returns zero. Test DeferredTelemetryAttacher: null gitBinRoot handling, retry interval exponential backoff values. Assisted-by: Claude Opus 4.6 Signed-off-by: Tyrie Vella <tyrielv@gmail.com>
1 parent d334b5a commit b2c81a1

1 file changed

Lines changed: 115 additions & 0 deletions

File tree

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
using GVFS.Common.Tracing;
2+
using GVFS.Tests.Should;
3+
using GVFS.UnitTests.Mock.Common.Tracing;
4+
using NUnit.Framework;
5+
6+
namespace GVFS.UnitTests.Common
7+
{
8+
[TestFixture]
9+
public class BufferingTelemetryListenerTests
10+
{
11+
[TestCase]
12+
public void BuffersAndReplaysMessages()
13+
{
14+
BufferingTelemetryListener buffer = new BufferingTelemetryListener();
15+
MockListener target = new MockListener(EventLevel.Verbose, Keywords.Telemetry);
16+
17+
TraceEventMessage msg1 = CreateTelemetryMessage("Event1");
18+
TraceEventMessage msg2 = CreateTelemetryMessage("Event2");
19+
buffer.RecordMessage(msg1);
20+
buffer.RecordMessage(msg2);
21+
22+
buffer.BufferedCount.ShouldEqual(2);
23+
24+
int replayed = buffer.ReplayAndStop(target);
25+
replayed.ShouldEqual(2);
26+
target.EventNamesRead.ShouldContain(name => name.Equals("Event1"));
27+
target.EventNamesRead.ShouldContain(name => name.Equals("Event2"));
28+
}
29+
30+
[TestCase]
31+
public void StopsBufferingAfterReplay()
32+
{
33+
BufferingTelemetryListener buffer = new BufferingTelemetryListener();
34+
MockListener target = new MockListener(EventLevel.Verbose, Keywords.Telemetry);
35+
36+
buffer.RecordMessage(CreateTelemetryMessage("Before"));
37+
buffer.ReplayAndStop(target);
38+
39+
buffer.IsStopped.ShouldBeTrue();
40+
buffer.RecordMessage(CreateTelemetryMessage("After"));
41+
42+
// "After" should not be buffered or replayed
43+
target.EventNamesRead.Count.ShouldEqual(1);
44+
}
45+
46+
[TestCase]
47+
public void CapsAtMaxBufferedMessages()
48+
{
49+
BufferingTelemetryListener buffer = new BufferingTelemetryListener(maxBufferedMessages: 10);
50+
MockListener target = new MockListener(EventLevel.Verbose, Keywords.Telemetry);
51+
52+
for (int i = 0; i < 15; i++)
53+
{
54+
buffer.RecordMessage(CreateTelemetryMessage($"Event{i}"));
55+
}
56+
57+
int replayed = buffer.ReplayAndStop(target);
58+
replayed.ShouldEqual(10);
59+
target.EventNamesRead[0].ShouldEqual("Event0");
60+
target.EventNamesRead[9].ShouldEqual("Event9");
61+
}
62+
63+
[TestCase]
64+
public void SecondReplayReturnsZero()
65+
{
66+
BufferingTelemetryListener buffer = new BufferingTelemetryListener();
67+
MockListener target1 = new MockListener(EventLevel.Verbose, Keywords.Telemetry);
68+
MockListener target2 = new MockListener(EventLevel.Verbose, Keywords.Telemetry);
69+
70+
buffer.RecordMessage(CreateTelemetryMessage("Event1"));
71+
72+
buffer.ReplayAndStop(target1).ShouldEqual(1);
73+
buffer.ReplayAndStop(target2).ShouldEqual(0);
74+
}
75+
76+
private static TraceEventMessage CreateTelemetryMessage(string eventName)
77+
{
78+
return new TraceEventMessage
79+
{
80+
EventName = eventName,
81+
Level = EventLevel.Informational,
82+
Keywords = Keywords.Telemetry,
83+
Opcode = EventOpcode.Info,
84+
Payload = "{}"
85+
};
86+
}
87+
}
88+
89+
[TestFixture]
90+
public class DeferredTelemetryAttacherTests
91+
{
92+
[TestCase]
93+
public void TryAttach_ReturnsFalseWithNullGitBinRoot()
94+
{
95+
using (JsonTracer tracer = new JsonTracer("Test", "NullGitBinRoot", disableTelemetry: true))
96+
using (DeferredTelemetryAttacher attacher = new DeferredTelemetryAttacher(tracer, "Test", null, null))
97+
{
98+
attacher.TryAttach(null).ShouldBeFalse();
99+
attacher.TryAttach(string.Empty).ShouldBeFalse();
100+
attacher.IsAttached.ShouldBeFalse();
101+
}
102+
}
103+
104+
[TestCase(0, 10_000)]
105+
[TestCase(1, 30_000)]
106+
[TestCase(2, 60_000)]
107+
[TestCase(3, 300_000)]
108+
[TestCase(4, 300_000)]
109+
[TestCase(100, 300_000)]
110+
public void GetRetryInterval_ReturnsExpectedValues(int retryCount, int expectedMs)
111+
{
112+
DeferredTelemetryAttacher.GetRetryInterval(retryCount).ShouldEqual(expectedMs);
113+
}
114+
}
115+
}

0 commit comments

Comments
 (0)