package unix
import (
"context"
"net"
"path/filepath"
"testing"
"time"
)
func TestReaderRoundTrip(t *testing.T) {
dir := t.TempDir()
sock := filepath.Join(dir, "tap.sock")
ln, err := net.Listen("unix", sock)
if err != nil {
t.Fatalf("listen: %v", err)
}
defer ln.Close()
go func() {
conn, err := ln.Accept()
if err != nil {
return
}
defer conn.Close()
_ = WriteFrame(conn, 0, 42, []byte("GET / HTTP/1.1\r\n\r\n"))
_ = WriteFrame(conn, 1, 42, []byte("HTTP/1.1 200 OK\r\n\r\n"))
}()
r, err := Dial(sock)
if err != nil {
t.Fatalf("dial: %v", err)
}
defer r.Close()
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()
got1, err := r.Next(ctx)
if err != nil {
t.Fatalf("next1: %v", err)
}
if got1.ConnID != 42 || got1.Direction != 0 {
t.Errorf("event1 = %+v", got1)
}
got2, err := r.Next(ctx)
if err != nil {
t.Fatalf("next2: %v", err)
}
if got2.Direction != 1 {
t.Errorf("event2 direction = %d", got2.Direction)
}
}
func TestReaderBadMagic(t *testing.T) {
dir := t.TempDir()
sock := filepath.Join(dir, "bad.sock")
ln, err := net.Listen("unix", sock)
if err != nil {
t.Fatalf("listen: %v", err)
}
defer ln.Close()
go func() {
conn, _ := ln.Accept()
_, _ = conn.Write(make([]byte, 24))
_ = conn.Close()
}()
r, err := Dial(sock)
if err != nil {
t.Fatal(err)
}
defer r.Close()
if _, err := r.Next(context.Background()); err == nil {
t.Fatal("expected magic error")
}
}
func TestCloseDuringRead(t *testing.T) {
r := &Reader{}
if _, err := r.Next(context.Background()); err == nil {
t.Fatal("expected ErrClosed")
}
}