fix: flakiness test on configuration watcher

This commit is contained in:
Michael 2024-01-22 16:52:05 +01:00 committed by GitHub
parent 8da38ec0a5
commit 177c4b0ed1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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"),