test(http2): add 7 error-branch dispatcher TEST_F (Round 2 / Issue #1106)#1117
Merged
kcenon merged 1 commit intoMay 9, 2026
Conversation
Extends Round 6 (#1115) direct-dispatch coverage with seven new TEST_F cases targeting the error/edge branches that the friend-inject pivot left untouched. Issue #1106 acceptance criteria are satisfied at the dispatcher level — the SETTINGS-handshake under coverage instrumentation still exceeds 15s on shared CI runners, so going around the handshake is the only path that produces a measurable coverage delta. New TEST_F cases (all bypass connect() via http2_client_test_access): - ServerSettingsAckFrameDrivesAckEarlyReturn is_ack() early-return arm of handle_settings_frame. - ServerSettingsFrameAppliesAllRemoteIdentifiersAndSendsAck Drives every setting_identifier switch arm in a single dispatch (header_table_size, enable_push, max_concurrent_streams, initial_window_size, max_frame_size, max_header_list_size). - HeadersFrameOnUnknownStreamIdReturnsNotFound not_found branch of handle_headers_frame. - DataFrameOnUnknownStreamIdReturnsNotFound not_found branch of handle_data_frame; also models the partial-response disconnect acceptance-criteria item. - ServerWindowUpdateOnConnectionLevelExpandsWindowUnderBackPressure WINDOW_UPDATE under back-pressure acceptance-criteria item with a 1 MiB increment on the connection-level window. - GoawayFrameWithLastStreamIdZeroLeavesNoStreamsToClose GOAWAY with PROTOCOL_ERROR error code (Round 6 only used NO_ERROR). - ServerRstStreamWithCancelErrorCodeOnUnknownStreamIsIgnored RST_STREAM with REFUSED_STREAM error code (Round 6 only used CANCEL). No src/ changes; test-only PR per issue scope. Closes #1106
Contributor
Coverage Report
Coverage DetailsFull HTML report is available as a build artifact. |
This was referenced May 9, 2026
Closed
kcenon
added a commit
that referenced
this pull request
May 9, 2026
…1131) * test(http2): add known-stream dispatcher branch tests (Round 3) Issue #1119 (Round 3 of #953): expand http2_client.cpp coverage to >=70% line / >=50% branch. Round 6 (#1115 / PR f3c289f) and Round 2 (#1117 / PR 7af3bc5) raised http2_client.cpp coverage by direct-dispatching server-originated frames through http2_client_test_access::process_frame. Both rounds targeted handlers whose entry arms are reachable without an entry in streams_; anything that runs after the stream lookup succeeds remained unmeasured. This commit extends the friend access class with stream-seeding helpers (seed_stream, set_stream_callbacks, stream_state_of, stream_window_size_of, append_response_header, response_body_of, build_headers, allocate_stream_id, next_stream_id) and adds 38 TEST cases driving the known-stream success-path branches: - handle_rst_stream_frame: close-and-fulfill arm with both CANCEL and REFUSED_STREAM error codes - handle_goaway_frame: populated streams_ loop body covering streams above last_stream_id (closed and promise.set_value), at-or-below (kept open), and already-closed (skipped) - handle_window_update_frame: known-stream non-zero stream_id branch including INT32_MAX boundary - handle_data_frame: non-streaming buffer-append, end_stream success with status-code extraction (200), malformed-status std::stoi catch arm, streaming on_data fan-out, streaming end_stream on_complete, per-stream WINDOW_UPDATE branch, connection-level WINDOW_UPDATE branch, max-uint31 stream id, and 16384-byte payload round-trip - handle_headers_frame: accumulate (end_headers without end_stream), end_stream success with HPACK static-index decode for status 200 and 404, malformed-status catch arm, streaming on_headers, streaming end_stream on_complete with status 500 - process_frame: dynamic_cast-fails / break / fall-through arm for all seven dispatched frame types, plus default arm for priority, push_promise, and continuation - Private helpers: build_headers empty-path-to-/ substitution, pseudo-header sequencing, additional-header pseudo-header skip; allocate_stream_id RFC 7540 5.1.1 odd-id contract Production header compiles byte-identical when BUILD_TESTS=OFF; all friend declarations remain inside the existing NETWORK_ENABLE_TEST_INJECTION gate. No new friend declarations needed because the new accessors are member functions of the existing http2_client_test_access class. Local verification: 38/38 PASSED in 1 ms wall-time on Apple Clang Debug build; existing network_http2_client_branch_test non-network suites (34 tests across 8 suites) continue to pass. Part of #953 coverage expansion. * docs(changelog): document Round 3 dispatcher coverage tests Adds CHANGELOG entries for Issue #1119 (Round 3 of #953): known-stream dispatcher branch tests for src/protocols/http2/http2_client.cpp. Updates both the root CHANGELOG.md (compatibility) and the canonical docs/CHANGELOG.md (SSOT).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #1106
Summary
Extends Round 6 (#1115 / PR f3c289f) direct-dispatch coverage with seven new
TEST_Fcases targeting error/edge branches inhttp2_client.cppthat the friend-inject pivot left untouched.The
SETTINGShandshake undergcovinstrumentation still exceeds the 15s wait budget on shared CI runners, so the only viable strategy for raisinghttp2_client.cppcoverage is to bypassconnect()viahttp2_client_test_access::process_frame(the friend gate proven in Round 6).Acceptance criteria mapping (#1106)
DropFirstServerSettingsLeavesClientUnconnectedMalformedServerSettingsTypeByteTriggersConnectTimeoutTruncatedServerSettingsHeaderTimesOutConnectSlowWriteServerSettingsStillCompletesHandshake(gated outside coverage build)DataFrameOnUnknownStreamIdReturnsNotFoundmodels this at dispatcher levelServerWindowUpdateOnConnectionLevelExpandsWindowUnderBackPressureNew TEST_F cases
handle_settings_frame'sis_ack()early-returnsetting_identifierswitch arms in one dispatchhandle_headers_framenot_found branchhandle_data_framenot_found branchWINDOW_UPDATEwith 1 MiB incrementGOAWAYwithPROTOCOL_ERROR(Round 6 only used NO_ERROR)RST_STREAMwithREFUSED_STREAM(Round 6 only used CANCEL)Test plan
cmake --build build --target network_http2_client_branch_test -j 4 ./build/bin/network_http2_client_branch_test # Expect: all TEST_F PASSOut of scope
src/changes; test-only PR per issue scope.Notes
Local toolchain (cmake/g++) was unavailable in the work environment, so build verification is delegated to CI.