//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") }