Skip to content

Conversation

@larseggert
Copy link
Collaborator

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

  • datagram_len_and_accessors: test len, is_empty, as_ref, as_mut, set_tos
  • batch_data_and_try_from: test data() and successful TryFrom conversion
  • batch_try_from_multiple_fails: test TryFrom failure for multi-datagram batch

Add tests to eliminate missed mutants in `neqo-common/src/datagram.rs`:
- `datagram_len_and_accessors`: test `len`, `is_empty`, `as_ref`, `as_mut`, `set_tos`
- `batch_data_and_try_from`: test `data()` and successful `TryFrom` conversion
- `batch_try_from_multiple_fails`: test `TryFrom` failure for multi-datagram batch
@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 (d90edeb).

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3249      +/-   ##
==========================================
- Coverage   93.50%   93.44%   -0.06%     
==========================================
  Files         125      125              
  Lines       36637    36661      +24     
  Branches    36637    36661      +24     
==========================================
+ Hits        34256    34258       +2     
- Misses       1529     1552      +23     
+ Partials      852      851       -1     
Components Coverage Δ
neqo-common 97.64% <100.00%> (+0.24%) ⬆️
neqo-crypto 83.19% <ø> (-0.49%) ⬇️
neqo-http3 93.26% <ø> (ø)
neqo-qpack 94.40% <ø> (ø)
neqo-transport 94.53% <ø> (-0.09%) ⬇️
neqo-udp 79.42% <ø> (ø)
mtu 85.26% <ø> (-0.19%) ⬇️

@larseggert larseggert marked this pull request as ready for review December 12, 2025 10:34
Copilot AI review requested due to automatic review settings December 12, 2025 10:34
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 adds comprehensive test coverage for the Datagram and DatagramBatch types in neqo-common/src/datagram.rs to eliminate missed mutants in mutation testing. The tests focus on verifying previously untested methods and edge cases.

Key changes:

  • Added datagram_len_and_accessors test to cover len(), is_empty(), as_ref(), as_mut(), and set_tos() methods
  • Added batch_data_and_try_from test to verify data() method and successful TryFrom<DatagramBatch> conversion
  • Added batch_try_from_multiple_fails test to verify TryFrom fails appropriately for multi-datagram batches

