Skip to content

Conversation

@larseggert
Copy link
Collaborator

Add tests to eliminate missed mutants in neqo-common/src/header.rs:

  • header_comparison_with_bytes: add inequality tests for PartialEq
  • is_allowed_for_response: test allowed and disallowed header names
  • headers_ext: test contains_header and find_header with found/not-found cases

Add tests to eliminate missed mutants in `neqo-common/src/header.rs`:
- `header_comparison_with_bytes`: add inequality tests for `PartialEq`
- `is_allowed_for_response`: test allowed and disallowed header names
- `headers_ext`: test `contains_header` and `find_header` with found/not-found cases
@codecov
Copy link

codecov bot commented Dec 12, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.44%. Comparing base (ab7ae57) to head (43cd720).

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3250      +/-   ##
==========================================
- Coverage   93.50%   93.44%   -0.06%     
==========================================
  Files         125      125              
  Lines       36637    36653      +16     
  Branches    36637    36653      +16     
==========================================
- Hits        34256    34249       -7     
- Misses       1529     1554      +25     
+ Partials      852      850       -2     
Components Coverage Δ
neqo-common 97.42% <100.00%> (+0.02%) ⬆️
neqo-crypto 83.19% <ø> (-0.49%) ⬇️
neqo-http3 93.26% <ø> (ø)
neqo-qpack 94.40% <ø> (ø)
neqo-transport 94.54% <ø> (-0.08%) ⬇️
neqo-udp 79.42% <ø> (ø)
mtu 85.44% <ø> (ø)

@larseggert larseggert marked this pull request as ready for review December 12, 2025 10:59
Copilot AI review requested due to automatic review settings December 12, 2025 10:59
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR enhances test coverage for header-related functionality in neqo-common/src/header.rs by adding tests to catch missed mutants identified during mutation testing.

Key Changes:

  • Adds inequality tests for Header::PartialEq implementation to ensure both name and value comparisons work correctly
  • Adds tests for is_allowed_for_response() covering both allowed and disallowed header names
  • Adds tests for HeadersExt trait methods (contains_header and find_header) with positive and negative cases

@github-actions
Copy link
Contributor

Failed Interop Tests

QUIC Interop Runner, client vs. server, differences relative to main at ab7ae57.

neqo-pr as clientneqo-pr as server
neqo-pr vs. aioquic: A ⚠️C1
neqo-pr vs. go-x-net: A BP BA
neqo-pr vs. haproxy: A 🚀C1 BP BA
neqo-pr vs. kwik: BP BA
neqo-pr vs. linuxquic: A ⚠️L1 C1
neqo-pr vs. lsquic: L1 C1
neqo-pr vs. msquic: A L1 C1
neqo-pr vs. mvfst: A 🚀L1 C1
neqo-pr vs. neqo: ⚠️BP
neqo-pr vs. nginx: A 🚀L1 C1 BP BA
neqo-pr vs. ngtcp2: A CM
neqo-pr vs. picoquic: A 🚀L1
neqo-pr vs. quic-go: A ⚠️L1 C1
neqo-pr vs. quiche: A L1 C1 BP BA
neqo-pr vs. quinn: A 🚀L1 C1
neqo-pr vs. s2n-quic: A L1 C1 BA CM
neqo-pr vs. tquic: S A 🚀C1 ⚠️L1 BP BA
neqo-pr vs. xquic: A 🚀L1
aioquic vs. neqo-pr: CM
go-x-net vs. neqo-pr: CM
kwik vs. neqo-pr: BP BA CM
lsquic vs. neqo-pr: 🚀C1 ⚠️L1
msquic vs. neqo-pr: CM
mvfst vs. neqo-pr: Z A L1 C1 CM
openssl vs. neqo-pr: LR M A CM
quic-go vs. neqo-pr: ⚠️BA CM
quiche vs. neqo-pr: 🚀L1 ⚠️C1 CM
quinn vs. neqo-pr: L1 C1 V2 CM
s2n-quic vs. neqo-pr: 🚀B ⚠️L1 CM
tquic vs. neqo-pr: CM
xquic vs. neqo-pr: M CM
All results

Succeeded Interop Tests

QUIC Interop Runner, client vs. server

neqo-pr as client

neqo-pr as server

Unsupported Interop Tests

QUIC Interop Runner, client vs. server

neqo-pr as client

neqo-pr as server

@github-actions
Copy link
Contributor

Benchmark results

Significant performance differences relative to ab7ae57.

