gotelem/socketcan/socketcan_test.go
saji cf112ef561
All checks were successful
Go / build (1.21) (push) Successful in 1m7s
Go / build (1.22) (push) Successful in 1m5s
fix socketcan bugs
2024-03-07 15:06:16 -06:00

86 lines
1.8 KiB
Go

//go:build linux
package socketcan
import (
"bytes"
"net"
"testing"
"github.com/kschamplin/gotelem/internal/can"
)
func TestCanSocket(t *testing.T) {
if _, err := net.InterfaceByName("vcan0"); err != nil {
t.Skipf("missing vcan0, skipping socket tests: %v", err)
}
t.Run("test construction and destruction", func(t *testing.T) {
sock, err := NewCanSocket("vcan0")
if err != nil {
t.Errorf("could not make socket: %v", err)
}
if sock.fd == 0 {
t.Errorf("socket was not made: expected non-zero, got %d", sock.fd)
}
if err := sock.Close(); err != nil {
t.Errorf("could not close socket")
}
})
t.Run("test interface name", func(t *testing.T) {
sock, _ := NewCanSocket("vcan0")
defer sock.Close()
if sock.Name() != "vcan0" {
t.Errorf("incorrect interface name: got %s, expected %s", sock.Name(), "vcan0")
}
})
t.Run("test sending can 2.0 packet", func(t *testing.T) {
sock, _ := NewCanSocket("vcan0")
defer sock.Close()
// make a packet.
testFrame := &can.Frame{
Id: can.CanID{Id: 0x123, Extended: false},
Kind: can.CanDataFrame,
Data: []byte{0, 1, 2, 3, 4, 5, 6, 7},
}
err := sock.Send(testFrame)
if err != nil {
t.Fatal(err)
}
})
t.Run("test receiving a can 2.0 packet", func(t *testing.T) {
sock, _ := NewCanSocket("vcan0")
rsock, _ := NewCanSocket("vcan0")
defer sock.Close()
defer rsock.Close()
testFrame := &can.Frame{
Id: can.CanID{Id: 0x234, Extended: false},
Kind: can.CanDataFrame,
Data: []byte{0, 1, 2, 3, 4, 5, 6, 7},
}
_ = sock.Send(testFrame)
rpkt, err := rsock.Recv()
if err != nil {
t.Error(err)
}
if len(rpkt.Data) != 8 {
t.Errorf("length mismatch: got %d expected 8", len(rpkt.Data))
}
if !bytes.Equal(testFrame.Data, rpkt.Data) {
t.Error("data corrupted")
}
})
// TODO: test filtering.
}