Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 64 additions & 39 deletions server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,51 @@ func TestServer_StartStop(t *testing.T) {
}

func TestServer_Lookup(t *testing.T) {
serv, err := NewServer(&Config{Zone: makeServiceWithServiceName(t, "_foobar._tcp")})
entries := make(chan *ServiceEntry, 1)
errCh := make(chan error, 1)
defer close(errCh)
testCases := []struct {
description string
checkup func()
}{
{description: "normal case", checkup: func() {
select {
case e := <-entries:
if e.Name != "hostname._foobar._tcp.local." {
errCh <- fmt.Errorf("Entry has the wrong name: %+v", e)
return
}
if e.Port != 80 {
errCh <- fmt.Errorf("Entry has the wrong port: %+v", e)
return
}
if e.Info != "Local web server" {
errCh <- fmt.Errorf("Entry as the wrong Info: %+v", e)
return
}
errCh <- nil
case <-time.After(80 * time.Millisecond):
errCh <- fmt.Errorf("Timed out waiting for response")
}
}}, {
description: "change txt",
checkup: func() {
select {
case e := <-entries:
if e.Info != "a=a|b=b" {
errCh <- fmt.Errorf("Entry as the wrong Info: %+v", e)
return
}
errCh <- nil
case <-time.After(80 * time.Millisecond):
errCh <- fmt.Errorf("Timed out waiting for response")
}
},
},
}

svc := makeServiceWithServiceName(t, "_foobar._tcp")
serv, err := NewServer(&Config{Zone: svc})
if err != nil {
t.Fatalf("err: %v", err)
}
Expand All @@ -31,45 +75,26 @@ func TestServer_Lookup(t *testing.T) {
t.Fatalf("err: %v", err)
}
}()

entries := make(chan *ServiceEntry, 1)
errCh := make(chan error, 1)
defer close(errCh)
go func() {
select {
case e := <-entries:
if e.Name != "hostname._foobar._tcp.local." {
errCh <- fmt.Errorf("Entry has the wrong name: %+v", e)
return
}
if e.Port != 80 {
errCh <- fmt.Errorf("Entry has the wrong port: %+v", e)
return
}
if e.Info != "Local web server" {
errCh <- fmt.Errorf("Entry as the wrong Info: %+v", e)
return
}
errCh <- nil
case <-time.After(80 * time.Millisecond):
errCh <- fmt.Errorf("Timed out waiting for response")
for idx, testCase := range testCases {
go testCase.checkup()
if idx == 1 {
svc.UpdateTXT([]string{"a=a", "b=b"})
}
params := &QueryParam{
Service: "_foobar._tcp",
Domain: "local",
Timeout: 50 * time.Millisecond,
Entries: entries,
DisableIPv6: true,
}
}()

params := &QueryParam{
Service: "_foobar._tcp",
Domain: "local",
Timeout: 50 * time.Millisecond,
Entries: entries,
DisableIPv6: true,
}
err = Query(params)
if err != nil {
t.Fatalf("err: %v", err)
}

err = <-errCh
if err != nil {
t.Fatalf("err: %v", err)
err = Query(params)
if err != nil {
t.Fatalf("description: %s, err: %v", testCase.description, err)
}
err = <-errCh
if err != nil {
t.Fatalf("description: %s, err: %v", testCase.description, err)
}
}
}
16 changes: 15 additions & 1 deletion zone.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"net"
"os"
"strings"
"sync"

"github.com/miekg/dns"
)
Expand All @@ -26,6 +27,7 @@ type Zone interface {

// MDNSService is used to export a named service by implementing a Zone
type MDNSService struct {
mutex sync.Mutex
Instance string // Instance name (e.g. "hostService name")
Service string // Service name (e.g. "_http._tcp.")
Domain string // If blank, assumes "local"
Expand Down Expand Up @@ -302,9 +304,21 @@ func (m *MDNSService) instanceRecords(q dns.Question) []dns.RR {
Class: dns.ClassINET,
Ttl: defaultTTL,
},
Txt: m.TXT,
Txt: m.GetTXT(),
}
return []dns.RR{txt}
}
return nil
}

func (m *MDNSService) UpdateTXT(txt []string) {
m.mutex.Lock()
defer m.mutex.Unlock()
m.TXT = txt
}

func (m *MDNSService) GetTXT() []string {
m.mutex.Lock()
defer m.mutex.Unlock()
return m.TXT
}