1-streams/each-1000-bytes/wallclock-time: 💚 Performance has improved by -2.1527%.
       time:   [579.97 µs 581.64 µs 583.57 µs]
       change: [-3.4245% -2.1527% -1.1783] (p = 0.00 < 0.05)
       Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
5 (5.00%) high severe
All results
1-conn/1-100mb-resp/mtu-1504 (aka. Download)/client: Change within noise threshold.
       time:   [206.81 ms 207.05 ms 207.29 ms]
       thrpt:  [482.42 MiB/s 482.98 MiB/s 483.53 MiB/s]
change:
       time:   [-0.6458% -0.4053% -0.1893] (p = 0.00 < 0.05)
       thrpt:  [+0.1896% +0.4069% +0.6500]
       Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
1-conn/10_000-parallel-1b-resp/mtu-1504 (aka. RPS)/client: No change in performance detected.
       time:   [282.38 ms 284.39 ms 286.46 ms]
       thrpt:  [34.909 Kelem/s 35.163 Kelem/s 35.413 Kelem/s]
change:
       time:   [-0.2341% +0.7447% +1.7566] (p = 0.15 > 0.05)
       thrpt:  [-1.7263% -0.7392% +0.2346]
       No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
1 (1.00%) low mild
4 (4.00%) high mild
1-conn/1-1b-resp/mtu-1504 (aka. HPS)/client: No change in performance detected.
       time:   [38.422 ms 38.571 ms 38.737 ms]
       thrpt:  [25.815   B/s 25.926   B/s 26.027   B/s]
change:
       time:   [-1.2166% -0.5256% +0.1341] (p = 0.13 > 0.05)
       thrpt:  [-0.1339% +0.5284% +1.2315]
       No change in performance detected.
Found 9 outliers among 100 measurements (9.00%)
2 (2.00%) low mild
2 (2.00%) high mild
5 (5.00%) high severe
1-conn/1-100mb-req/mtu-1504 (aka. Upload)/client: No change in performance detected.
       time:   [212.35 ms 212.75 ms 213.27 ms]
       thrpt:  [468.89 MiB/s 470.03 MiB/s 470.93 MiB/s]
change:
       time:   [-0.0766% +0.1597% +0.4382] (p = 0.24 > 0.05)
       thrpt:  [-0.4363% -0.1594% +0.0767]
       No change in performance detected.
Found 3 outliers among 100 measurements (3.00%)
2 (2.00%) high mild
1 (1.00%) high severe
decode 4096 bytes, mask ff: No change in performance detected.
       time:   [4.5094 µs 4.5222 µs 4.5406 µs]
       change: [-0.2629% +0.2393% +0.9001] (p = 0.46 > 0.05)
       No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
4 (4.00%) high mild
2 (2.00%) high severe
decode 1048576 bytes, mask ff: No change in performance detected.
       time:   [1.1600 ms 1.1614 ms 1.1627 ms]
       change: [-0.9776% -0.0825% +0.8286] (p = 0.87 > 0.05)
       No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
10 (10.00%) high severe
decode 4096 bytes, mask 7f: No change in performance detected.
       time:   [5.7935 µs 5.8123 µs 5.8436 µs]
       change: [-0.0684% +0.4139% +0.9933] (p = 0.17 > 0.05)
       No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
2 (2.00%) high mild
3 (3.00%) high severe
decode 1048576 bytes, mask 7f: Change within noise threshold.
       time:   [1.4761 ms 1.4785 ms 1.4809 ms]
       change: [-0.6901% -0.4679% -0.2132] (p = 0.00 < 0.05)
       Change within noise threshold.
decode 4096 bytes, mask 3f: No change in performance detected.
       time:   [5.5403 µs 5.5660 µs 5.6064 µs]
       change: [-0.2100% +0.1013% +0.4641] (p = 0.57 > 0.05)
       No change in performance detected.
Found 7 outliers among 100 measurements (7.00%)
4 (4.00%) high mild
3 (3.00%) high severe
decode 1048576 bytes, mask 3f: No change in performance detected.
       time:   [1.4152 ms 1.4174 ms 1.4196 ms]
       change: [-0.1834% +0.0296% +0.2498] (p = 0.79 > 0.05)
       No change in performance detected.
1-streams/each-1000-bytes/wallclock-time: 💚 Performance has improved by -2.1527%.
       time:   [579.97 µs 581.64 µs 583.57 µs]
       change: [-3.4245% -2.1527% -1.1783] (p = 0.00 < 0.05)
       Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
5 (5.00%) high severe
1-streams/each-1000-bytes/simulated-time: No change in performance detected.
       time:   [118.95 ms 119.15 ms 119.36 ms]
       thrpt:  [8.1816 KiB/s 8.1958 KiB/s 8.2100 KiB/s]
