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, ) } }