rs2322tcp/internal/client/virtual_port_manager_test.go
2026-08-10 16:20:28 +02:00

216 lines
4.4 KiB
Go

/*
* ============================================================================
* Projekt.....: rs2322tcp
* Datei.......: internal/client/virtual_port_manager_test.go
* Copyright (C) 2026 Dieter Lang
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Beschreibung:
* Tests für die Auswahl und Verwaltung virtueller serieller Ports.
* ============================================================================
*/
package client
import (
"testing"
"git.lang-dieter.de/rs2322tcp/internal/config"
)
///////////////////////////////////////////////////////////////////////////////
// Tests
///////////////////////////////////////////////////////////////////////////////
func TestNewVirtualPortManager(t *testing.T) {
cfg := config.VirtualPortRangeConfig{
First: 100,
Last: 199,
}
manager := NewVirtualPortManager(cfg)
if manager == nil {
t.Fatal("NewVirtualPortManager() returned nil")
}
if manager.first != 100 {
t.Errorf("first = %d, want 100", manager.first)
}
if manager.last != 199 {
t.Errorf("last = %d, want 199", manager.last)
}
}
func TestVirtualPortManagerReserveFirst(t *testing.T) {
manager := NewVirtualPortManager(config.VirtualPortRangeConfig{
First: 100,
Last: 199,
})
number, err := manager.Reserve()
if err != nil {
t.Fatalf("Reserve() failed: %v", err)
}
if number != 100 {
t.Errorf("Reserve() = %d, want 100", number)
}
}
func TestVirtualPortManagerReserveNextFree(t *testing.T) {
manager := NewVirtualPortManager(config.VirtualPortRangeConfig{
First: 100,
Last: 199,
})
first, err := manager.Reserve()
if err != nil {
t.Fatalf("first Reserve() failed: %v", err)
}
second, err := manager.Reserve()
if err != nil {
t.Fatalf("second Reserve() failed: %v", err)
}
if first != 100 {
t.Errorf("first Reserve() = %d, want 100", first)
}
if second != 101 {
t.Errorf("second Reserve() = %d, want 101", second)
}
}
func TestVirtualPortManagerRelease(t *testing.T) {
manager := NewVirtualPortManager(config.VirtualPortRangeConfig{
First: 100,
Last: 199,
})
number, err := manager.Reserve()
if err != nil {
t.Fatalf("Reserve() failed: %v", err)
}
manager.Release(number)
reused, err := manager.Reserve()
if err != nil {
t.Fatalf("Reserve() after Release() failed: %v", err)
}
if reused != 100 {
t.Errorf("Reserve() after Release() = %d, want 100",
reused)
}
}
func TestVirtualPortManagerSkipsReservedPorts(t *testing.T) {
manager := NewVirtualPortManager(config.VirtualPortRangeConfig{
First: 100,
Last: 199,
})
for i := 0; i < 3; i++ {
if _, err := manager.Reserve(); err != nil {
t.Fatalf("Reserve() %d failed: %v", i+1, err)
}
}
number, err := manager.Reserve()
if err != nil {
t.Fatalf("fourth Reserve() failed: %v", err)
}
if number != 103 {
t.Errorf("fourth Reserve() = %d, want 103", number)
}
}
func TestVirtualPortManagerCustomRange(t *testing.T) {
manager := NewVirtualPortManager(config.VirtualPortRangeConfig{
First: 200,
Last: 299,
})
number, err := manager.Reserve()
if err != nil {
t.Fatalf("Reserve() failed: %v", err)
}
if number != 200 {
t.Errorf("Reserve() = %d, want 200", number)
}
}
func TestVirtualPortManagerNoFreePort(t *testing.T) {
manager := NewVirtualPortManager(config.VirtualPortRangeConfig{
First: 100,
Last: 102,
})
for i := 0; i < 3; i++ {
if _, err := manager.Reserve(); err != nil {
t.Fatalf("Reserve() %d failed: %v", i+1, err)
}
}
if _, err := manager.Reserve(); err == nil {
t.Fatal("Reserve() succeeded, want no-free-port error")
}
}
func TestVirtualPortManagerPortPath(t *testing.T) {
manager := NewVirtualPortManager(config.VirtualPortRangeConfig{
First: 100,
Last: 199,
})
tests := []struct {
number int
want string
}{
{
number: 100,
want: "/dev/ttyUSB100",
},
{
number: 123,
want: "/dev/ttyUSB123",
},
{
number: 199,
want: "/dev/ttyUSB199",
},
}
for _, test := range tests {
got := manager.PortPath(test.number)
if got != test.want {
t.Errorf(
"PortPath(%d) = %q, want %q",
test.number,
got,
test.want,
)
}
}
}
func TestVirtualPortManagerNil(t *testing.T) {
var manager *VirtualPortManager
if path := manager.PortPath(100); path != "" {
t.Errorf("nil PortPath() = %q, want empty string", path)
}
if _, err := manager.Reserve(); err == nil {
t.Fatal("nil Reserve() succeeded, want error")
}
manager.Release(100)
}