change:
       time:   [-0.0684% +0.1677% +0.4103] (p = 0.18 > 0.05)
       thrpt:  [-0.4087% -0.1675% +0.0684]
       No change in performance detected.
1000-streams/each-1-bytes/wallclock-time: Change within noise threshold.
       time:   [12.286 ms 12.326 ms 12.367 ms]
       change: [-1.2321% -0.6856% -0.1783] (p = 0.01 < 0.05)
       Change within noise threshold.
1000-streams/each-1-bytes/simulated-time: No change in performance detected.
       time:   [2.3293 s 2.3334 s 2.3374 s]
       thrpt:  [427.82   B/s 428.56   B/s 429.31   B/s]
change:
       time:   [-0.2184% +0.0429% +0.3013] (p = 0.74 > 0.05)
       thrpt:  [-0.3004% -0.0428% +0.2189]
       No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) low mild
1000-streams/each-1000-bytes/wallclock-time: Change within noise threshold.
       time:   [50.236 ms 50.347 ms 50.460 ms]
       change: [-0.7393% -0.4180% -0.0995] (p = 0.01 < 0.05)
       Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
1000-streams/each-1000-bytes/simulated-time: No change in performance detected.
       time:   [16.317 s 16.552 s 16.788 s]
       thrpt:  [58.170 KiB/s 59.001 KiB/s 59.851 KiB/s]
change:
       time:   [-1.4975% +0.5354% +2.5362] (p = 0.62 > 0.05)
       thrpt:  [-2.4735% -0.5326% +1.5203]
       No change in performance detected.
Found 4 outliers among 100 measurements (4.00%)
2 (2.00%) low mild
2 (2.00%) high mild
coalesce_acked_from_zero 1+1 entries: No change in performance detected.
       time:   [89.386 ns 89.712 ns 90.037 ns]
       change: [-2.5499% -0.8147% +0.2888] (p = 0.38 > 0.05)
       No change in performance detected.
Found 13 outliers among 100 measurements (13.00%)
12 (12.00%) high mild
1 (1.00%) high severe
coalesce_acked_from_zero 3+1 entries: No change in performance detected.
       time:   [105.87 ns 106.26 ns 106.67 ns]
       change: [-0.4602% +0.0295% +0.6016] (p = 0.91 > 0.05)
       No change in performance detected.
Found 18 outliers among 100 measurements (18.00%)
2 (2.00%) low mild
3 (3.00%) high mild
13 (13.00%) high severe
coalesce_acked_from_zero 10+1 entries: No change in performance detected.
       time:   [105.41 ns 105.87 ns 106.42 ns]
       change: [-0.7279% -0.0885% +0.5187] (p = 0.78 > 0.05)
       No change in performance detected.
Found 14 outliers among 100 measurements (14.00%)
3 (3.00%) low severe
3 (3.00%) low mild
8 (8.00%) high severe
coalesce_acked_from_zero 1000+1 entries: No change in performance detected.
       time:   [90.213 ns 90.344 ns 90.497 ns]
       change: [-0.7681% +1.0715% +3.8391] (p = 0.56 > 0.05)
       No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
6 (6.00%) high mild
5 (5.00%) high severe
RxStreamOrderer::inbound_frame(): Change within noise threshold.
       time:   [108.39 ms 108.47 ms 108.55 ms]
       change: [+0.0385% +0.1422% +0.2393] (p = 0.01 < 0.05)
       Change within noise threshold.
Found 12 outliers among 100 measurements (12.00%)
4 (4.00%) low mild
6 (6.00%) high mild
2 (2.00%) high severe
sent::Packets::take_ranges: No change in performance detected.
       time:   [4.4575 µs 4.5540 µs 4.6423 µs]
       change: [-5.4522% -2.5844% +0.4448] (p = 0.09 > 0.05)
       No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
transfer/pacing-false/varying-seeds/wallclock-time/run: Change within noise threshold.
       time:   [23.468 ms 23.490 ms 23.518 ms]
       change: [+0.0101% +0.1659% +0.3286] (p = 0.03 < 0.05)
       Change within noise threshold.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high severe
