Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

resolve failure #53

Open
leslie-wang opened this issue Mar 21, 2019 · 1 comment
Open

resolve failure #53

leslie-wang opened this issue Mar 21, 2019 · 1 comment

Comments

@leslie-wang
Copy link
Contributor

leslie-wang commented Mar 21, 2019

I have below test cases (based on gopkg.in/check.v1 framework), which 1st resolve happened before publish, and 2nd resolve after publish. If using same resolver instance, it will fail

	// by default mdns is not enabled
	mdnsName := "test--xxxxxxxxxxxx"
	mdnsService := "test--xxxx.tcp"
	mdnsDomain := "local."

	resolver, err := zeroconf.NewResolver(nil)
	c.Assert(err, IsNil)

	entries1 := make(chan *zeroconf.ServiceEntry)
	go func(results <-chan *zeroconf.ServiceEntry) {
		s := <-results
		c.Assert(s, IsNil)
	}(entries1)

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	c.Assert(resolver.Browse(ctx, mdnsService, mdnsDomain, entries1), IsNil)

	<-ctx.Done()
	cancel()

	go startMDNS(context.Background(), mdnsName, mdnsService, mdnsDomain)

	time.Sleep(time.Second)

	entries2 := make(chan *zeroconf.ServiceEntry)
	expectedResult := []*zeroconf.ServiceEntry{}
	go func(results <-chan *zeroconf.ServiceEntry) {
		s := <-results
		expectedResult = append(expectedResult, s)
	}(entries2)

	ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
	c.Assert(resolver.Browse(ctx, mdnsService, mdnsDomain, entries2), IsNil)

	<-ctx.Done()
	cancel()

	c.Assert(len(expectedResult), Equals, 1)
	c.Assert(expectedResult[0].Domain, Equals, mdnsDomain)
	c.Assert(expectedResult[0].Service, Equals, mdnsService)
	c.Assert(expectedResult[0].Instance, Equals, mdnsName)

but if 2nd resolve uses new resolver instance like below, it will success. Not sure if it is an issue, or it is designed like this way.

func (ts *mainSuite) TestMDNS(c *C) {
	// by default mdns is not enabled
	mdnsName := "test--xxxxxxxxxxxx"
	mdnsService := "test--xxxx.tcp"
	mdnsDomain := "local."

	resolver, err := zeroconf.NewResolver(nil)
	c.Assert(err, IsNil)

	entries1 := make(chan *zeroconf.ServiceEntry)
	go func(results <-chan *zeroconf.ServiceEntry) {
		s := <-results
		c.Assert(s, IsNil)
	}(entries1)

	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	c.Assert(resolver.Browse(ctx, mdnsService, mdnsDomain, entries1), IsNil)

	<-ctx.Done()
	cancel()

	go startMDNS(context.Background(), mdnsName, mdnsService, mdnsDomain)

	time.Sleep(time.Second)

	resolver2, err := zeroconf.NewResolver(nil)
	c.Assert(err, IsNil)
	entries2 := make(chan *zeroconf.ServiceEntry)
	expectedResult := []*zeroconf.ServiceEntry{}
	go func(results <-chan *zeroconf.ServiceEntry) {
		s := <-results
		expectedResult = append(expectedResult, s)
	}(entries2)

	ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
	c.Assert(resolver2.Browse(ctx, mdnsService, mdnsDomain, entries2), IsNil)

	<-ctx.Done()
	cancel()

	c.Assert(len(expectedResult), Equals, 1)
	c.Assert(expectedResult[0].Domain, Equals, mdnsDomain)
	c.Assert(expectedResult[0].Service, Equals, mdnsService)
	c.Assert(expectedResult[0].Instance, Equals, mdnsName)
}
@leslie-wang
Copy link
Contributor Author

Also, function startMDNS like below

func startMDNS(ctx context.Context, name, service, domain string) {
	// 5353 is default mdns port
	server, err := zeroconf.Register(name, service, domain, 5353, []string{"txtv=0", "lo=1", "la=2"}, nil)
	if err != nil {
		panic(errors.Wrap(err, "while registering mdns service"))
	}
	defer server.Shutdown()
	logrus.Infof("Published service: %s, type: %s, domain: %s", name, service, domain)

	<-ctx.Done()

	logrus.Info("Shutting down.")
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant