rs2322tcp/internal/client/control_test.go
2026-08-10 11:15:46 +02:00

168 lines
2.8 KiB
Go

package client_test
import (
"bufio"
"net"
"testing"
"git.lang-dieter.de/rs2322tcp/internal/client"
"git.lang-dieter.de/rs2322tcp/internal/transport"
)
func startTestServer(t *testing.T, handler func(net.Conn)) string {
t.Helper()
listener, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
t.Fatalf("listen failed: %v", err)
}
t.Cleanup(func() {
_ = listener.Close()
})
go func() {
conn, err := listener.Accept()
if err != nil {
return
}
handler(conn)
}()
return listener.Addr().String()
}
func TestClientHello(t *testing.T) {
address := startTestServer(t, func(conn net.Conn) {
defer conn.Close()
reader := bufio.NewReader(conn)
var hello transport.HelloMessage
if err := transport.ReadMessage(reader, &hello); err != nil {
return
}
if hello.Type != transport.MessageHello {
return
}
_ = transport.WriteMessage(
conn,
transport.NewHelloResponse(),
)
})
c, err := client.New(address)
if err != nil {
t.Fatalf("client.New() failed: %v", err)
}
defer c.Close()
}
func TestClientGetDevices(t *testing.T) {
address := startTestServer(t, func(conn net.Conn) {
defer conn.Close()
reader := bufio.NewReader(conn)
// HELLO
var hello transport.HelloMessage
if err := transport.ReadMessage(reader, &hello); err != nil {
return
}
if hello.Type != transport.MessageHello {
return
}
if err := transport.WriteMessage(
conn,
transport.NewHelloResponse(),
); err != nil {
return
}
// GET_DEVICES
var request transport.GetDevicesMessage
if err := transport.ReadMessage(reader, &request); err != nil {
return
}
if request.Type != transport.MessageGetDevices {
return
}
response := transport.NewDeviceList([]transport.RemoteDeviceInfo{
{
ID: "radio",
Name: "Funkgerät",
DataPort: 4711,
BaudRate: 9600,
DataBits: 8,
Parity: "none",
StopBits: 1,
},
{
ID: "rotor",
Name: "Antennenrotor",
DataPort: 4712,
BaudRate: 4800,
DataBits: 8,
Parity: "none",
StopBits: 1,
},
})
_ = transport.WriteMessage(conn, response)
})
c, err := client.New(address)
if err != nil {
t.Fatalf("client.New() failed: %v", err)
}
defer c.Close()
devices, err := c.GetDevices()
if err != nil {
t.Fatalf("GetDevices() failed: %v", err)
}
if len(devices) != 2 {
t.Fatalf("len(devices) = %d, want 2", len(devices))
}
if devices[0].ID != "radio" {
t.Errorf(
"devices[0].ID = %q, want %q",
devices[0].ID,
"radio",
)
}
if devices[0].DataPort != 4711 {
t.Errorf(
"devices[0].DataPort = %d, want 4711",
devices[0].DataPort,
)
}
if devices[1].ID != "rotor" {
t.Errorf(
"devices[1].ID = %q, want %q",
devices[1].ID,
"rotor",
)
}
if devices[1].DataPort != 4712 {
t.Errorf(
"devices[1].DataPort = %d, want 4712",
devices[1].DataPort,
)
}
}