@@ -2,13 +2,57 @@ package multiprovider
2
2
3
3
import (
4
4
"testing"
5
+ "time"
5
6
6
7
"github.com/open-feature/go-sdk/openfeature"
7
8
"github.com/open-feature/go-sdk/openfeature/hooks"
8
9
"github.com/open-feature/go-sdk/openfeature/memprovider"
9
10
oft "github.com/open-feature/go-sdk/openfeature/testing"
10
11
)
11
12
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
+
12
56
func TestMultiProvider_ProvidersMethod (t * testing.T ) {
13
57
testProvider1 := oft .NewTestProvider ()
14
58
testProvider2 := oft .NewTestProvider ()
@@ -123,7 +167,7 @@ func TestMultiProvider_ProviderByNameMethod(t *testing.T) {
123
167
}
124
168
125
169
providers := mp .ProvidersByName ()
126
-
170
+
127
171
if len (providers ) != 2 {
128
172
t .Errorf ("Expected there to be '2' providers as passed but got: '%d'" , len (providers ))
129
173
}
@@ -177,31 +221,54 @@ func TestMultiProvider_MetaData(t *testing.T) {
177
221
}
178
222
}
179
223
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
+ }
205
272
206
273
func TestNewMultiProvider_ProviderUniqueNames (t * testing.T ) {
207
274
testProvider1 := memprovider .NewInMemoryProvider (map [string ]memprovider.InMemoryFlag {
0 commit comments