// Copyright 2023 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build go1.21 package quic import ( "testing" ) func TestPathChallengeReceived(t *testing.T) { for _, test := range []struct { name string padTo int wantPadding int }{{ name: "unexpanded", padTo: 0, wantPadding: 0, }, { name: "expanded", padTo: 1200, wantPadding: 1200, }} { // "The recipient of [a PATH_CHALLENGE] frame MUST generate // a PATH_RESPONSE frame [...] containing the same Data value." // https://www.rfc-editor.org/rfc/rfc9000.html#section-19.17-7 tc := newTestConn(t, clientSide) tc.handshake() tc.ignoreFrame(frameTypeAck) data := pathChallengeData{0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef} tc.writeFrames(packetType1RTT, debugFramePathChallenge{ data: data, }, debugFramePadding{ to: test.padTo, }) tc.wantFrame("response to PATH_CHALLENGE", packetType1RTT, debugFramePathResponse{ data: data, }) if got, want := tc.lastDatagram.paddedSize, test.wantPadding; got != want { t.Errorf("PATH_RESPONSE expanded to %v bytes, want %v", got, want) } tc.wantIdle("connection is idle") } } func TestPathResponseMismatchReceived(t *testing.T) { // "If the content of a PATH_RESPONSE frame does not match the content of // a PATH_CHALLENGE frame previously sent by the endpoint, // the endpoint MAY generate a connection error of type PROTOCOL_VIOLATION." // https://www.rfc-editor.org/rfc/rfc9000.html#section-19.18-4 tc := newTestConn(t, clientSide) tc.handshake() tc.ignoreFrame(frameTypeAck) tc.writeFrames(packetType1RTT, debugFramePathResponse{ data: pathChallengeData{}, }) tc.wantFrame("invalid PATH_RESPONSE causes the connection to close", packetType1RTT, debugFrameConnectionCloseTransport{ code: errProtocolViolation, }, ) }