Skip to content

Commit 2387e78

Browse files
Limit number of events stored in TestEventListener (Azure#22263)
* Limit number of events stored in TestEventListener * Throw exception when events are dropped Increase default max event count to 1000. * Dispose the event listener in AzureIdentityEventSourceTests * Add comments on TestEventListener ctor * Dispose TestEventListener in a timely manner * Use method local TestEventListener in Search
1 parent cec5073 commit 2387e78

File tree

5 files changed

+35
-18
lines changed

5 files changed

+35
-18
lines changed

sdk/core/Azure.Core.TestFramework/src/RecordedTestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ private string GetSessionFilePath()
9999
}
100100

101101
/// <summary>
102-
/// Add a static TestEventListener which will redirect SDK logging
102+
/// Add a static <see cref="Diagnostics.AzureEventSourceListener"/> which will redirect SDK logging
103103
/// to Console.Out for easy debugging.
104104
/// </summary>
105105
private static TestLogger Logger { get; set; }

sdk/core/Azure.Core.TestFramework/src/TestEventListener.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public class TestEventListener : EventListener
1414
{
1515
private volatile bool _disposed;
1616
private readonly ConcurrentQueue<EventWrittenEventArgs> _events = new ConcurrentQueue<EventWrittenEventArgs>();
17+
private uint _maxEventCount;
18+
private const uint DefaultMaxEventCount = 1000;
1719

1820
public IEnumerable<EventWrittenEventArgs> EventData => _events;
1921

@@ -27,12 +29,33 @@ protected override void OnEventWritten(EventWrittenEventArgs eventData)
2729

2830
if (!_disposed)
2931
{
32+
if (_events.Count >= _maxEventCount)
33+
{
34+
throw new Exception($"Number of events has exceeded {_maxEventCount}. Create {typeof(TestEventListener)} with a larger 'maxEventCount'.");
35+
}
36+
3037
// Make sure we can format the event
3138
EventSourceEventFormatting.Format(eventData);
3239
_events.Enqueue(eventData);
3340
}
3441
}
3542

43+
/// <summary>
44+
/// Creates an instance of <see cref="TestEventListener"/>.
45+
/// </summary>
46+
public TestEventListener() : this(DefaultMaxEventCount)
47+
{ }
48+
49+
/// <summary>
50+
/// Creates an instance of <see cref="TestEventListener"/>.
51+
/// </summary>
52+
/// <param name="maxEventCount">Maximum number of events that the listener can store in <see cref="EventData"/>.
53+
/// <para>If the number of events exceeds the value, an <see cref="Exception"/> is thrown.</para></param>
54+
public TestEventListener(uint maxEventCount)
55+
{
56+
_maxEventCount = maxEventCount;
57+
}
58+
3659
public EventWrittenEventArgs SingleEventById(int id, Func<EventWrittenEventArgs, bool> filter = null)
3760
{
3861
return EventsById(id).Single(filter ?? (_ => true));

sdk/core/Azure.Core/tests/RetryPolicyTestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ public async Task MsHeadersArePreferredOverRetryAfter(string headerName)
265265
public async Task RetryingEmitsEventSourceEvent()
266266
{
267267
var responseClassifier = new MockResponseClassifier(retriableCodes: new[] { 500 });
268-
var listener = new TestEventListener();
268+
using var listener = new TestEventListener();
269269
listener.EnableEvents(AzureCoreEventSource.Singleton, EventLevel.Informational);
270270

271271
(HttpPipelinePolicy policy, AsyncGate<TimeSpan, object> gate) = CreateRetryPolicy(maxRetries: 2);

sdk/identity/Azure.Identity/tests/AzureIdentityEventSourceTests.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ public void Setup()
3535
_listener.EnableEvents(AzureIdentityEventSource.Singleton, EventLevel.Verbose);
3636
}
3737

38+
[TearDown]
39+
public void TearDown()
40+
{
41+
_listener.Dispose();
42+
}
43+
3844
[Test]
3945
public void MatchesNameAndGuid()
4046
{

sdk/search/Azure.Search.Documents/tests/Batching/BatchingTests.cs

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,11 @@ namespace Azure.Search.Documents.Tests
2222
[NonParallelizable]
2323
public class BatchingTests : SearchTestBase
2424
{
25-
private TestEventListener _listener;
26-
2725
public BatchingTests(bool async, SearchClientOptions.ServiceVersion serviceVersion)
2826
: base(async, serviceVersion, null /* RecordedTestMode.Record /* to re-record */)
2927
{
3028
}
3129

32-
[SetUp]
33-
public void Setup()
34-
{
35-
_listener = new TestEventListener();
36-
_listener.EnableEvents(AzureSearchDocumentsEventSource.Instance, EventLevel.Verbose);
37-
}
38-
39-
[TearDown]
40-
public void TearDown()
41-
{
42-
_listener.Dispose();
43-
}
44-
4530
#region Utilities
4631
private const int BatchSize = SearchIndexingBufferedSenderOptions<object>.DefaultInitialBatchActionCount;
4732
private readonly TimeSpan EventDelay = TimeSpan.FromMilliseconds(250);
@@ -1067,10 +1052,13 @@ public async Task Behavior_Split()
10671052

10681053
client.SplitNextBatch = true;
10691054

1055+
using var listener = new TestEventListener();
1056+
listener.EnableEvents(AzureSearchDocumentsEventSource.Instance, EventLevel.Verbose);
1057+
10701058
await indexer.UploadDocumentsAsync(data);
10711059
await indexer.FlushAsync();
10721060

1073-
List<EventWrittenEventArgs> eventData = _listener.EventData.ToList();
1061+
List<EventWrittenEventArgs> eventData = listener.EventData.ToList();
10741062

10751063
Assert.AreEqual(10, eventData.Count);
10761064
Assert.AreEqual("PendingQueueResized", eventData[0].EventName); // 1. All events are pushed into the pending queue.

0 commit comments

Comments
 (0)