Skip to content

Commit 4090c17

Browse files
stephentoubCopilot
andcommitted
fix: round 2 of CI fixes for expanded E2E coverage
- StreamingFidelityE2ETests: lock around the events list in the three remaining streaming tests. Without locking, the event handler runs on the dispatcher thread and continues to append after SendAndWaitAsync returns, racing with the test thread's enumeration and producing "Collection was modified; enumeration operation may not execute". This mirrors the lock-and-snapshot pattern already used in the Should_Emit_AssistantMessageStart_Before_Deltas_With_Matching_MessageId test in the same file. - python/pyproject.toml: add opentelemetry-sdk to dev dependencies so test_telemetry_e2e.py::test_restores_w3c_trace_context can construct a real TracerProvider. The opentelemetry-api package alone provides the namespace package "opentelemetry" but not "opentelemetry.sdk". Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent bc5cc24 commit 4090c17

2 files changed

Lines changed: 18 additions & 8 deletions

File tree

dotnet/test/E2E/StreamingFidelityE2ETests.cs

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@ public async Task Should_Produce_Delta_Events_When_Streaming_Is_Enabled()
1616
var session = await CreateSessionAsync(new SessionConfig { Streaming = true });
1717

1818
var events = new List<SessionEvent>();
19-
session.On(evt => events.Add(evt));
19+
session.On(evt => { lock (events) { events.Add(evt); } });
2020

2121
await session.SendAndWaitAsync(new MessageOptions { Prompt = "Count from 1 to 5, separated by commas." });
2222

23-
var types = events.Select(e => e.Type).ToList();
23+
List<SessionEvent> snapshot;
24+
lock (events) { snapshot = [.. events]; }
25+
26+
var types = snapshot.Select(e => e.Type).ToList();
2427

2528
// Should have streaming deltas before the final message
26-
var deltaEvents = events.OfType<AssistantMessageDeltaEvent>().ToList();
29+
var deltaEvents = snapshot.OfType<AssistantMessageDeltaEvent>().ToList();
2730
Assert.NotEmpty(deltaEvents);
2831

2932
// Deltas should have content
@@ -49,17 +52,20 @@ public async Task Should_Not_Produce_Deltas_When_Streaming_Is_Disabled()
4952
var session = await CreateSessionAsync(new SessionConfig { Streaming = false });
5053

5154
var events = new List<SessionEvent>();
52-
session.On(evt => events.Add(evt));
55+
session.On(evt => { lock (events) { events.Add(evt); } });
5356

5457
await session.SendAndWaitAsync(new MessageOptions { Prompt = "Say 'hello world'." });
5558

56-
var deltaEvents = events.OfType<AssistantMessageDeltaEvent>().ToList();
59+
List<SessionEvent> snapshot;
60+
lock (events) { snapshot = [.. events]; }
61+
62+
var deltaEvents = snapshot.OfType<AssistantMessageDeltaEvent>().ToList();
5763

5864
// No deltas when streaming is off
5965
Assert.Empty(deltaEvents);
6066

6167
// But should still have a final assistant.message
62-
var assistantEvents = events.OfType<AssistantMessageEvent>().ToList();
68+
var assistantEvents = snapshot.OfType<AssistantMessageEvent>().ToList();
6369
Assert.NotEmpty(assistantEvents);
6470

6571
await session.DisposeAsync();
@@ -78,14 +84,17 @@ public async Task Should_Produce_Deltas_After_Session_Resume()
7884
new ResumeSessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, Streaming = true });
7985

8086
var events = new List<SessionEvent>();
81-
session2.On(evt => events.Add(evt));
87+
session2.On(evt => { lock (events) { events.Add(evt); } });
8288

8389
var answer = await session2.SendAndWaitAsync(new MessageOptions { Prompt = "Now if you double that, what do you get?" });
8490
Assert.NotNull(answer);
8591
Assert.Contains("18", answer!.Data.Content ?? string.Empty);
8692

93+
List<SessionEvent> snapshot;
94+
lock (events) { snapshot = [.. events]; }
95+
8796
// Should have streaming deltas before the final message
88-
var deltaEvents = events.OfType<AssistantMessageDeltaEvent>().ToList();
97+
var deltaEvents = snapshot.OfType<AssistantMessageDeltaEvent>().ToList();
8998
Assert.NotEmpty(deltaEvents);
9099

91100
// Deltas should have content

python/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ dev = [
3939
"pytest-asyncio>=0.21.0",
4040
"pytest-timeout>=2.0.0",
4141
"httpx>=0.24.0",
42+
"opentelemetry-sdk>=1.0.0",
4243
]
4344
telemetry = [
4445
"opentelemetry-api>=1.0.0",

0 commit comments

Comments
 (0)