Files
quic-go/testutils/events/event_recorder_test.go
Marten Seemann c2131eb595 qlog: split serializiation and event definitions, remove logging abstraction (#5356)
* qlog: implement a Trace and a Writer struct

* qlog: rename Trace to FileSeq

* split qlog trace writer and QUIC qlog events into separate packages

* use the new qlog.Recorder instead of the logging.ConnectionTracer
2025-10-08 05:53:02 +02:00

102 lines
2.7 KiB
Go

package events
import (
"testing"
"time"
"github.com/quic-go/quic-go/internal/synctest"
"github.com/quic-go/quic-go/qlog"
"github.com/quic-go/quic-go/qlogwriter"
"github.com/stretchr/testify/require"
)
func TestRecorder(t *testing.T) {
recorder := &Recorder{}
defer recorder.Close()
recorder.RecordEvent(qlog.MTUUpdated{Value: 1000})
recorder.RecordEvent(qlog.ALPNInformation{ChosenALPN: "foobar"})
recorder.RecordEvent(qlog.ECNStateUpdated{State: qlog.ECNStateCapable})
recorder.RecordEvent(qlog.MTUUpdated{Value: 1200})
require.Equal(t,
[]qlogwriter.Event{
qlog.MTUUpdated{Value: 1000},
qlog.ALPNInformation{ChosenALPN: "foobar"},
qlog.ECNStateUpdated{State: qlog.ECNStateCapable},
qlog.MTUUpdated{Value: 1200},
},
recorder.Events(),
)
require.Empty(t, recorder.Events(qlog.PacketBuffered{}))
require.Equal(t,
[]qlogwriter.Event{
qlog.MTUUpdated{Value: 1000},
qlog.MTUUpdated{Value: 1200},
},
recorder.Events(qlog.MTUUpdated{}),
)
recorder.Clear()
require.Empty(t, recorder.Events())
require.Empty(t, recorder.Events(qlog.MTUUpdated{}))
}
func TestRecorderFilterEventsSameName(t *testing.T) {
// some events have the same name when serialized, but use different structs
require.Equal(t,
qlog.PacketReceived{}.Name(),
qlog.VersionNegotiationReceived{}.Name(),
)
recorder := &Recorder{}
defer recorder.Close()
recorder.RecordEvent(qlog.PacketReceived{
Header: qlog.PacketHeader{PacketType: qlog.PacketTypeHandshake},
})
recorder.RecordEvent(qlog.VersionNegotiationReceived{
Header: qlog.PacketHeaderVersionNegotiation{},
SupportedVersions: []qlog.Version{0xdeadbeef, 0xdecafbad},
})
require.Equal(t,
[]qlogwriter.Event{
qlog.PacketReceived{
Header: qlog.PacketHeader{PacketType: qlog.PacketTypeHandshake},
},
},
recorder.Events(qlog.PacketReceived{}),
)
require.Equal(t,
[]qlogwriter.Event{
qlog.VersionNegotiationReceived{
Header: qlog.PacketHeaderVersionNegotiation{},
SupportedVersions: []qlog.Version{0xdeadbeef, 0xdecafbad},
},
},
recorder.Events(qlog.VersionNegotiationReceived{}),
)
}
func TestRecorderEventsWithTime(t *testing.T) {
synctest.Test(t, func(t *testing.T) {
recorder := &Recorder{}
start := time.Now()
recorder.RecordEvent(qlog.MTUUpdated{Value: 1000})
time.Sleep(time.Minute)
recorder.RecordEvent(qlog.ECNStateUpdated{State: qlog.ECNStateCapable})
time.Sleep(time.Minute)
recorder.RecordEvent(qlog.MTUUpdated{Value: 1200})
require.Equal(t,
[]Event{
{Time: start, Event: qlog.MTUUpdated{Value: 1000}},
{Time: start.Add(2 * time.Minute), Event: qlog.MTUUpdated{Value: 1200}},
},
recorder.EventsWithTime(qlog.MTUUpdated{}),
)
})
}