Files
OmniSocketGo/cmd/internal/transport/kcp_linux_test.go

94 lines
2.8 KiB
Go

//go:build linux
package transport
import (
"testing"
"omnisocketgo/cmd/internal/latencylog"
"omnisocketgo/cmd/internal/protocol"
)
func TestKCPLinuxPacketDebugLogsKernelEvents(t *testing.T) {
senderPacketLogger := &recordingKCPPacketDebugLogger{}
receiverPacketLogger := &recordingKCPPacketDebugLogger{}
sender, accepted, cleanup := newKCPConnPair(t, nil, nil, senderPacketLogger, receiverPacketLogger)
defer cleanup()
msg := protocol.Message{
Type: protocol.MessageTypeText,
ID: 1,
From: "peer-a",
To: "peer-b",
Body: []byte("hello kcp linux"),
}
sendErr := make(chan error, 1)
go func() {
sendErr <- sender.Send(msg)
}()
receiver := awaitAcceptedKCPConn(t, accepted)
if _, err := receiver.Receive(); err != nil {
t.Fatalf("receiver.Receive() error = %v", err)
}
if err := <-sendErr; err != nil {
t.Fatalf("sender.Send() error = %v", err)
}
waitForKCPPacketRecords(t, senderPacketLogger, func(records []KCPPacketDebugRecord) bool {
return hasKCPPacketEvent(records, latencylog.EventATXSched) && hasKCPPacketEvent(records, latencylog.EventATXSoftware)
}, "sender tx kernel timestamp records")
waitForKCPPacketRecords(t, receiverPacketLogger, func(records []KCPPacketDebugRecord) bool {
return hasKCPPacketEvent(records, latencylog.EventBRXSoftware)
}, "receiver rx kernel timestamp records")
senderRecords := senderPacketLogger.Records()
receiverRecords := receiverPacketLogger.Records()
assertKCPPacketRecord(t, senderRecords, latencylog.EventATXSched, true)
assertKCPPacketRecord(t, senderRecords, latencylog.EventATXSoftware, true)
assertKCPPacketRecord(t, receiverRecords, latencylog.EventBRXSoftware, false)
}
func hasKCPPacketEvent(records []KCPPacketDebugRecord, wantEvent string) bool {
for _, record := range records {
if record.Event == wantEvent {
return true
}
}
return false
}
func assertKCPPacketRecord(t *testing.T, records []KCPPacketDebugRecord, wantEvent string, wantUDPTXID bool) {
t.Helper()
for _, record := range records {
if record.Event != wantEvent {
continue
}
if record.TSUnixNano <= 0 {
t.Fatalf("record %s timestamp must be positive: %+v", wantEvent, record)
}
if record.PacketBytes <= 0 {
t.Fatalf("record %s packet bytes must be positive: %+v", wantEvent, record)
}
if record.KCPConv == nil {
t.Fatalf("record %s missing kcp_conv: %+v", wantEvent, record)
}
if len(record.Segments) == 0 {
t.Fatalf("record %s missing parsed segments: %+v", wantEvent, record)
}
if wantUDPTXID && record.UDPTXID == nil {
t.Fatalf("record %s missing udp_tx_id: %+v", wantEvent, record)
}
if !wantUDPTXID && record.UDPTXID != nil {
t.Fatalf("record %s unexpected udp_tx_id: %+v", wantEvent, record)
}
return
}
t.Fatalf("missing KCP packet debug event %s in %+v", wantEvent, records)
}