216 lines
4.4 KiB
Go
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)
|
|
}
|