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

153 lines
3.2 KiB
Go

//go:build linux
/*
* ============================================================================
* Projekt.....: rs2322tcp
* Datei.......: internal/client/virtual_port_linux_test.go
* Copyright (C) 2026 Dieter Lang
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
* Beschreibung:
* Tests für die Linux-spezifische Verwaltung der internen Symlinks
* virtueller rs2322tcp-Seriellschnittstellen.
* ============================================================================
*/
package client
import (
"os"
"path/filepath"
"testing"
)
func TestVirtualPortLinkPath(t *testing.T) {
path, err := virtualPortLinkPath("/dev/ttyUSB100")
if err != nil {
t.Fatalf("virtualPortLinkPath() failed: %v", err)
}
wantSuffix := filepath.Join(".rs2322tcp", "virtual", "ttyUSB100")
if !filepath.IsAbs(path) {
t.Fatalf("path is not absolute: %q", path)
}
if !hasPathSuffix(path, wantSuffix) {
t.Errorf(
"virtualPortLinkPath() = %q, want suffix %q",
path,
wantSuffix,
)
}
}
func TestSetAndRemoveVirtualPortLink(t *testing.T) {
tempHome := t.TempDir()
t.Setenv("HOME", tempHome)
portPath := "/dev/ttyUSB100"
target := "/dev/pts/2"
if err := setVirtualPortLink(portPath, target); err != nil {
t.Fatalf("setVirtualPortLink() failed: %v", err)
}
linkPath, err := virtualPortLinkPath(portPath)
if err != nil {
t.Fatalf("virtualPortLinkPath() failed: %v", err)
}
got, err := os.Readlink(linkPath)
if err != nil {
t.Fatalf("Readlink() failed: %v", err)
}
if got != target {
t.Errorf(
"link target = %q, want %q",
got,
target,
)
}
if err := removeVirtualPortLink(portPath); err != nil {
t.Fatalf("removeVirtualPortLink() failed: %v", err)
}
if _, err := os.Lstat(linkPath); !os.IsNotExist(err) {
t.Fatalf(
"link still exists after removal: %q",
linkPath,
)
}
}
func TestSetVirtualPortLinkReplacesExistingLink(t *testing.T) {
tempHome := t.TempDir()
t.Setenv("HOME", tempHome)
portPath := "/dev/ttyUSB100"
if err := setVirtualPortLink(portPath, "/dev/pts/2"); err != nil {
t.Fatalf("first setVirtualPortLink() failed: %v", err)
}
if err := setVirtualPortLink(portPath, "/dev/pts/7"); err != nil {
t.Fatalf("second setVirtualPortLink() failed: %v", err)
}
linkPath, err := virtualPortLinkPath(portPath)
if err != nil {
t.Fatalf("virtualPortLinkPath() failed: %v", err)
}
got, err := os.Readlink(linkPath)
if err != nil {
t.Fatalf("Readlink() failed: %v", err)
}
if got != "/dev/pts/7" {
t.Errorf(
"link target = %q, want %q",
got,
"/dev/pts/7",
)
}
}
func TestRemoveVirtualPortLinkMissing(t *testing.T) {
tempHome := t.TempDir()
t.Setenv("HOME", tempHome)
if err := removeVirtualPortLink("/dev/ttyUSB100"); err != nil {
t.Fatalf(
"removeVirtualPortLink() failed for missing link: %v",
err,
)
}
}
func TestVirtualPortLinkPathUsesBaseName(t *testing.T) {
path, err := virtualPortLinkPath("/dev/ttyUSB123")
if err != nil {
t.Fatalf("virtualPortLinkPath() failed: %v", err)
}
if filepath.Base(path) != "ttyUSB123" {
t.Errorf(
"filepath.Base() = %q, want %q",
filepath.Base(path),
"ttyUSB123",
)
}
}
func hasPathSuffix(path string, suffix string) bool {
return path == suffix ||
len(path) > len(suffix) &&
path[len(path)-len(suffix):] == suffix
}