Files
quic-go/qlog/packet_header_test.go
2025-11-14 04:04:40 +03:00

135 lines
3.3 KiB
Go

package qlog
import (
"bytes"
"encoding/json"
"testing"
"git.geeks-team.ru/gr1ffon/quic-go/internal/protocol"
"git.geeks-team.ru/gr1ffon/quic-go/qlogwriter/jsontext"
"github.com/stretchr/testify/require"
)
func checkHeader(t *testing.T, hdr *PacketHeader, expected map[string]any) {
t.Helper()
var buf bytes.Buffer
enc := jsontext.NewEncoder(&buf)
require.NoError(t, hdr.encode(enc))
data := buf.Bytes()
require.True(t, json.Valid(data))
checkEncoding(t, data, expected)
}
func TestHeaderInitial(t *testing.T) {
checkHeader(t,
&PacketHeader{
PacketType: PacketTypeInitial,
PacketNumber: 42,
Version: protocol.Version(0xdecafbad),
},
map[string]any{
"packet_type": "initial",
"packet_number": 42,
"dcil": 0,
"scil": 0,
"version": "decafbad",
},
)
}
func TestHeaderInitialWithToken(t *testing.T) {
checkHeader(t,
&PacketHeader{
PacketType: PacketTypeInitial,
PacketNumber: 1337,
SrcConnectionID: protocol.ParseConnectionID([]byte{0x11, 0x22, 0x33, 0x44}),
DestConnectionID: protocol.ParseConnectionID([]byte{0x55, 0x66, 0x77, 0x88}),
Version: protocol.Version(0xdecafbad),
Token: &Token{Raw: []byte{0xde, 0xad, 0xbe, 0xef}},
},
map[string]any{
"packet_type": "initial",
"packet_number": 1337,
"dcil": 4,
"dcid": "55667788",
"scil": 4,
"scid": "11223344",
"version": "decafbad",
"token": map[string]any{"data": "deadbeef"},
},
)
}
func TestHeaderLongPacketNumbers(t *testing.T) {
t.Run("packet 0", func(t *testing.T) {
testHeaderPacketNumbers(t, 0)
})
// This is used for events where the packet number is not yet known,
// e.g. the packet_buffered event.
t.Run("no packet number", func(t *testing.T) {
testHeaderPacketNumbers(t, 1)
})
}
func testHeaderPacketNumbers(t *testing.T, pn protocol.PacketNumber) {
expected := map[string]any{
"packet_type": "handshake",
"dcil": 0,
"scil": 0,
"version": "1",
}
if pn != protocol.InvalidPacketNumber {
expected["packet_number"] = int(pn)
}
checkHeader(t,
&PacketHeader{
PacketType: PacketTypeHandshake,
PacketNumber: pn,
Version: protocol.Version1,
},
expected,
)
}
func TestHeaderRetry(t *testing.T) {
checkHeader(t,
&PacketHeader{
PacketType: PacketTypeRetry,
SrcConnectionID: protocol.ParseConnectionID([]byte{0x11, 0x22, 0x33, 0x44}),
DestConnectionID: protocol.ParseConnectionID([]byte{0x55, 0x66, 0x77, 0x88, 0x99}),
Version: protocol.Version(0xdecafbad),
Token: &Token{Raw: []byte{0xde, 0xad, 0xbe, 0xef}},
},
map[string]any{
"packet_type": "retry",
"dcil": 5,
"dcid": "5566778899",
"scil": 4,
"scid": "11223344",
"token": map[string]any{"data": "deadbeef"},
"version": "decafbad",
},
)
}
func TestHeader1RTT(t *testing.T) {
checkHeader(t,
&PacketHeader{
PacketType: PacketType1RTT,
PacketNumber: 42,
DestConnectionID: protocol.ParseConnectionID([]byte{0x55, 0x66, 0x77, 0x88}),
KeyPhaseBit: KeyPhaseZero,
},
map[string]any{
"packet_type": "1RTT",
"packet_number": 42,
"dcil": 4,
"dcid": "55667788",
"key_phase_bit": "0",
},
)
}