github.com/bluenviron/gomavlib/v2@v2.2.1-0.20240308101627-2c07e3da629c/endpoint_broadcast_test.go (about) 1 package gomavlib 2 3 import ( 4 "net" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 9 "github.com/bluenviron/gomavlib/v2/pkg/dialect" 10 "github.com/bluenviron/gomavlib/v2/pkg/frame" 11 ) 12 13 var _ endpointChannelSingle = (*endpointUDPBroadcast)(nil) 14 15 type readWriterFromFuncs struct { 16 readFunc func([]byte) (int, error) 17 writeFunc func([]byte) (int, error) 18 } 19 20 func (rw *readWriterFromFuncs) Read(p []byte) (int, error) { 21 return rw.readFunc(p) 22 } 23 24 func (rw *readWriterFromFuncs) Write(p []byte) (int, error) { 25 return rw.writeFunc(p) 26 } 27 28 func TestEndpointBroadcast(t *testing.T) { 29 node, err := NewNode(NodeConf{ 30 Dialect: testDialect, 31 OutVersion: V2, 32 OutSystemID: 10, 33 Endpoints: []EndpointConf{EndpointUDPBroadcast{"127.255.255.255:5602", ":5601"}}, 34 HeartbeatDisable: true, 35 }) 36 require.NoError(t, err) 37 defer node.Close() 38 39 evt := <-node.Events() 40 require.Equal(t, &EventChannelOpen{ 41 Channel: evt.(*EventChannelOpen).Channel, 42 }, evt) 43 44 pc, err := net.ListenPacket("udp4", ":5602") 45 require.NoError(t, err) 46 defer pc.Close() 47 48 dialectRW, err := dialect.NewReadWriter(testDialect) 49 require.NoError(t, err) 50 51 rw, err := frame.NewReadWriter(frame.ReadWriterConf{ 52 ReadWriter: &readWriterFromFuncs{ 53 readFunc: func(p []byte) (int, error) { 54 n, _, err := pc.ReadFrom(p) 55 return n, err 56 }, 57 writeFunc: func(p []byte) (int, error) { 58 return pc.WriteTo(p, &net.UDPAddr{ 59 IP: net.ParseIP("127.255.255.255"), 60 Port: 5601, 61 }) 62 }, 63 }, 64 DialectRW: dialectRW, 65 OutVersion: frame.V2, 66 OutSystemID: 11, 67 }) 68 require.NoError(t, err) 69 70 for i := 0; i < 3; i++ { //nolint:dupl 71 msg := &MessageHeartbeat{ 72 Type: 1, 73 Autopilot: 2, 74 BaseMode: 3, 75 CustomMode: 6, 76 SystemStatus: 4, 77 MavlinkVersion: 5, 78 } 79 err = rw.WriteMessage(msg) 80 require.NoError(t, err) 81 82 evt = <-node.Events() 83 require.Equal(t, &EventFrame{ 84 Frame: &frame.V2Frame{ 85 SequenceID: byte(i), 86 SystemID: 11, 87 ComponentID: 1, 88 Message: msg, 89 Checksum: evt.(*EventFrame).Frame.GetChecksum(), 90 }, 91 Channel: evt.(*EventFrame).Channel, 92 }, evt) 93 94 msg = &MessageHeartbeat{ 95 Type: 6, 96 Autopilot: 5, 97 BaseMode: 4, 98 CustomMode: 3, 99 SystemStatus: 2, 100 MavlinkVersion: 1, 101 } 102 err := node.WriteMessageAll(msg) 103 require.NoError(t, err) 104 105 fr, err := rw.Read() 106 require.NoError(t, err) 107 require.Equal(t, &frame.V2Frame{ 108 SequenceID: byte(i), 109 SystemID: 10, 110 ComponentID: 1, 111 Message: msg, 112 Checksum: fr.GetChecksum(), 113 }, fr) 114 } 115 }