|
|
|
@ -15,6 +15,8 @@ package discovery
|
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"context" |
|
|
|
|
"sync" |
|
|
|
|
"sync/atomic" |
|
|
|
|
"testing" |
|
|
|
|
|
|
|
|
|
"github.com/prometheus/prometheus/config" |
|
|
|
@ -83,3 +85,48 @@ func (s *mockSyncer) Sync(tgs []*config.TargetGroup) {
|
|
|
|
|
s.sync(tgs) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type mockTargetProvider struct { |
|
|
|
|
callCount *uint32 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (tp mockTargetProvider) Run(ctx context.Context, up chan<- []*config.TargetGroup) { |
|
|
|
|
atomic.AddUint32(tp.callCount, 1) |
|
|
|
|
up <- []*config.TargetGroup{{Source: "dummySource"}} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestTargetSetRunsSameTargetProviderMultipleTimes(t *testing.T) { |
|
|
|
|
|
|
|
|
|
var wg sync.WaitGroup |
|
|
|
|
|
|
|
|
|
wg.Add(2) |
|
|
|
|
|
|
|
|
|
ts1 := NewTargetSet(&mockSyncer{ |
|
|
|
|
sync: func([]*config.TargetGroup) { wg.Done() }, |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
ts2 := NewTargetSet(&mockSyncer{ |
|
|
|
|
sync: func([]*config.TargetGroup) { wg.Done() }, |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
|
|
defer cancel() |
|
|
|
|
|
|
|
|
|
tp := mockTargetProvider{} |
|
|
|
|
var callCount uint32 |
|
|
|
|
tp.callCount = &callCount |
|
|
|
|
|
|
|
|
|
targetProviders := map[string]TargetProvider{} |
|
|
|
|
targetProviders["testProvider"] = tp |
|
|
|
|
|
|
|
|
|
go ts1.Run(ctx) |
|
|
|
|
go ts2.Run(ctx) |
|
|
|
|
|
|
|
|
|
ts1.UpdateProviders(targetProviders) |
|
|
|
|
ts2.UpdateProviders(targetProviders) |
|
|
|
|
wg.Wait() |
|
|
|
|
|
|
|
|
|
if callCount != 2 { |
|
|
|
|
t.Errorf("Was expecting 2 calls received %v", callCount) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|