internal/source/unix/reader_test.go

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