package coap

import (
	"net"
	"testing"
)

func startUDPLisenter(t *testing.T) (*net.UDPConn, string) {
	udpAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
	if err != nil {
		t.Fatal("Can't resolve UDP addr")
	}
	udpListener, err := net.ListenUDP("udp", udpAddr)
	if err != nil {
		t.Fatal("Can't listen on UDP")
	}
	coapServerAddr := udpListener.LocalAddr().String()
	return udpListener, coapServerAddr
}

func dialAndSend(t *testing.T, addr string, req Message) Message {
	c, err := Dial("udp", addr)
	if err != nil {
		t.Fatalf("Error dialing: %v", err)
	}
	m, err := c.Send(req)
	if err != nil {
		t.Fatalf("Error sending request: %v", err)
	}
	return m
}

func TestServeWithAckResponse(t *testing.T) {
	req := &DgramMessage{
		MessageBase{
			typ:       Confirmable,
			code:      POST,
			messageID: 9876,
			payload:   []byte("Content sent by client"),
		},
	}
	req.SetOption(ContentFormat, TextPlain)
	req.SetPathString("/req/path")

	res := &DgramMessage{
		MessageBase{
			typ:       Acknowledgement,
			code:      Content,
			messageID: req.MessageID(),
			payload:   []byte("Reply from CoAP server"),
		},
	}
	res.SetOption(ContentFormat, TextPlain)
	res.SetPath(req.Path())

	handler := FuncHandler(func(l *net.UDPConn, a *net.UDPAddr, m Message) Message {
		assertEqualMessages(t, req, m)
		return res
	})

	udpListener, coapServerAddr := startUDPLisenter(t)
	defer udpListener.Close()
	go Serve(udpListener, handler)

	m := dialAndSend(t, coapServerAddr, req)
	if m == nil {
		t.Fatalf("Didn't receive CoAP response")
	}
	assertEqualMessages(t, res, m)
}

func TestServeWithoutAckResponse(t *testing.T) {
	req := &DgramMessage{
		MessageBase{
			typ:       NonConfirmable,
			code:      POST,
			messageID: 54321,
			payload:   []byte("Content sent by client"),
		},
	}
	req.SetOption(ContentFormat, AppOctets)

	handler := FuncHandler(func(l *net.UDPConn, a *net.UDPAddr, m Message) Message {
		assertEqualMessages(t, req, m)
		return nil
	})

	udpListener, coapServerAddr := startUDPLisenter(t)
	defer udpListener.Close()
	go Serve(udpListener, handler)

	m := dialAndSend(t, coapServerAddr, req)
	if m != nil {
		t.Fatalf("Received response packet, but expected none")
	}
}
