//go:build windows package transport import ( "fmt" "io" "testing" "time" ) func TestNamedPipeRoundTripByteMode(t *testing.T) { pipeName := fmt.Sprintf("notify-npipe-test-%d", time.Now().UnixNano()) listener, err := Listen("npipe", pipeName) if err != nil { t.Fatalf("Listen failed: %v", err) } defer func() { _ = listener.Close() }() serverErr := make(chan error, 1) go func() { conn, err := listener.Accept() if err != nil { serverErr <- err return } defer func() { _ = conn.Close() }() buf := make([]byte, 4) if _, err := io.ReadFull(conn, buf); err != nil { serverErr <- err return } if got, want := string(buf), "ping"; got != want { serverErr <- fmt.Errorf("server got %q, want %q", got, want) return } if _, err := conn.Write([]byte("pong")); err != nil { serverErr <- err return } serverErr <- nil }() conn, err := DialTimeout("npipe", pipeName, 2*time.Second) if err != nil { t.Fatalf("DialTimeout failed: %v", err) } defer func() { _ = conn.Close() }() if _, err := conn.Write([]byte("ping")); err != nil { t.Fatalf("client write failed: %v", err) } reply := make([]byte, 4) if _, err := io.ReadFull(conn, reply); err != nil { t.Fatalf("client read failed: %v", err) } if got, want := string(reply), "pong"; got != want { t.Fatalf("client got %q, want %q", got, want) } select { case err := <-serverErr: if err != nil { t.Fatalf("server error: %v", err) } case <-time.After(2 * time.Second): t.Fatal("server timeout") } }