package mdns

import (
	"reflect"
	"testing"

	"github.com/miekg/dns"
)

type mockMDNSService struct{}

func (s *mockMDNSService) Records(q dns.Question) []dns.RR {
	return []dns.RR{
		&dns.PTR{
			Hdr: dns.RR_Header{
				Name:   "fakerecord",
				Rrtype: dns.TypePTR,
				Class:  dns.ClassINET,
				Ttl:    42,
			},
			Ptr: "fake.local.",
		},
	}
}

func (s *mockMDNSService) Announcement() []dns.RR {
	return []dns.RR{
		&dns.PTR{
			Hdr: dns.RR_Header{
				Name:   "fakeannounce",
				Rrtype: dns.TypePTR,
				Class:  dns.ClassINET,
				Ttl:    42,
			},
			Ptr: "fake.local.",
		},
	}
}

func TestDNSSDServiceRecords(t *testing.T) {
	s := &DNSSDService{
		MDNSService: &MDNSService{
			serviceAddr: "_foobar._tcp.local.",
			Domain:      "local",
		},
	}
	q := dns.Question{
		Name:   "_services._dns-sd._udp.local.",
		Qtype:  dns.TypePTR,
		Qclass: dns.ClassINET,
	}
	recs := s.Records(q)
	if got, want := len(recs), 1; got != want {
		t.Fatalf("s.Records(%v) returned %v records, want %v", q, got, want)
	}

	want := dns.RR(&dns.PTR{
		Hdr: dns.RR_Header{
			Name:   "_services._dns-sd._udp.local.",
			Rrtype: dns.TypePTR,
			Class:  dns.ClassINET,
			Ttl:    defaultTTL,
		},
		Ptr: "_foobar._tcp.local.",
	})
	if got := recs[0]; !reflect.DeepEqual(got, want) {
		t.Errorf("s.Records()[0] = %v, want %v", got, want)
	}
}
