package main

import (
	"context"
	"log"
	"testing"

	"github.com/libp2p/go-libp2p/examples/testutils"
)

func TestMain(t *testing.T) {
	var h testutils.LogHarness
	h.Expect("listening for connections")
	h.Expect("sender opening stream")
	h.Expect("sender saying hello")
	h.Expect("listener received new stream")
	h.Expect("read: Hello, world!")
	h.Expect(`read reply: "Hello, world!\n"`)

	h.Run(t, func() {
		// Create a context that will stop the hosts when the tests end
		ctx, cancel := context.WithCancel(context.Background())
		defer cancel()

		// Get a tcp port for the listener
		lport, err := testutils.FindFreePort(t, "", 5)
		if err != nil {
			log.Println(err)
			return
		}

		// Get a tcp port for the sender
		sport, err := testutils.FindFreePort(t, "", 5)
		if err != nil {
			log.Println(err)
			return
		}

		// Make listener
		lh, err := makeBasicHost(lport, true, 1)
		if err != nil {
			log.Println(err)
			return
		}

		startListener(ctx, lh, lport, true)

		// Make sender
		listenAddr := getHostAddress(lh)
		sh, err := makeBasicHost(sport, true, 2)
		if err != nil {
			log.Println(err)
			return
		}

		runSender(ctx, sh, listenAddr)
	})
}
