fix: transport.UDPConn 新增了 WithUDPLinuxTimestamping(false) 开关
This commit is contained in:
@@ -246,3 +246,87 @@ func TestUDPLinuxTimestampingDebugLoggerCapturesDatagramAndErrqueueEvents(t *tes
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestUDPLinuxTimestampingCanBeDisabled(t *testing.T) {
|
||||
senderLogger := &recordingLogger{}
|
||||
receiverLogger := &recordingLogger{}
|
||||
|
||||
serverAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
|
||||
if err != nil {
|
||||
t.Fatalf("ResolveUDPAddr() error = %v", err)
|
||||
}
|
||||
serverRaw, err := net.ListenUDP("udp", serverAddr)
|
||||
if err != nil {
|
||||
t.Fatalf("ListenUDP() error = %v", err)
|
||||
}
|
||||
receiver, err := NewUDPConn(
|
||||
serverRaw,
|
||||
nil,
|
||||
WithUDPLogger(receiverLogger, latencylog.NodeRolePeer, "peer-b"),
|
||||
WithUDPLinuxTimestamping(false),
|
||||
)
|
||||
if err != nil {
|
||||
_ = serverRaw.Close()
|
||||
t.Fatalf("NewUDPConn(receiver) error = %v", err)
|
||||
}
|
||||
t.Cleanup(func() { _ = receiver.Close() })
|
||||
|
||||
peerRaw, err := net.DialUDP("udp", nil, serverRaw.LocalAddr().(*net.UDPAddr))
|
||||
if err != nil {
|
||||
t.Fatalf("DialUDP() error = %v", err)
|
||||
}
|
||||
sender, err := NewUDPConn(
|
||||
peerRaw,
|
||||
nil,
|
||||
WithUDPLogger(senderLogger, latencylog.NodeRolePeer, "peer-a"),
|
||||
WithUDPLinuxTimestamping(false),
|
||||
)
|
||||
if err != nil {
|
||||
_ = peerRaw.Close()
|
||||
t.Fatalf("NewUDPConn(sender) error = %v", err)
|
||||
}
|
||||
t.Cleanup(func() { _ = sender.Close() })
|
||||
|
||||
msg := protocol.Message{
|
||||
Type: protocol.MessageTypeText,
|
||||
ID: 123,
|
||||
From: "peer-a",
|
||||
To: "peer-b",
|
||||
Body: []byte("hello without udp timestamping"),
|
||||
}
|
||||
|
||||
sendErr := make(chan error, 1)
|
||||
go func() {
|
||||
sendErr <- sender.Send(msg)
|
||||
}()
|
||||
|
||||
got, _, err := receiver.Receive()
|
||||
if err != nil {
|
||||
t.Fatalf("Receive() error = %v", err)
|
||||
}
|
||||
if err := <-sendErr; err != nil {
|
||||
t.Fatalf("Send() error = %v", err)
|
||||
}
|
||||
if !reflect.DeepEqual(got, msg) {
|
||||
t.Fatalf("message mismatch: got %+v want %+v", got, msg)
|
||||
}
|
||||
if sender.raw != nil {
|
||||
t.Fatal("sender.raw != nil, want nil when linux timestamping is disabled")
|
||||
}
|
||||
if receiver.raw != nil {
|
||||
t.Fatal("receiver.raw != nil, want nil when linux timestamping is disabled")
|
||||
}
|
||||
assertMissingEvent(t, senderLogger.Events(), latencylog.EventATXSched, msg.ID)
|
||||
assertMissingEvent(t, senderLogger.Events(), latencylog.EventATXSoftware, msg.ID)
|
||||
assertMissingEvent(t, receiverLogger.Events(), latencylog.EventBRXSoftware, msg.ID)
|
||||
}
|
||||
|
||||
func assertMissingEvent(t *testing.T, events []latencylog.Event, wantEvent string, wantMessageID uint64) {
|
||||
t.Helper()
|
||||
|
||||
for _, event := range events {
|
||||
if event.Event == wantEvent && event.MessageID == wantMessageID {
|
||||
t.Fatalf("unexpected event %s for message %d: %+v", wantEvent, wantMessageID, event)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user