package output import ( "io" "net" "testing" "time" ) // TestSendReceive does an end-to-end round trip: a TCP client connects to // the Sender, Send broadcasts a frame, and the client must read it back. func TestSendReceive(t *testing.T) { s := New() port, err := s.Listen("127.0.0.1:0") if err != nil { t.Fatalf("Listen: %v", err) } conn, err := net.Dial("tcp", "127.0.0.1:"+itoa(port)) if err != nil { t.Fatalf("Dial: %v", err) } defer func() { _ = conn.Close() }() defer func() { _ = conn.(*net.TCPConn).SetLinger(0) }() // Give the accept loop a moment to register the connection. deadline := time.Now().Add(2 * time.Second) for s.NumConns() == 0 && time.Now().Before(deadline) { time.Sleep(5 * time.Millisecond) } if s.NumConns() != 1 { t.Fatalf("NumConns = %d, want 1", s.NumConns()) } payload := []byte("frame-one") s.Send(payload) got := make([]byte, len(payload)) if _, err := io.ReadFull(conn, got); err != nil { t.Fatalf("read: %v", err) } if string(got) != "frame-one" { t.Errorf("round trip mismatch: got %q", got) } s.Close() } func itoa(v int) string { if v == 0 { return "0" } var buf [20]byte i := len(buf) for v > 0 { i-- buf[i] = byte('0' + v%10) v /= 10 } return string(buf[i:]) }