package udpproxy

import (
	"log"
	"net"
	"testing"
	"time"
)

func TestSendAndReceive(t *testing.T) {
	go runLilProxy()
	go runUDPServer()

	paddr, err := net.ResolveUDPAddr("udp", "localhost:9000")
	if err != nil {
		t.Fatal(err)
	}

	conn, err := net.DialUDP("udp", nil, paddr)
	if err != nil {
		t.Fatal(err)
	}

	go func() {
		for {
			buf := make([]byte, 2048)
			_, _, err = conn.ReadFromUDP(buf)
			if err != nil {
				log.Fatal(err)
			}

			log.Printf("response received: %s", string(buf))
		}
	}()

	for {
		time.Sleep(1 * time.Second)
		_, err = conn.Write([]byte("hi\n"))
		if err != nil {
			log.Fatal(err)
		}
	}
}

func runLilProxy() {
	port := ":9000"
	target := "localhost:9001"

	c, err := New(port, target)
	if err != nil {
		log.Fatal(err)
	}

	log.Fatal(c.ListenAndServe())
}

func runUDPServer() {
	taddr, err := net.ResolveUDPAddr("udp", ":9001")
	if err != nil {
		log.Fatal(err)
	}

	conn, err := net.ListenUDP("udp", taddr)
	if err != nil {
		log.Fatal(err)
	}

	for {
		buf := make([]byte, 2048)
		_, caddr, err := conn.ReadFromUDP(buf)
		if err != nil {
			log.Fatal(err)
		}

		log.Printf("request received: %s", string(buf))

		_, err = conn.WriteToUDP([]byte("bye\n"), caddr)
		if err != nil {
			log.Fatal(err)
		}

	}
}