From 208a1fc5754b0be1337829d6280351c45b8adbae Mon Sep 17 00:00:00 2001 From: Pawel Szczodruch Date: Tue, 12 Nov 2019 16:42:28 -0800 Subject: [PATCH 1/3] fix: don't return error when there is a good projectConfig in polling manager --- examples/main.go | 25 ++++++++++++---------- pkg/config/polling_manager.go | 10 +++++++-- pkg/config/polling_manager_test.go | 33 ++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 13 deletions(-) diff --git a/examples/main.go b/examples/main.go index ae0738b5c..c7a2cad4a 100644 --- a/examples/main.go +++ b/examples/main.go @@ -14,7 +14,7 @@ import ( ) func main() { - sdkKey := "4SLpaJA1r1pgE6T2CoMs9q" + sdkKey := "4SLpaJA1r1pgE6T2CoMs9q_p" logging.SetLogLevel(logging.LogLevelDebug) user := entities.UserContext{ ID: "mike ng", @@ -33,14 +33,14 @@ func main() { if err != nil { fmt.Printf("Error instantiating client: %s", err) - return + //return } - enabled, _ := optimizelyClient.IsFeatureEnabled("mutext_feat", user) - fmt.Printf("Is feature enabled? %v\n", enabled) + //enabled, _ := optimizelyClient.IsFeatureEnabled("mutext_feat", user) + //fmt.Printf("Is feature enabled? %v\n", enabled) fmt.Println() - optimizelyClient.Close() // user can close dispatcher + //optimizelyClient.Close() // user can close dispatcher fmt.Println() /************* Client ********************/ @@ -50,13 +50,16 @@ func main() { optimizelyClient, err = optimizelyFactory.Client() - if err != nil { - fmt.Printf("Error instantiating client: %s", err) - return - } + //if err != nil { + // fmt.Printf("Error instantiating client: %s", err) + // return + //} + + //enabled, _ := optimizelyClient.IsFeatureEnabled("mutext_feat", user) + //fmt.Printf("Is feature enabled? %v\n", enabled) - enabled, _ = optimizelyClient.IsFeatureEnabled("mutext_feat", user) - fmt.Printf("Is feature enabled? %v\n", enabled) + //optimizelyClient.GetFeatureVariableBoolean("mutext_feat", "dfd", user) + optimizelyClient.Activate("dfd", user) optimizelyClient.Close() // user can close dispatcher /************* Setting Polling Interval ********************/ diff --git a/pkg/config/polling_manager.go b/pkg/config/polling_manager.go index 429a8ff5b..e0bf66524 100644 --- a/pkg/config/polling_manager.go +++ b/pkg/config/polling_manager.go @@ -94,7 +94,10 @@ func (cm *PollingProjectConfigManager) SyncConfig(datafile []byte) { if e != nil { cmLogger.Error(fmt.Sprintf("request returned with http code=%d", code), e) - cm.err = e + cm.err = nil + if cm.projectConfig == nil { + cm.err = e + } return } } @@ -103,7 +106,10 @@ func (cm *PollingProjectConfigManager) SyncConfig(datafile []byte) { cm.configLock.Lock() closeMutex := func() { - cm.err = err + cm.err = nil + if cm.projectConfig == nil { + cm.err = err + } cm.configLock.Unlock() } if err != nil { diff --git a/pkg/config/polling_manager_test.go b/pkg/config/polling_manager_test.go index 680261883..dc19f90b6 100644 --- a/pkg/config/polling_manager_test.go +++ b/pkg/config/polling_manager_test.go @@ -127,6 +127,39 @@ func TestNewPollingProjectConfigManagerWithDifferentDatafileRevisions(t *testing assert.Equal(t, projectConfig2, actual) } +func TestNewPollingProjectConfigManagerWithErrorHandling(t *testing.T) { + mockDatafile1 := []byte("NOT-VALID") + mockDatafile2 := []byte(`{"revision":"43","botFiltering":false}`) + + projectConfig1, _ := datafileprojectconfig.NewDatafileProjectConfig(mockDatafile1) + projectConfig2, _ := datafileprojectconfig.NewDatafileProjectConfig(mockDatafile2) + mockRequester := new(MockRequester) + mockRequester.On("Get", []utils.Header(nil)).Return(mockDatafile1, 200, nil) + + // Test we fetch using requester + sdkKey := "test_sdk_key" + + exeCtx := utils.NewCancelableExecutionCtx() + configManager := NewPollingProjectConfigManager(sdkKey, Requester(mockRequester)) + configManager.Start(exeCtx) + mockRequester.AssertExpectations(t) + + actual, err := configManager.GetConfig() // polling for bad file + assert.NotNil(t, err) + assert.Nil(t, actual) + assert.Nil(t, projectConfig1) + + configManager.SyncConfig(mockDatafile2) // polling for good file + actual, err = configManager.GetConfig() + assert.Nil(t, err) + assert.Equal(t, projectConfig2, actual) + + configManager.SyncConfig(mockDatafile1) // polling for bad file, error not null but good project + actual, err = configManager.GetConfig() + assert.Nil(t, err) + assert.Equal(t, projectConfig2, actual) +} + func TestNewPollingProjectConfigManagerOnDecision(t *testing.T) { mockDatafile1 := []byte(`{"revision":"42","botFiltering":true}`) mockDatafile2 := []byte(`{"revision":"43","botFiltering":false}`) From 33030e4999d136dea96210834a94b22e0d840f7a Mon Sep 17 00:00:00 2001 From: Pawel Szczodruch Date: Tue, 12 Nov 2019 16:48:11 -0800 Subject: [PATCH 2/3] revert main.go changes --- examples/main.go | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/examples/main.go b/examples/main.go index c7a2cad4a..4e0985c13 100644 --- a/examples/main.go +++ b/examples/main.go @@ -14,7 +14,7 @@ import ( ) func main() { - sdkKey := "4SLpaJA1r1pgE6T2CoMs9q_p" + sdkKey := "4SLpaJA1r1pgE6T2CoMs9q" logging.SetLogLevel(logging.LogLevelDebug) user := entities.UserContext{ ID: "mike ng", @@ -33,14 +33,15 @@ func main() { if err != nil { fmt.Printf("Error instantiating client: %s", err) - //return + return } - //enabled, _ := optimizelyClient.IsFeatureEnabled("mutext_feat", user) - //fmt.Printf("Is feature enabled? %v\n", enabled) + enabled, _ := optimizelyClient.IsFeatureEnabled("mutext_feat", user) + fmt.Printf("Is feature enabled? %v\n", enabled) + optimizelyClient.GetFeatureVariable("mutext_feat", "df", user) fmt.Println() - //optimizelyClient.Close() // user can close dispatcher + optimizelyClient.Close() // user can close dispatcher fmt.Println() /************* Client ********************/ @@ -50,16 +51,13 @@ func main() { optimizelyClient, err = optimizelyFactory.Client() - //if err != nil { - // fmt.Printf("Error instantiating client: %s", err) - // return - //} - - //enabled, _ := optimizelyClient.IsFeatureEnabled("mutext_feat", user) - //fmt.Printf("Is feature enabled? %v\n", enabled) + if err != nil { + fmt.Printf("Error instantiating client: %s", err) + return + } - //optimizelyClient.GetFeatureVariableBoolean("mutext_feat", "dfd", user) - optimizelyClient.Activate("dfd", user) + enabled, _ = optimizelyClient.IsFeatureEnabled("mutext_feat", user) + fmt.Printf("Is feature enabled? %v\n", enabled) optimizelyClient.Close() // user can close dispatcher /************* Setting Polling Interval ********************/ From 00dd1685aaa893451956e1670a534fe0bd967be7 Mon Sep 17 00:00:00 2001 From: Pawel Szczodruch Date: Tue, 12 Nov 2019 16:49:35 -0800 Subject: [PATCH 3/3] revert --- examples/main.go | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/main.go b/examples/main.go index 4e0985c13..ae0738b5c 100644 --- a/examples/main.go +++ b/examples/main.go @@ -39,7 +39,6 @@ func main() { enabled, _ := optimizelyClient.IsFeatureEnabled("mutext_feat", user) fmt.Printf("Is feature enabled? %v\n", enabled) - optimizelyClient.GetFeatureVariable("mutext_feat", "df", user) fmt.Println() optimizelyClient.Close() // user can close dispatcher fmt.Println()