@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
neqo-pr vs. go-x-net: A BP BA
neqo-pr vs. haproxy: A BP BA
neqo-pr vs. kwik: BP BA
neqo-pr vs. linuxquic: A 🚀C1 ⚠️L1
neqo-pr vs. lsquic: L1 C1
neqo-pr vs. msquic: A L1 C1
neqo-pr vs. mvfst: A L1 C1 ⚠️BA
neqo-pr vs. neqo: ⚠️BA
neqo-pr vs. nginx: A 🚀C1 BP BA
neqo-pr vs. ngtcp2: A ⚠️L1 BP 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 C1 BP BA CM
neqo-pr vs. tquic: S A ⚠️C1 BP BA
neqo-pr vs. xquic: A L1 C1
aioquic vs. neqo-pr: CM
go-x-net vs. neqo-pr: CM
kwik vs. neqo-pr: BP BA CM
linuxquic vs. neqo-pr: ⚠️BA
msquic vs. neqo-pr: 🚀BP ⚠️C1 CM
mvfst vs. neqo-pr: Z A L1 C1 CM
openssl vs. neqo-pr: LR M A CM
quic-go vs. neqo-pr: CM
quiche vs. neqo-pr: CM
quinn vs. neqo-pr: ⚠️L1 V2 CM
s2n-quic vs. neqo-pr: 🚀B ⚠️BA 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

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
neqo-neqo-cubic 96.5 ± 4.5 88.9 106.9 331.7 ± 7.1 💔 1.3 1.4%
neqo-neqo-reno-nopacing 96.4 ± 4.5 86.3 106.4 331.9 ± 7.1 💔 1.9 2.0%
s2n-neqo-cubic 173.7 ± 4.3 164.4 182.7 184.2 ± 7.4 💚 -2.0 -1.1%

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 460.2 ± 3.4 455.0 473.2 69.5 ± 9.4
google-neqo-cubic 272.4 ± 4.5 263.3 286.1 117.5 ± 7.1 -0.8 -0.3%
msquic-msquic-nopacing 205.5 ± 78.7 136.2 490.9 155.7 ± 0.4
msquic-neqo-cubic 212.8 ± 54.4 157.5 383.8 150.4 ± 0.6 -5.6 -2.5%
neqo-google-cubic 762.4 ± 3.5 756.0 777.2 42.0 ± 9.1 -0.3 -0.0%
neqo-msquic-cubic 159.8 ± 4.2 151.6 169.1 200.2 ± 7.6 -1.2 -0.7%
neqo-neqo-cubic 96.5 ± 4.5 88.9 106.9 331.7 ± 7.1 💔 1.3 1.4%
neqo-neqo-cubic-nopacing 95.3 ± 4.3 87.8 109.4 335.7 ± 7.4 -0.3 -0.3%
neqo-neqo-reno 97.0 ± 4.2 89.3 105.8 329.9 ± 7.6 -0.1 -0.1%
neqo-neqo-reno-nopacing 96.4 ± 4.5 86.3 106.4 331.9 ± 7.1 💔 1.9 2.0%
neqo-quiche-cubic 191.3 ± 4.0 185.7 202.3 167.3 ± 8.0 -0.5 -0.2%
neqo-s2n-cubic 222.3 ± 4.8 213.7 232.0 143.9 ± 6.7 0.8 0.3%
quiche-neqo-cubic 156.5 ± 5.1 145.6 171.3 204.5 ± 6.3 0.1 0.1%
quiche-quiche-nopacing 144.3 ± 4.4 136.5 156.2 221.8 ± 7.3
s2n-neqo-cubic 173.7 ± 4.3 164.4 182.7 184.2 ± 7.4 💚 -2.0 -1.1%
s2n-s2n-nopacing 250.7 ± 27.4 233.2 347.2 127.7 ± 1.2

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

@github-actions
Copy link
Contributor

Benchmark results

Significant performance differences relative to ab7ae57.

1-conn/1-100mb-req/mtu-1504 (aka. Upload)/client: 💚 Performance has improved by -2.2017%.
       time:   [210.52 ms 210.85 ms 211.21 ms]
       thrpt:  [473.47 MiB/s 474.27 MiB/s 475.02 MiB/s]
change:
       time:   [-2.4188% -2.2017% -1.9875] (p = 0.00 < 0.05)
       thrpt:  [+2.0278% +2.2513% +2.4788]
       Performance has improved.
Found 3 outliers among 100 measurements (3.00%)
2 (2.00%) high mild
1 (1.00%) high severe
All results
1-conn/1-100mb-resp/mtu-1504 (aka. Download)/client: Change within noise threshold.
       time:   [206.03 ms 206.41 ms 206.78 ms]
       thrpt:  [483.60 MiB/s 484.48 MiB/s 485.36 MiB/s]
change:
       time:   [-1.3859% -1.0507% -0.7570] (p = 0.00 < 0.05)
       thrpt:  [+0.7627% +1.0618% +1.4054]
       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:   [283.88 ms 285.65 ms 287.45 ms]
       thrpt:  [34.789 Kelem/s 35.008 Kelem/s 35.226 Kelem/s]
change:
       time:   [-0.7725% +0.2151% +1.1689] (p = 0.66 > 0.05)
       thrpt:  [-1.1554% -0.2146% +0.7785]
       No change in performance detected.
Found 2 outliers among 100 measurements (2.00%)
2 (2.00%) high mild
1-conn/1-1b-resp/mtu-1504 (aka. HPS)/client: No change in performance detected.
       time:   [38.686 ms 38.844 ms 39.022 ms]
       thrpt:  [25.626   B/s 25.744   B/s 25.849   B/s]
