mirror of
https://github.com/sorenisanerd/gotty.git
synced 2024-11-25 13:14:25 +00:00
140 lines
2.9 KiB
Go
140 lines
2.9 KiB
Go
|
package webtty
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"context"
|
||
|
"encoding/base64"
|
||
|
"io"
|
||
|
"sync"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
type pipePair struct {
|
||
|
*io.PipeReader
|
||
|
*io.PipeWriter
|
||
|
}
|
||
|
|
||
|
func TestWriteFromPTY(t *testing.T) {
|
||
|
connInPipeReader, connInPipeWriter := io.Pipe() // in to conn
|
||
|
connOutPipeReader, _ := io.Pipe() // out from conn
|
||
|
|
||
|
conn := pipePair{
|
||
|
connOutPipeReader,
|
||
|
connInPipeWriter,
|
||
|
}
|
||
|
dt, err := New(conn)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Unexpected error from New(): %s", err)
|
||
|
}
|
||
|
|
||
|
ctx, cancel := context.WithCancel(context.Background())
|
||
|
var wg sync.WaitGroup
|
||
|
wg.Add(1)
|
||
|
go func() {
|
||
|
wg.Done()
|
||
|
err := dt.Run(ctx)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Unexpected error from Run(): %s", err)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
message := []byte("foobar")
|
||
|
n, err := dt.TTY().Write(message)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Unexpected error from Write(): %s", err)
|
||
|
}
|
||
|
if n != len(message) {
|
||
|
t.Fatalf("Write() accepted `%d` for message `%s`", n, message)
|
||
|
}
|
||
|
|
||
|
buf := make([]byte, 1024)
|
||
|
n, err = connInPipeReader.Read(buf)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Unexpected error from Read(): %s", err)
|
||
|
}
|
||
|
if buf[0] != Output {
|
||
|
t.Fatalf("Unexpected message type `%c`", buf[0])
|
||
|
}
|
||
|
decoded := make([]byte, 1024)
|
||
|
n, err = base64.StdEncoding.Decode(decoded, buf[1:n])
|
||
|
if err != nil {
|
||
|
t.Fatalf("Unexpected error from Decode(): %s", err)
|
||
|
}
|
||
|
if !bytes.Equal(decoded[:n], message) {
|
||
|
t.Fatalf("Unexpected message received: `%s`", decoded[:n])
|
||
|
}
|
||
|
|
||
|
cancel()
|
||
|
wg.Wait()
|
||
|
}
|
||
|
|
||
|
func TestWriteFromConn(t *testing.T) {
|
||
|
connInPipeReader, connInPipeWriter := io.Pipe() // in to conn
|
||
|
connOutPipeReader, connOutPipeWriter := io.Pipe() // out from conn
|
||
|
|
||
|
conn := pipePair{
|
||
|
connOutPipeReader,
|
||
|
connInPipeWriter,
|
||
|
}
|
||
|
|
||
|
dt, err := New(conn)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Unexpected error from New(): %s", err)
|
||
|
}
|
||
|
|
||
|
ctx, cancel := context.WithCancel(context.Background())
|
||
|
var wg sync.WaitGroup
|
||
|
wg.Add(1)
|
||
|
go func() {
|
||
|
wg.Done()
|
||
|
err := dt.Run(ctx)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Unexpected error from Run(): %s", err)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
var (
|
||
|
message []byte
|
||
|
n int
|
||
|
)
|
||
|
readBuf := make([]byte, 1024)
|
||
|
|
||
|
// input
|
||
|
message = []byte("0hello\n") // line buffered canonical mode
|
||
|
n, err = connOutPipeWriter.Write(message)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Unexpected error from Write(): %s", err)
|
||
|
}
|
||
|
if n != len(message) {
|
||
|
t.Fatalf("Write() accepted `%d` for message `%s`", n, message)
|
||
|
}
|
||
|
|
||
|
n, err = dt.TTY().Read(readBuf)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Unexpected error from Write(): %s", err)
|
||
|
}
|
||
|
if !bytes.Equal(readBuf[:n], message[1:]) {
|
||
|
t.Fatalf("Unexpected message received: `%s`", readBuf[:n])
|
||
|
}
|
||
|
|
||
|
// ping
|
||
|
message = []byte("1\n") // line buffered canonical mode
|
||
|
n, err = connOutPipeWriter.Write(message)
|
||
|
if n != len(message) {
|
||
|
t.Fatalf("Write() accepted `%d` for message `%s`", n, message)
|
||
|
}
|
||
|
|
||
|
n, err = connInPipeReader.Read(readBuf)
|
||
|
if err != nil {
|
||
|
t.Fatalf("Unexpected error from Read(): %s", err)
|
||
|
}
|
||
|
if !bytes.Equal(readBuf[:n], []byte{'1'}) {
|
||
|
t.Fatalf("Unexpected message received: `%s`", readBuf[:n])
|
||
|
}
|
||
|
|
||
|
// TODO: resize
|
||
|
|
||
|
cancel()
|
||
|
wg.Wait()
|
||
|
}
|