Skip to content

Commit 7a2c8ce

Browse files
committed
address PR feedback
Signed-off-by: Roman Dmytrenko <[email protected]>
1 parent ac0a95e commit 7a2c8ce

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

openfeature/multi/multiprovider.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -220,17 +220,17 @@ func NewProvider(evaluationStrategy EvaluationStrategy, options ...Option) (*Pro
220220
}
221221

222222
if len(config.providers) == 0 {
223-
return nil, errors.New("providers cannot be nil or empty")
223+
return nil, errors.New("no providers configured: at least one provider must be registered using WithProvider()")
224224
}
225225

226226
providers := make([]NamedProvider, 0, len(config.providers))
227227
collectedHooks := make([]of.Hook, 0, len(config.providers))
228228
for i, provider := range config.providers {
229229
// Validate Providers
230230
if provider.FeatureProvider == nil {
231-
return nil, fmt.Errorf("provider at %d cannot be nil", i)
231+
return nil, fmt.Errorf("provider %s at %d cannot be nil", provider.name, i)
232232
}
233-
if provider.Name() == "" {
233+
if provider.name == "" {
234234
return nil, fmt.Errorf("provider name at %d cannot be the empty string", i)
235235
}
236236

@@ -396,11 +396,10 @@ func (p *Provider) Init(evalCtx of.EvaluationContext) error {
396396
Err: err,
397397
ProviderName: "unknown",
398398
}
399-
p.setStatus(of.ErrorState)
400-
return pErr
401399
}
402400

403-
return err
401+
p.setStatus(of.ErrorState)
402+
return pErr
404403
}
405404
close(handlers)
406405
workerCtx, shutdownFunc := context.WithCancel(context.Background())
@@ -448,8 +447,13 @@ func (p *Provider) startListening(ctx context.Context, name string, h of.EventHa
448447
for {
449448
select {
450449
case e := <-h.EventChannel():
450+
if e.EventMetadata == nil {
451+
e.EventMetadata = make(map[string]any)
452+
}
451453
e.EventMetadata[MetadataProviderName] = name
452-
e.EventMetadata[MetadataProviderType] = h.(of.FeatureProvider).Metadata().Name
454+
if p, ok := h.(of.FeatureProvider); ok {
455+
e.EventMetadata[MetadataProviderType] = p.Metadata().Name
456+
}
453457
p.inboundEvents <- namedEvent{
454458
Event: e,
455459
providerName: name,

openfeature/multi/multiprovider_test.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"regexp"
77
"testing"
8+
"time"
89

910
of "github.com/open-feature/go-sdk/openfeature"
1011
imp "github.com/open-feature/go-sdk/openfeature/memprovider"
@@ -342,7 +343,14 @@ func TestMultiProvider_StateUpdateWithSameTypeProviders(t *testing.T) {
342343
primaryProvider.EmitEvent(of.ProviderError, "fail to fetch data")
343344
secondaryProvider.EmitEvent(of.ProviderReady, "rev 1")
344345
// wait for processing
345-
<-mp.outboundEvents
346+
require.Eventually(t, func() bool {
347+
select {
348+
case <-mp.outboundEvents:
349+
return true
350+
default:
351+
return false
352+
}
353+
}, time.Second, 50*time.Millisecond, "expected event was not emitted within timeout")
346354

347355
// Check the state after the error event
348356
mp.providerStatusLock.Lock()
@@ -444,7 +452,14 @@ func TestMultiProvider_Track(t *testing.T) {
444452
errorProvider.EmitEvent(of.ProviderError, "error")
445453

446454
// wait for event processing
447-
<-mp.outboundEvents
455+
require.Eventually(t, func() bool {
456+
select {
457+
case <-mp.outboundEvents:
458+
return true
459+
default:
460+
return false
461+
}
462+
}, time.Second, 50*time.Millisecond, "expected event was not emitted within timeout")
448463

449464
trackingEventName := "page-view"
450465
details := of.TrackingEventDetails{}

0 commit comments

Comments
 (0)