transfer/pacing-false/varying-seeds/simulated-time/run: No change in performance detected.
       time:   [23.941 s 23.941 s 23.941 s]
       thrpt:  [171.09 KiB/s 171.09 KiB/s 171.09 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/pacing-true/varying-seeds/wallclock-time/run: Change within noise threshold.
       time:   [24.085 ms 24.107 ms 24.131 ms]
       change: [+0.0942% +0.3237% +0.4991] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severe
transfer/pacing-true/varying-seeds/simulated-time/run: No change in performance detected.
       time:   [23.676 s 23.676 s 23.676 s]
       thrpt:  [173.01 KiB/s 173.01 KiB/s 173.01 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/pacing-false/same-seed/wallclock-time/run: Change within noise threshold.
       time:   [23.439 ms 23.468 ms 23.509 ms]
       change: [-1.8309% -1.6043% -1.3787] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
1 (1.00%) low mild
1 (1.00%) high mild
2 (2.00%) high severe
transfer/pacing-false/same-seed/simulated-time/run: No change in performance detected.
       time:   [23.941 s 23.941 s 23.941 s]
       thrpt:  [171.09 KiB/s 171.09 KiB/s 171.09 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.
transfer/pacing-true/same-seed/wallclock-time/run: Change within noise threshold.
       time:   [24.177 ms 24.205 ms 24.245 ms]
       change: [+0.1572% +0.3246% +0.5106] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 4 outliers among 100 measurements (4.00%)
1 (1.00%) low mild
2 (2.00%) high mild
1 (1.00%) high severe
transfer/pacing-true/same-seed/simulated-time/run: No change in performance detected.
       time:   [23.676 s 23.676 s 23.676 s]
       thrpt:  [173.01 KiB/s 173.01 KiB/s 173.01 KiB/s]
change:
       time:   [+0.0000% +0.0000% +0.0000] (p = NaN > 0.05)
       thrpt:  [+0.0000% +0.0000% +0.0000]
       No change in performance detected.

Download data for profiler.firefox.com or download performance comparison data.

@github-actions
Copy link
Contributor

Client/server transfer results

Performance differences relative to ab7ae57.

Transfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server (params) Mean ± σ Min Max MiB/s ± σ Δ main Δ main
google-neqo-cubic 272.6 ± 4.4 263.1 287.4 117.4 ± 7.3 💚 -1.2 -0.4%
neqo-neqo-reno 96.1 ± 4.5 88.9 108.2 333.1 ± 7.1 💚 -1.6 -1.6%
neqo-s2n-cubic 222.9 ± 4.1 211.7 231.8 143.6 ± 7.8 💔 1.8 0.8%

Table above only shows statistically significant changes. See all results below.

All results

Transfer of 33554432 bytes over loopback, min. 100 runs. All unit-less numbers are in milliseconds.

Client vs. server (params) Mean ± σ Min Max MiB/s ± σ Δ main Δ main
google-google-nopacing 446.8 ± 4.6 437.9 460.6 71.6 ± 7.0
google-neqo-cubic 272.6 ± 4.4 263.1 287.4 117.4 ± 7.3 💚 -1.2 -0.4%
msquic-msquic-nopacing 214.3 ± 88.9 144.0 639.6 149.3 ± 0.4
msquic-neqo-cubic 229.9 ± 75.0 156.4 429.8 139.2 ± 0.4 -5.2 -2.2%
neqo-google-cubic 742.9 ± 4.2 735.8 753.3 43.1 ± 7.6 -0.0 -0.0%
neqo-msquic-cubic 160.7 ± 4.4 153.4 168.0 199.1 ± 7.3 1.1 0.7%
neqo-neqo-cubic 97.9 ± 4.7 87.1 106.7 326.7 ± 6.8 -0.3 -0.3%
neqo-neqo-cubic-nopacing 95.7 ± 4.3 87.2 103.9 334.5 ± 7.4 -0.3 -0.3%
neqo-neqo-reno 96.1 ± 4.5 88.9 108.2 333.1 ± 7.1 💚 -1.6 -1.6%
neqo-neqo-reno-nopacing 95.5 ± 4.5 85.8 104.0 335.0 ± 7.1 0.4 0.4%
neqo-quiche-cubic 192.4 ± 4.4 185.6 202.9 166.3 ± 7.3 0.1 0.0%
neqo-s2n-cubic 222.9 ± 4.1 211.7 231.8 143.6 ± 7.8 💔 1.8 0.8%
quiche-neqo-cubic 153.7 ± 4.6 145.2 163.8 208.2 ± 7.0 -0.4 -0.3%
quiche-quiche-nopacing 143.1 ± 4.9 136.5 157.6 223.7 ± 6.5
s2n-neqo-cubic 174.8 ± 5.3 164.2 186.4 183.1 ± 6.0 1.3 0.7%
s2n-s2n-nopacing 247.4 ± 24.9 231.6 348.1 129.4 ± 1.3

Download data for profiler.firefox.com or download performance comparison data.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant