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  }