change:
       time:   [-0.5779% +0.0461% +0.6431] (p = 0.89 > 0.05)
       thrpt:  [-0.6390% -0.0461% +0.5813]
       No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
2 (2.00%) high mild
6 (6.00%) high severe
1-conn/1-100mb-req/mtu-1504 (aka. Upload)/client: 💚 Performance has improved by -2.2017%.
       time:   [210.52 ms 210.85 ms 211.21 ms]
       thrpt:  [473.47 MiB/s 474.27 MiB/s 475.02 MiB/s]
change:
       time:   [-2.4188% -2.2017% -1.9875] (p = 0.00 < 0.05)
       thrpt:  [+2.0278% +2.2513% +2.4788]
       Performance has improved.
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.5102 µs 4.5185 µs 4.5279 µs]
       change: [-0.5126% -0.1432% +0.2388] (p = 0.46 > 0.05)
       No change in performance detected.
Found 8 outliers among 100 measurements (8.00%)
4 (4.00%) high mild
4 (4.00%) high severe
decode 1048576 bytes, mask ff: No change in performance detected.
       time:   [1.1596 ms 1.1622 ms 1.1657 ms]
       change: [-0.9515% -0.1055% +0.7437] (p = 0.82 > 0.05)
       No change in performance detected.
Found 11 outliers among 100 measurements (11.00%)
11 (11.00%) high severe
decode 4096 bytes, mask 7f: No change in performance detected.
       time:   [5.7891 µs 5.7977 µs 5.8064 µs]
       change: [-0.4167% -0.0852% +0.2208] (p = 0.62 > 0.05)
       No change in performance detected.
Found 4 outliers among 100 measurements (4.00%)
2 (2.00%) high mild
2 (2.00%) high severe
decode 1048576 bytes, mask 7f: Change within noise threshold.
       time:   [1.4770 ms 1.4794 ms 1.4818 ms]
       change: [-1.2305% -0.5859% -0.1376] (p = 0.02 < 0.05)
       Change within noise threshold.
decode 4096 bytes, mask 3f: No change in performance detected.
       time:   [5.5433 µs 5.5513 µs 5.5591 µs]
       change: [-0.3119% +0.0462% +0.4080] (p = 0.82 > 0.05)
       No change in performance detected.
Found 3 outliers among 100 measurements (3.00%)
1 (1.00%) high mild
2 (2.00%) high severe
decode 1048576 bytes, mask 3f: No change in performance detected.
       time:   [1.4156 ms 1.4179 ms 1.4204 ms]
       change: [-0.2925% -0.0445% +0.2146] (p = 0.73 > 0.05)
       No change in performance detected.
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
1-streams/each-1000-bytes/wallclock-time: Change within noise threshold.
       time:   [585.60 µs 588.08 µs 590.84 µs]
       change: [+0.4959% +0.9525% +1.4683] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 11 outliers among 100 measurements (11.00%)
11 (11.00%) high severe
1-streams/each-1000-bytes/simulated-time: No change in performance detected.
       time:   [118.92 ms 119.12 ms 119.33 ms]
       thrpt:  [8.1838 KiB/s 8.1979 KiB/s 8.2118 KiB/s]
change:
       time:   [-0.2259% +0.0605% +0.3442] (p = 0.67 > 0.05)
       thrpt:  [-0.3430% -0.0604% +0.2264]
       No change in performance detected.
1000-streams/each-1-bytes/wallclock-time: No change in performance detected.
       time:   [12.334 ms 12.381 ms 12.436 ms]
       change: [-0.1763% +0.4475% +1.0302] (p = 0.15 > 0.05)
       No change in performance detected.
Found 3 outliers among 100 measurements (3.00%)
2 (2.00%) high mild
1 (1.00%) high severe
1000-streams/each-1-bytes/simulated-time: No change in performance detected.
       time:   [2.3273 s 2.3311 s 2.3350 s]
       thrpt:  [428.27   B/s 428.98   B/s 429.68   B/s]
