fix(chromium): drop settled requests from the per-conversion network map

This commit is contained in:
Julien Neuhart
2026-09-07 17:54:25 +02:00
parent 35ddf81812
commit ade6a327a4
2 changed files with 103 additions and 1 deletions

View File

@@ -98,3 +98,86 @@ func TestNetworkAggregate_ConcurrentSafe(t *testing.T) {
t.Errorf("requestCount = %d, want 100", got)
}
}
// TestNetworkAggregate_SettledRequestsAreDropped covers the growth where every
// response URL stayed in the map for the whole conversion even though nothing
// reads it again once the request settles.
func TestNetworkAggregate_SettledRequestsAreDropped(t *testing.T) {
a := newNetworkAggregate()
for i := range 500 {
id := network.RequestID(fmt.Sprintf("r%d", i))
a.onResponseReceived(&network.EventResponseReceived{
RequestID: id,
Response: &network.Response{URL: fmt.Sprintf("https://host.example.com/%d", i)},
})
if i%2 == 0 {
a.onLoadingFinished(&network.EventLoadingFinished{RequestID: id, EncodedDataLength: 10})
continue
}
a.onLoadingFailed(&network.EventLoadingFailed{RequestID: id})
}
a.mu.Lock()
tracked := len(a.requestURLByID)
a.mu.Unlock()
if tracked != 0 {
t.Errorf("tracked requests = %d, want 0: settled requests must not be retained", tracked)
}
// The bookkeeping the map feeds must survive the pruning.
got := a.snapshot()
if got.requestCount != 500 {
t.Errorf("requestCount = %d, want 500", got.requestCount)
}
if got.failedCount != 250 {
t.Errorf("failedCount = %d, want 250", got.failedCount)
}
}
// TestNetworkAggregate_UnsettledRequestCap verifies the ceiling that applies
// when requests never settle, which is the only way the map can still grow.
func TestNetworkAggregate_UnsettledRequestCap(t *testing.T) {
a := newNetworkAggregate()
for i := range maxTrackedRequests + 500 {
a.onResponseReceived(&network.EventResponseReceived{
RequestID: network.RequestID(fmt.Sprintf("r%d", i)),
Response: &network.Response{URL: fmt.Sprintf("https://host.example.com/%d", i)},
})
}
a.mu.Lock()
tracked := len(a.requestURLByID)
a.mu.Unlock()
if tracked != maxTrackedRequests {
t.Errorf("tracked requests = %d, want %d (capped)", tracked, maxTrackedRequests)
}
}
// TestNetworkAggregate_HeaviestURLSurvivesPruning guards the attribution the
// map exists for: the URL must still be resolved before the entry is dropped.
func TestNetworkAggregate_HeaviestURLSurvivesPruning(t *testing.T) {
a := newNetworkAggregate()
a.onResponseReceived(&network.EventResponseReceived{
RequestID: "small",
Response: &network.Response{URL: "https://example.com/small.css"},
})
a.onLoadingFinished(&network.EventLoadingFinished{RequestID: "small", EncodedDataLength: 10})
a.onResponseReceived(&network.EventResponseReceived{
RequestID: "big",
Response: &network.Response{URL: "https://example.com/big.png"},
})
a.onLoadingFinished(&network.EventLoadingFinished{RequestID: "big", EncodedDataLength: 4096})
got := a.snapshot()
if got.heaviestURL != "https://example.com/big.png" || got.heaviestBytes != 4096 {
t.Errorf("heaviest = (%q, %d), want (%q, 4096)", got.heaviestURL, got.heaviestBytes, "https://example.com/big.png")
}
}