Skip to content

Commit 2507e3c

Browse files
committed
Full tests for TrackLocalListeners()
1 parent 7b7d203 commit 2507e3c

File tree

2 files changed

+50
-14
lines changed

2 files changed

+50
-14
lines changed

catalog/services_state.go

+7-12
Original file line numberDiff line numberDiff line change
@@ -404,22 +404,17 @@ func (state *ServicesState) TrackLocalListeners(fn func() []Listener, looper dir
404404
// Add new listeners
405405
for _, listener := range discovered {
406406
state.RLock()
407-
if _, ok := state.listeners[listener.Name()]; !ok {
408-
// We fire off a goroutine to add it, which will block until we
409-
// (and anyone else) release the read lock. The only use case
410-
// where this is likely to be a problem is where we're adding
411-
// and removing listeners quickly, which is explicitly not a
412-
// good idea, anyway. Since listener name is built around
413-
// service ID, even in that scenario this should not cause
414-
// issues.
407+
_, ok := state.listeners[listener.Name()]
408+
state.RUnlock()
409+
410+
if !ok {
415411
log.Infof("Adding listener %s because it was just discovered", listener.Name())
416-
go state.AddListener(listener)
412+
state.AddListener(listener)
417413
}
418-
state.RUnlock()
419414
}
420-
421415
// Remove old ones
422-
for _, listener := range state.listeners {
416+
listeners := state.listeners
417+
for _, listener := range listeners {
423418
if listener.Managed() && !containsListener(discovered, listener.Name()) {
424419
log.Infof("Removing listener %s because the service appears to be gone", listener.Name())
425420
state.RemoveListener(listener.Name())

catalog/services_state_test.go

+43-2
Original file line numberDiff line numberDiff line change
@@ -487,8 +487,49 @@ func Test_Listeners(t *testing.T) {
487487
So(result2.Service.Hostname, ShouldEqual, hostname)
488488
})
489489

490-
Reset(func() {
491-
state = NewServicesState()
490+
Convey("GetListeners() returns all the listeners", func() {
491+
state.AddListener(listener)
492+
state.AddListener(listener2)
493+
494+
So(len(state.GetListeners()), ShouldEqual, 2)
495+
})
496+
497+
Convey("containsListener() finds a listener if present", func() {
498+
listeners := []Listener{listener, listener2}
499+
So(containsListener(listeners, "listener1"), ShouldBeTrue)
500+
})
501+
502+
Convey("Tracking dynamic listeners", func() {
503+
Convey("Adds new listeners that are discovered", func() {
504+
looper := director.NewFreeLooper(director.ONCE, nil)
505+
listeners := []Listener{listener, listener2}
506+
state.TrackLocalListeners(func() []Listener { return listeners }, looper)
507+
508+
So(len(state.listeners), ShouldEqual, 2)
509+
})
510+
511+
Convey("Removes listeners that have gone away", func() {
512+
// Add some and track them
513+
looper := director.NewFreeLooper(director.ONCE, nil)
514+
listeners := []Listener{listener, listener2}
515+
listenFunc := func() []Listener { return listeners }
516+
listener.managed = true
517+
listener2.managed = true
518+
519+
state.TrackLocalListeners(listenFunc, looper)
520+
So(len(state.listeners), ShouldEqual, 2)
521+
522+
// Discovery now returns only the first one
523+
listeners = []Listener{listener}
524+
looper = director.NewFreeLooper(director.ONCE, nil)
525+
526+
state.TrackLocalListeners(listenFunc, looper)
527+
So(len(state.listeners), ShouldEqual, 1)
528+
529+
found, ok := state.listeners[listener.Name()]
530+
So(ok, ShouldBeTrue)
531+
So(found, ShouldResemble, listener)
532+
})
492533
})
493534
})
494535
}

0 commit comments

Comments
 (0)