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}`)