// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause

package tcpinfo

import (
	"bytes"
	"io"
	"net"
	"runtime"
	"testing"
)

func TestRTT(t *testing.T) {
	switch runtime.GOOS {
	case "linux", "darwin":
	default:
		t.Skipf("not currently supported on %s", runtime.GOOS)
	}

	ln, err := net.Listen("tcp4", "localhost:0")
	if err != nil {
		t.Fatal(err)
	}
	defer ln.Close()

	go func() {
		for {
			c, err := ln.Accept()
			if err != nil {
				return
			}
			t.Cleanup(func() { c.Close() })

			// Copy from the client to nowhere
			go io.Copy(io.Discard, c)
		}
	}()

	conn, err := net.Dial("tcp4", ln.Addr().String())
	if err != nil {
		t.Fatal(err)
	}

	// Write a bunch of data to the conn to force TCP session establishment
	// and a few packets.
	junkData := bytes.Repeat([]byte("hello world\n"), 1024*1024)
	for i := 0; i < 10; i++ {
		if _, err := conn.Write(junkData); err != nil {
			t.Fatalf("error writing junk data [%d]: %v", i, err)
		}
	}

	// Get the RTT now
	rtt, err := RTT(conn)
	if err != nil {
		t.Fatalf("error getting RTT: %v", err)
	}
	if rtt == 0 {
		t.Errorf("expected RTT > 0")
	}

	t.Logf("TCP rtt: %v", rtt)
}