112 lines
2.2 KiB
Go
112 lines
2.2 KiB
Go
//go:build linux
|
|
|
|
package client
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
func TestVirtualSerialPTYByteStream(t *testing.T) {
|
|
serial, err := newVirtualSerial()
|
|
if err != nil {
|
|
t.Fatalf("newVirtualSerial() failed: %v", err)
|
|
}
|
|
defer serial.Close()
|
|
|
|
path := serial.Path()
|
|
|
|
if path == "" {
|
|
t.Fatal("virtual serial returned an empty path")
|
|
}
|
|
|
|
t.Logf("virtual serial path: %s", path)
|
|
|
|
// Die externe Software wird durch diesen direkten Zugriff
|
|
// auf den PTY-Slave simuliert.
|
|
slaveFD, err := unix.Open(
|
|
path,
|
|
unix.O_RDWR|unix.O_NOCTTY,
|
|
0,
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("open PTY slave %s: %v", path, err)
|
|
}
|
|
defer unix.Close(slaveFD)
|
|
|
|
expected := make([]byte, 256)
|
|
|
|
for i := range expected {
|
|
expected[i] = byte(i)
|
|
}
|
|
|
|
// ------------------------------------------------------------
|
|
// Slave -> Client
|
|
// ------------------------------------------------------------
|
|
|
|
n, err := unix.Write(slaveFD, expected)
|
|
if err != nil {
|
|
t.Fatalf("write to PTY slave failed: %v", err)
|
|
}
|
|
|
|
if n != len(expected) {
|
|
t.Fatalf(
|
|
"write to PTY slave incomplete: got %d, want %d",
|
|
n,
|
|
len(expected),
|
|
)
|
|
}
|
|
|
|
received := make([]byte, len(expected))
|
|
offset := 0
|
|
|
|
for offset < len(received) {
|
|
n, err := serial.Read(received[offset:])
|
|
if err != nil {
|
|
t.Fatalf("read from virtual serial failed: %v", err)
|
|
}
|
|
|
|
offset += n
|
|
}
|
|
|
|
if !bytes.Equal(received, expected) {
|
|
t.Fatalf("Slave -> Client data mismatch")
|
|
}
|
|
|
|
// ------------------------------------------------------------
|
|
// Client -> Slave
|
|
// ------------------------------------------------------------
|
|
|
|
n, err = serial.Write(expected)
|
|
if err != nil {
|
|
t.Fatalf("write to virtual serial failed: %v", err)
|
|
}
|
|
|
|
if n != len(expected) {
|
|
t.Fatalf(
|
|
"write from virtual serial incomplete: got %d, want %d",
|
|
n,
|
|
len(expected),
|
|
)
|
|
}
|
|
|
|
received = make([]byte, len(expected))
|
|
offset = 0
|
|
|
|
for offset < len(received) {
|
|
n, err := unix.Read(slaveFD, received[offset:])
|
|
if err != nil {
|
|
t.Fatalf("read from PTY slave failed: %v", err)
|
|
}
|
|
|
|
offset += n
|
|
}
|
|
|
|
if !bytes.Equal(received, expected) {
|
|
t.Fatalf("Client -> Slave data mismatch")
|
|
}
|
|
|
|
t.Log("256-byte bidirectional PTY test successful")
|
|
}
|