rs2322tcp/internal/client/device_test.go
2026-08-10 17:59:35 +02:00

159 lines
3.5 KiB
Go

/*
* ============================================================================
* Projekt.....: rs2322tcp
* Datei.......: internal/client/device_test.go
* Copyright (C) 2026 Dieter Lang
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Beschreibung:
* Tests für die Zuordnung lokaler virtueller Ports zu den vom Server
* gemeldeten Remote-Geräten.
* ============================================================================
*/
package client
import (
"strings"
"testing"
"git.lang-dieter.de/rs2322tcp/internal/config"
"git.lang-dieter.de/rs2322tcp/internal/transport"
)
///////////////////////////////////////////////////////////////////////////////
// Test data
///////////////////////////////////////////////////////////////////////////////
func testRemoteDevices() []transport.RemoteDeviceInfo {
return []transport.RemoteDeviceInfo{
{
ID: "radio",
Name: "Radio",
BaudRate: 9600,
DataBits: 8,
Parity: "none",
StopBits: 1,
DataPort: 50123,
},
{
ID: "rotor",
Name: "Rotor",
BaudRate: 4800,
DataBits: 8,
Parity: "none",
StopBits: 1,
DataPort: 50124,
},
}
}
///////////////////////////////////////////////////////////////////////////////
// Tests
///////////////////////////////////////////////////////////////////////////////
func TestFindRemoteDevice(t *testing.T) {
devices := testRemoteDevices()
virtualPort := config.VirtualPortConfig{
Port: "/dev/ttyUSB100",
RemoteDevice: "radio",
}
got, err := findRemoteDevice(virtualPort, devices)
if err != nil {
t.Fatalf("findRemoteDevice: %v", err)
}
if got.ID != "radio" {
t.Fatalf("ID = %q, want %q", got.ID, "radio")
}
if got.DataPort != 50123 {
t.Fatalf("DataPort = %d, want %d", got.DataPort, 50123)
}
}
func TestFindRemoteDeviceRotor(t *testing.T) {
devices := testRemoteDevices()
virtualPort := config.VirtualPortConfig{
Port: "/dev/ttyUSB101",
RemoteDevice: "rotor",
}
got, err := findRemoteDevice(virtualPort, devices)
if err != nil {
t.Fatalf("findRemoteDevice: %v", err)
}
if got.ID != "rotor" {
t.Fatalf("ID = %q, want %q", got.ID, "rotor")
}
if got.DataPort != 50124 {
t.Fatalf("DataPort = %d, want %d", got.DataPort, 50124)
}
}
func TestFindRemoteDeviceEmptyID(t *testing.T) {
devices := testRemoteDevices()
virtualPort := config.VirtualPortConfig{
Port: "/dev/ttyUSB100",
}
_, err := findRemoteDevice(virtualPort, devices)
if err == nil {
t.Fatal("expected error for empty remote device")
}
if !strings.Contains(err.Error(), "remote device is empty") {
t.Fatalf("unexpected error: %v", err)
}
}
func TestFindRemoteDeviceNotFound(t *testing.T) {
devices := testRemoteDevices()
virtualPort := config.VirtualPortConfig{
Port: "/dev/ttyUSB100",
RemoteDevice: "unknown",
}
_, err := findRemoteDevice(virtualPort, devices)
if err == nil {
t.Fatal("expected error for unknown remote device")
}
if !strings.Contains(err.Error(), `remote device "unknown" not found`) {
t.Fatalf("unexpected error: %v", err)
}
}
func TestFindRemoteDeviceAmbiguous(t *testing.T) {
devices := []transport.RemoteDeviceInfo{
{
ID: "radio",
DataPort: 50123,
},
{
ID: "radio",
DataPort: 50125,
},
}
virtualPort := config.VirtualPortConfig{
Port: "/dev/ttyUSB100",
RemoteDevice: "radio",
}
_, err := findRemoteDevice(virtualPort, devices)
if err == nil {
t.Fatal("expected error for ambiguous remote device")
}
if !strings.Contains(err.Error(), `remote device "radio" is ambiguous`) {
t.Fatalf("unexpected error: %v", err)
}
}