fix: flakiness test on configuration watcher
This commit is contained in:
parent
8da38ec0a5
commit
177c4b0ed1
1 changed files with 36 additions and 33 deletions
|
@ -23,7 +23,7 @@ type mockProvider struct {
|
||||||
throttleDuration time.Duration
|
throttleDuration time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *mockProvider) Provide(configurationChan chan<- dynamic.Message, pool *safe.Pool) error {
|
func (p *mockProvider) Provide(configurationChan chan<- dynamic.Message, _ *safe.Pool) error {
|
||||||
wait := p.wait
|
wait := p.wait
|
||||||
if wait == 0 {
|
if wait == 0 {
|
||||||
wait = 20 * time.Millisecond
|
wait = 20 * time.Millisecond
|
||||||
|
@ -48,7 +48,7 @@ func (p *mockProvider) Provide(configurationChan chan<- dynamic.Message, pool *s
|
||||||
}
|
}
|
||||||
|
|
||||||
// ThrottleDuration returns the throttle duration.
|
// ThrottleDuration returns the throttle duration.
|
||||||
func (p mockProvider) ThrottleDuration() time.Duration {
|
func (p *mockProvider) ThrottleDuration() time.Duration {
|
||||||
return p.throttleDuration
|
return p.throttleDuration
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ func TestWaitForRequiredProvider(t *testing.T) {
|
||||||
|
|
||||||
config := &dynamic.Configuration{
|
config := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo")),
|
th.WithRouters(th.WithRouter("foo", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar")),
|
th.WithLoadBalancerServices(th.WithService("bar")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
@ -166,19 +166,19 @@ func TestIgnoreTransientConfiguration(t *testing.T) {
|
||||||
|
|
||||||
config := &dynamic.Configuration{
|
config := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo")),
|
th.WithRouters(th.WithRouter("foo", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar")),
|
th.WithLoadBalancerServices(th.WithService("bar")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
config2 := &dynamic.Configuration{
|
config2 := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("baz")),
|
th.WithRouters(th.WithRouter("baz", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("toto")),
|
th.WithLoadBalancerServices(th.WithService("toto")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
watcher := NewConfigurationWatcher(routinesPool, &mockProvider{}, []string{"defaultEP"}, "")
|
watcher := NewConfigurationWatcher(routinesPool, &mockProvider{}, []string{}, "")
|
||||||
|
|
||||||
publishedConfigCount := 0
|
publishedConfigCount := 0
|
||||||
var lastConfig dynamic.Configuration
|
var lastConfig dynamic.Configuration
|
||||||
|
@ -209,17 +209,20 @@ func TestIgnoreTransientConfiguration(t *testing.T) {
|
||||||
Configuration: config,
|
Configuration: config,
|
||||||
}
|
}
|
||||||
|
|
||||||
close(blockConfConsumer)
|
// give some time before closing the channel.
|
||||||
|
|
||||||
// give some time so that the configuration can be processed
|
|
||||||
time.Sleep(20 * time.Millisecond)
|
time.Sleep(20 * time.Millisecond)
|
||||||
|
|
||||||
// after 20 milliseconds we should have 1 configs published
|
close(blockConfConsumer)
|
||||||
|
|
||||||
|
// give some time so that the configuration can be processed.
|
||||||
|
time.Sleep(20 * time.Millisecond)
|
||||||
|
|
||||||
|
// after 20 milliseconds we should have 1 config published.
|
||||||
assert.Equal(t, 1, publishedConfigCount, "times configs were published")
|
assert.Equal(t, 1, publishedConfigCount, "times configs were published")
|
||||||
|
|
||||||
expected := dynamic.Configuration{
|
expected := dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo@mock", th.WithEntryPoints("defaultEP"))),
|
th.WithRouters(th.WithRouter("foo@mock", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar@mock")),
|
th.WithLoadBalancerServices(th.WithService("bar@mock")),
|
||||||
th.WithMiddlewares(),
|
th.WithMiddlewares(),
|
||||||
),
|
),
|
||||||
|
@ -256,7 +259,7 @@ func TestListenProvidersThrottleProviderConfigReload(t *testing.T) {
|
||||||
ProviderName: "mock",
|
ProviderName: "mock",
|
||||||
Configuration: &dynamic.Configuration{
|
Configuration: &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo"+strconv.Itoa(i))),
|
th.WithRouters(th.WithRouter("foo"+strconv.Itoa(i), th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar")),
|
th.WithLoadBalancerServices(th.WithService("bar")),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
@ -316,7 +319,7 @@ func TestListenProvidersSkipsSameConfigurationForProvider(t *testing.T) {
|
||||||
ProviderName: "mock",
|
ProviderName: "mock",
|
||||||
Configuration: &dynamic.Configuration{
|
Configuration: &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo")),
|
th.WithRouters(th.WithRouter("foo", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar")),
|
th.WithLoadBalancerServices(th.WithService("bar")),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
|
@ -348,14 +351,14 @@ func TestListenProvidersDoesNotSkipFlappingConfiguration(t *testing.T) {
|
||||||
|
|
||||||
configuration := &dynamic.Configuration{
|
configuration := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo")),
|
th.WithRouters(th.WithRouter("foo", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar")),
|
th.WithLoadBalancerServices(th.WithService("bar")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
transientConfiguration := &dynamic.Configuration{
|
transientConfiguration := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("bad")),
|
th.WithRouters(th.WithRouter("bad", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bad")),
|
th.WithLoadBalancerServices(th.WithService("bad")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
@ -370,7 +373,7 @@ func TestListenProvidersDoesNotSkipFlappingConfiguration(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
watcher := NewConfigurationWatcher(routinesPool, pvd, []string{"defaultEP"}, "")
|
watcher := NewConfigurationWatcher(routinesPool, pvd, []string{}, "")
|
||||||
|
|
||||||
var lastConfig dynamic.Configuration
|
var lastConfig dynamic.Configuration
|
||||||
watcher.AddListener(func(conf dynamic.Configuration) {
|
watcher.AddListener(func(conf dynamic.Configuration) {
|
||||||
|
@ -387,7 +390,7 @@ func TestListenProvidersDoesNotSkipFlappingConfiguration(t *testing.T) {
|
||||||
|
|
||||||
expected := dynamic.Configuration{
|
expected := dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo@mock", th.WithEntryPoints("defaultEP"))),
|
th.WithRouters(th.WithRouter("foo@mock", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar@mock")),
|
th.WithLoadBalancerServices(th.WithService("bar@mock")),
|
||||||
th.WithMiddlewares(),
|
th.WithMiddlewares(),
|
||||||
),
|
),
|
||||||
|
@ -416,14 +419,14 @@ func TestListenProvidersIgnoreSameConfig(t *testing.T) {
|
||||||
|
|
||||||
configuration := &dynamic.Configuration{
|
configuration := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo")),
|
th.WithRouters(th.WithRouter("foo", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar")),
|
th.WithLoadBalancerServices(th.WithService("bar")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
transientConfiguration := &dynamic.Configuration{
|
transientConfiguration := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("bad")),
|
th.WithRouters(th.WithRouter("bad", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bad")),
|
th.WithLoadBalancerServices(th.WithService("bad")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
@ -449,7 +452,7 @@ func TestListenProvidersIgnoreSameConfig(t *testing.T) {
|
||||||
err := providerAggregator.AddProvider(pvd)
|
err := providerAggregator.AddProvider(pvd)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
watcher := NewConfigurationWatcher(routinesPool, providerAggregator, []string{"defaultEP"}, "")
|
watcher := NewConfigurationWatcher(routinesPool, providerAggregator, []string{}, "")
|
||||||
|
|
||||||
var configurationReloads int
|
var configurationReloads int
|
||||||
var lastConfig dynamic.Configuration
|
var lastConfig dynamic.Configuration
|
||||||
|
@ -476,7 +479,7 @@ func TestListenProvidersIgnoreSameConfig(t *testing.T) {
|
||||||
|
|
||||||
expected := dynamic.Configuration{
|
expected := dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo@mock", th.WithEntryPoints("defaultEP"))),
|
th.WithRouters(th.WithRouter("foo@mock", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar@mock")),
|
th.WithLoadBalancerServices(th.WithService("bar@mock")),
|
||||||
th.WithMiddlewares(),
|
th.WithMiddlewares(),
|
||||||
),
|
),
|
||||||
|
@ -505,7 +508,7 @@ func TestListenProvidersIgnoreSameConfig(t *testing.T) {
|
||||||
func TestApplyConfigUnderStress(t *testing.T) {
|
func TestApplyConfigUnderStress(t *testing.T) {
|
||||||
routinesPool := safe.NewPool(context.Background())
|
routinesPool := safe.NewPool(context.Background())
|
||||||
|
|
||||||
watcher := NewConfigurationWatcher(routinesPool, &mockProvider{}, []string{"defaultEP"}, "")
|
watcher := NewConfigurationWatcher(routinesPool, &mockProvider{}, []string{}, "")
|
||||||
|
|
||||||
routinesPool.GoCtx(func(ctx context.Context) {
|
routinesPool.GoCtx(func(ctx context.Context) {
|
||||||
i := 0
|
i := 0
|
||||||
|
@ -515,7 +518,7 @@ func TestApplyConfigUnderStress(t *testing.T) {
|
||||||
return
|
return
|
||||||
case watcher.allProvidersConfigs <- dynamic.Message{ProviderName: "mock", Configuration: &dynamic.Configuration{
|
case watcher.allProvidersConfigs <- dynamic.Message{ProviderName: "mock", Configuration: &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo"+strconv.Itoa(i))),
|
th.WithRouters(th.WithRouter("foo"+strconv.Itoa(i), th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar")),
|
th.WithLoadBalancerServices(th.WithService("bar")),
|
||||||
),
|
),
|
||||||
}}:
|
}}:
|
||||||
|
@ -550,28 +553,28 @@ func TestListenProvidersIgnoreIntermediateConfigs(t *testing.T) {
|
||||||
|
|
||||||
configuration := &dynamic.Configuration{
|
configuration := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo")),
|
th.WithRouters(th.WithRouter("foo", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar")),
|
th.WithLoadBalancerServices(th.WithService("bar")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
transientConfiguration := &dynamic.Configuration{
|
transientConfiguration := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("bad")),
|
th.WithRouters(th.WithRouter("bad", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bad")),
|
th.WithLoadBalancerServices(th.WithService("bad")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
transientConfiguration2 := &dynamic.Configuration{
|
transientConfiguration2 := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("bad2")),
|
th.WithRouters(th.WithRouter("bad2", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bad2")),
|
th.WithLoadBalancerServices(th.WithService("bad2")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
finalConfiguration := &dynamic.Configuration{
|
finalConfiguration := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("final")),
|
th.WithRouters(th.WithRouter("final", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("final")),
|
th.WithLoadBalancerServices(th.WithService("final")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
@ -591,7 +594,7 @@ func TestListenProvidersIgnoreIntermediateConfigs(t *testing.T) {
|
||||||
err := providerAggregator.AddProvider(pvd)
|
err := providerAggregator.AddProvider(pvd)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
watcher := NewConfigurationWatcher(routinesPool, providerAggregator, []string{"defaultEP"}, "")
|
watcher := NewConfigurationWatcher(routinesPool, providerAggregator, []string{}, "")
|
||||||
|
|
||||||
var configurationReloads int
|
var configurationReloads int
|
||||||
var lastConfig dynamic.Configuration
|
var lastConfig dynamic.Configuration
|
||||||
|
@ -610,7 +613,7 @@ func TestListenProvidersIgnoreIntermediateConfigs(t *testing.T) {
|
||||||
|
|
||||||
expected := dynamic.Configuration{
|
expected := dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("final@mock", th.WithEntryPoints("defaultEP"))),
|
th.WithRouters(th.WithRouter("final@mock", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("final@mock")),
|
th.WithLoadBalancerServices(th.WithService("final@mock")),
|
||||||
th.WithMiddlewares(),
|
th.WithMiddlewares(),
|
||||||
),
|
),
|
||||||
|
@ -641,7 +644,7 @@ func TestListenProvidersPublishesConfigForEachProvider(t *testing.T) {
|
||||||
|
|
||||||
configuration := &dynamic.Configuration{
|
configuration := &dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(th.WithRouter("foo")),
|
th.WithRouters(th.WithRouter("foo", th.WithEntryPoints("ep"))),
|
||||||
th.WithLoadBalancerServices(th.WithService("bar")),
|
th.WithLoadBalancerServices(th.WithService("bar")),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
@ -653,7 +656,7 @@ func TestListenProvidersPublishesConfigForEachProvider(t *testing.T) {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
watcher := NewConfigurationWatcher(routinesPool, pvd, []string{"defaultEP"}, "")
|
watcher := NewConfigurationWatcher(routinesPool, pvd, []string{}, "")
|
||||||
|
|
||||||
var publishedProviderConfig dynamic.Configuration
|
var publishedProviderConfig dynamic.Configuration
|
||||||
|
|
||||||
|
@ -672,8 +675,8 @@ func TestListenProvidersPublishesConfigForEachProvider(t *testing.T) {
|
||||||
expected := dynamic.Configuration{
|
expected := dynamic.Configuration{
|
||||||
HTTP: th.BuildConfiguration(
|
HTTP: th.BuildConfiguration(
|
||||||
th.WithRouters(
|
th.WithRouters(
|
||||||
th.WithRouter("foo@mock", th.WithEntryPoints("defaultEP")),
|
th.WithRouter("foo@mock", th.WithEntryPoints("ep")),
|
||||||
th.WithRouter("foo@mock2", th.WithEntryPoints("defaultEP")),
|
th.WithRouter("foo@mock2", th.WithEntryPoints("ep")),
|
||||||
),
|
),
|
||||||
th.WithLoadBalancerServices(
|
th.WithLoadBalancerServices(
|
||||||
th.WithService("bar@mock"),
|
th.WithService("bar@mock"),
|
||||||
|
|
Loading…
Reference in a new issue