change:
       time:   [-0.2464% -0.0177% +0.1943] (p = 0.88 > 0.05)
       thrpt:  [-0.1939% +0.0177% +0.2470]
       No change in performance detected.
1000-streams/each-1000-bytes/wallclock-time: No change in performance detected.
       time:   [50.384 ms 50.600 ms 50.923 ms]
       change: [-0.8549% -0.2589% +0.5574] (p = 0.47 > 0.05)
       No change in performance detected.
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severe
1000-streams/each-1000-bytes/simulated-time: No change in performance detected.
       time:   [16.089 s 16.346 s 16.605 s]
       thrpt:  [58.810 KiB/s 59.742 KiB/s 60.698 KiB/s]
change:
       time:   [-1.7851% +0.4913% +2.7248] (p = 0.67 > 0.05)
       thrpt:  [-2.6526% -0.4889% +1.8175]
       No change in performance detected.
coalesce_acked_from_zero 1+1 entries: No change in performance detected.
       time:   [89.203 ns 89.511 ns 89.823 ns]
       change: [-0.5293% -0.0087% +0.5311] (p = 0.98 > 0.05)
       No change in performance detected.
Found 10 outliers among 100 measurements (10.00%)
7 (7.00%) high mild
3 (3.00%) high severe
coalesce_acked_from_zero 3+1 entries: No change in performance detected.
       time:   [105.92 ns 106.31 ns 106.72 ns]
       change: [-0.0610% +0.5193% +1.2503] (p = 0.11 > 0.05)
       No change in performance detected.
Found 14 outliers among 100 measurements (14.00%)
3 (3.00%) high mild
11 (11.00%) high severe
coalesce_acked_from_zero 10+1 entries: No change in performance detected.
       time:   [105.30 ns 105.72 ns 106.21 ns]
       change: [-0.4880% -0.0364% +0.4345] (p = 0.88 > 0.05)
       No change in performance detected.
Found 18 outliers among 100 measurements (18.00%)
4 (4.00%) low severe
2 (2.00%) low mild
3 (3.00%) high mild
9 (9.00%) high severe
coalesce_acked_from_zero 1000+1 entries: No change in performance detected.
       time:   [90.128 ns 90.233 ns 90.353 ns]
       change: [-0.7703% -0.2198% +0.3335] (p = 0.47 > 0.05)
       No change in performance detected.
Found 21 outliers among 100 measurements (21.00%)
11 (11.00%) high mild
10 (10.00%) high severe
RxStreamOrderer::inbound_frame(): Change within noise threshold.
       time:   [109.00 ms 109.12 ms 109.26 ms]
       change: [+0.5682% +0.6914% +0.8339] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 38 outliers among 100 measurements (38.00%)
18 (18.00%) low severe
3 (3.00%) low mild
5 (5.00%) high mild
12 (12.00%) high severe
sent::Packets::take_ranges: No change in performance detected.
       time:   [4.4756 µs 4.6169 µs 4.7681 µs]
       change: [-0.7087% +2.4476% +6.1743] (p = 0.18 > 0.05)
       No change in performance detected.
Found 6 outliers among 100 measurements (6.00%)
6 (6.00%) high mild
transfer/pacing-false/varying-seeds/wallclock-time/run: Change within noise threshold.
       time:   [23.920 ms 23.953 ms 23.999 ms]
       change: [+0.4934% +0.7272% +0.9668] (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-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.315 ms 24.332 ms 24.349 ms]
       change: [+0.5651% +0.7872% +0.9505] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) low mild
1 (1.00%) high mild
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.976 ms 23.993 ms 24.011 ms]
       change: [+1.5808% +1.6905% +1.7989] (p = 0.00 < 0.05)
       Change within noise threshold.
Found 5 outliers among 100 measurements (5.00%)
5 (5.00%) high mild
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.193 ms 24.216 ms 24.244 ms]
       change: [+1.1905% +1.3083% +1.4336] (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.

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