Fix HTTP challenge router unexpected delayed creation
This commit is contained in:
parent
9a931e4dc9
commit
2065f4c003
4 changed files with 98 additions and 8 deletions
79
pkg/provider/aggregator/aggregator_test.go
Normal file
79
pkg/provider/aggregator/aggregator_test.go
Normal file
|
@ -0,0 +1,79 @@
|
|||
package aggregator
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"github.com/traefik/traefik/v2/pkg/config/dynamic"
|
||||
"github.com/traefik/traefik/v2/pkg/provider"
|
||||
"github.com/traefik/traefik/v2/pkg/safe"
|
||||
)
|
||||
|
||||
func TestProviderAggregator_Provide(t *testing.T) {
|
||||
aggregator := ProviderAggregator{
|
||||
internalProvider: &providerMock{"internal"},
|
||||
fileProvider: &providerMock{"file"},
|
||||
providers: []provider.Provider{
|
||||
&providerMock{"salad"},
|
||||
&providerMock{"tomato"},
|
||||
&providerMock{"onion"},
|
||||
},
|
||||
}
|
||||
|
||||
cfgCh := make(chan dynamic.Message)
|
||||
errCh := make(chan error)
|
||||
pool := safe.NewPool(context.Background())
|
||||
|
||||
t.Cleanup(pool.Stop)
|
||||
|
||||
go func() {
|
||||
errCh <- aggregator.Provide(cfgCh, pool)
|
||||
}()
|
||||
|
||||
// Make sure the file provider is always called first, followed by the internal provider.
|
||||
requireReceivedMessageFromProviders(t, cfgCh, []string{"file"})
|
||||
requireReceivedMessageFromProviders(t, cfgCh, []string{"internal"})
|
||||
|
||||
// Check if all providers have been called, the order doesn't matter.
|
||||
requireReceivedMessageFromProviders(t, cfgCh, []string{"salad", "tomato", "onion"})
|
||||
|
||||
require.NoError(t, <-errCh)
|
||||
}
|
||||
|
||||
// requireReceivedMessageFromProviders makes sure the given providers have emitted a message on the given message channel.
|
||||
// Providers order is not enforced.
|
||||
func requireReceivedMessageFromProviders(t *testing.T, cfgCh <-chan dynamic.Message, names []string) {
|
||||
t.Helper()
|
||||
|
||||
var msg dynamic.Message
|
||||
var receivedMessagesFrom []string
|
||||
|
||||
for range names {
|
||||
select {
|
||||
case <-time.After(10 * time.Millisecond):
|
||||
case msg = <-cfgCh:
|
||||
receivedMessagesFrom = append(receivedMessagesFrom, msg.ProviderName)
|
||||
}
|
||||
}
|
||||
|
||||
require.ElementsMatch(t, names, receivedMessagesFrom)
|
||||
}
|
||||
|
||||
type providerMock struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
func (p *providerMock) Init() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *providerMock) Provide(configurationChan chan<- dynamic.Message, pool *safe.Pool) error {
|
||||
configurationChan <- dynamic.Message{
|
||||
ProviderName: p.Name,
|
||||
Configuration: &dynamic.Configuration{},
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue