Skip to content

Commit cefca09

Browse files
committed
added test for MP Init method with mock providers that have Init methods
Signed-off-by: bbland1 <[email protected]>
1 parent e40040d commit cefca09

File tree

2 files changed

+94
-27
lines changed

2 files changed

+94
-27
lines changed

.release-please-manifest.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@
1616
"providers/prefab": "0.0.2",
1717
"tests/flagd": "1.4.1",
1818
"providers/go-feature-flag-in-process": "0.1.0",
19-
"providers/multi-provider": "0.0.1"
19+
"providers/multi-provider": "0.0.2"
2020
}

providers/multi-provider/pkg/providers_test.go

+93-26
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,57 @@ package multiprovider
22

33
import (
44
"testing"
5+
"time"
56

67
"github.com/open-feature/go-sdk/openfeature"
78
"github.com/open-feature/go-sdk/openfeature/hooks"
89
"github.com/open-feature/go-sdk/openfeature/memprovider"
910
oft "github.com/open-feature/go-sdk/openfeature/testing"
1011
)
1112

13+
// MockProvider utilizes openfeature's TestProvider to add testable Init & Shutdown methods to test the MultiProvider functionality
14+
type MockProvider struct {
15+
oft.TestProvider
16+
InitCount *int
17+
}
18+
19+
func (m *MockProvider) Init(evalCtx openfeature.EvaluationContext) error {
20+
*m.InitCount += 1
21+
return nil
22+
}
23+
24+
func (m *MockProvider) Shutdown() {
25+
}
26+
27+
func NewMockProvider(initCount *int) *MockProvider {
28+
return &MockProvider{
29+
TestProvider: oft.NewTestProvider(),
30+
InitCount: initCount,
31+
}
32+
}
33+
34+
// MockProviderDelay utilizes openfeature's TestProvider to add testable Init & Shutdown methods to test the MultiProvider functionality with a small delay making sure the the go routines properly wait.
35+
type MockProviderDelay struct {
36+
oft.TestProvider
37+
InitCount *int
38+
}
39+
40+
func (m *MockProviderDelay) Init(evalCtx openfeature.EvaluationContext) error {
41+
time.Sleep(1 * time.Millisecond)
42+
*m.InitCount += 1
43+
return nil
44+
}
45+
46+
func (m *MockProviderDelay) Shutdown() {
47+
}
48+
49+
func NewMockProviderDelay(initCount *int) *MockProviderDelay {
50+
return &MockProviderDelay{
51+
TestProvider: oft.NewTestProvider(),
52+
InitCount: initCount,
53+
}
54+
}
55+
1256
func TestMultiProvider_ProvidersMethod(t *testing.T) {
1357
testProvider1 := oft.NewTestProvider()
1458
testProvider2 := oft.NewTestProvider()
@@ -123,7 +167,7 @@ func TestMultiProvider_ProviderByNameMethod(t *testing.T) {
123167
}
124168

125169
providers := mp.ProvidersByName()
126-
170+
127171
if len(providers) != 2 {
128172
t.Errorf("Expected there to be '2' providers as passed but got: '%d'", len(providers))
129173
}
@@ -177,31 +221,54 @@ func TestMultiProvider_MetaData(t *testing.T) {
177221
}
178222
}
179223

180-
// func TestMultiProvider_Init(t *testing.T) {
181-
// testProvider1 := oft.NewTestProvider()
182-
// testProvider2 := oft.NewTestProvider()
183-
184-
// defaultLogger, err := hooks.NewLoggingHook(false)
185-
// if err != nil {
186-
// t.Errorf("Issue setting up logger,'%s'", err)
187-
// }
188-
189-
// mp, err := NewMultiProvider([]UniqueNameProvider{
190-
// {
191-
// Provider: testProvider1,
192-
// UniqueName: "provider1",
193-
// }, {
194-
// Provider: testProvider2,
195-
// UniqueName: "provider2",
196-
// },
197-
// }, "test", defaultLogger)
198-
199-
// if err != nil {
200-
// t.Errorf("Expected the multiprovider to successfully make an instance, '%s'", err)
201-
// }
202-
203-
// mp.Init()
204-
// }
224+
func TestMultiProvider_Init(t *testing.T) {
225+
initializations := 0
226+
227+
testProvider1 := NewMockProvider(&initializations)
228+
testProvider2 := oft.NewTestProvider()
229+
testProvider3 := NewMockProviderDelay(&initializations)
230+
231+
defaultLogger, err := hooks.NewLoggingHook(false)
232+
if err != nil {
233+
t.Errorf("Issue setting up logger,'%s'", err)
234+
}
235+
236+
mp, err := NewMultiProvider([]UniqueNameProvider{
237+
{
238+
Provider: testProvider1,
239+
UniqueName: "provider1",
240+
}, {
241+
Provider: testProvider2,
242+
UniqueName: "provider2",
243+
},{
244+
Provider: testProvider3,
245+
UniqueName: "provider3",
246+
},
247+
}, "test", defaultLogger)
248+
249+
if err != nil {
250+
t.Errorf("Expected the multiprovider to successfully make an instance, '%s'", err)
251+
}
252+
253+
attributes := map[string]interface{}{
254+
"foo": "bar",
255+
}
256+
evalCtx := openfeature.NewTargetlessEvaluationContext(attributes)
257+
258+
err = mp.Init(evalCtx)
259+
if err != nil {
260+
t.Errorf("Expected the initialization process to be successful, got error: '%s'", err)
261+
}
262+
263+
if initializations == 0 {
264+
t.Errorf("Expected there to be initializations, but none were ran.")
265+
}
266+
267+
if initializations != 2 {
268+
t.Errorf("Expected there to be '2' init steps ran, but got: '%d'.", initializations)
269+
}
270+
271+
}
205272

206273
func TestNewMultiProvider_ProviderUniqueNames(t *testing.T) {
207274
testProvider1 := memprovider.NewInMemoryProvider(map[string]memprovider.InMemoryFlag{

0 commit comments

Comments
 (0)