diff --git a/apiclient.go b/apiclient.go index 465f009..fe64e84 100644 --- a/apiclient.go +++ b/apiclient.go @@ -123,7 +123,7 @@ func (apiclient *ApiClient) getGlobalFeatureFlags() GlobalFeatureFlags { u, err := url.Parse(apiclient.APIURL) if err != nil { - return GlobalFeatureFlags{} + return defaultGlobalFeatureFlags() } u.Path = path.Join(u.Path, "global-feature-flags") @@ -138,27 +138,27 @@ func (apiclient *ApiClient) getGlobalFeatureFlags() GlobalFeatureFlags { if err != nil { fmt.Println("Error creating request:", err) - return GlobalFeatureFlags{} + return defaultGlobalFeatureFlags() } resp, err := apiclient.Client.Do(req) if err != nil { fmt.Println("Error sending request:", err) - return GlobalFeatureFlags{} + return defaultGlobalFeatureFlags() } body, err := io.ReadAll(resp.Body) if err != nil { fmt.Println("Error reading response body:", err) - return GlobalFeatureFlags{} + return defaultGlobalFeatureFlags() } var globalFeatureFlags GlobalFeatureFlags err = json.Unmarshal(body, &globalFeatureFlags) if err != nil { fmt.Println("Error unmarshalling response body:", err) - return GlobalFeatureFlags{} + return defaultGlobalFeatureFlags() } return globalFeatureFlags diff --git a/apiclient_test.go b/apiclient_test.go index acd43a5..159b9bd 100644 --- a/apiclient_test.go +++ b/apiclient_test.go @@ -100,3 +100,47 @@ func Test_getGithubMetaDomains_ErrorAfterRetries(t *testing.T) { t.Fatalf("server called %d times, want 3", got) } } + +func Test_getGlobalFeatureFlags(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/v1/global-feature-flags" { + fmt.Fprint(w, `not json`) + return + } + fmt.Fprint(w, `{"agent_type":"agent-oss","revert_github_dns_experiment":false}`) + })) + defer server.Close() + + closedServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) + closedServer.Close() + + tests := []struct { + name string + apiURL string + want GlobalFeatureFlags + }{ + {name: "fetched flags", apiURL: server.URL + "/v1", want: GlobalFeatureFlags{AgentType: AgentTypeOSS}}, + {name: "invalid url", apiURL: "%zz", want: defaultGlobalFeatureFlags()}, + {name: "request error", apiURL: closedServer.URL, want: defaultGlobalFeatureFlags()}, + {name: "invalid response", apiURL: server.URL + "/other", want: defaultGlobalFeatureFlags()}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + apiclient := &ApiClient{Client: newTestHTTPClient(), APIURL: tt.apiURL} + + if got := apiclient.getGlobalFeatureFlags(); got != tt.want { + t.Fatalf("getGlobalFeatureFlags() = %+v, want %+v", got, tt.want) + } + }) + } +} + +func Test_GetGlobalFeatureFlags_DefaultsWhenUninitialized(t *testing.T) { + savedManager := globalManager + globalManager = nil + defer func() { globalManager = savedManager }() + + if got := GetGlobalFeatureFlags(); !got.RevertGithubDNSExperiment { + t.Fatalf("GetGlobalFeatureFlags() = %+v, want RevertGithubDNSExperiment true", got) + } +} diff --git a/global_feature_flags.go b/global_feature_flags.go index eca7ce5..b63fc44 100644 --- a/global_feature_flags.go +++ b/global_feature_flags.go @@ -36,7 +36,7 @@ func InitGlobalFeatureFlags(apiURL string, apiClient *ApiClient) { globalOnce.Do(func() { globalManager = &GlobalFeatureFlagManager{ apiURL: apiURL, - flags: GlobalFeatureFlags{}, // Default values + flags: defaultGlobalFeatureFlags(), apiClient: apiClient, } // Fetch initial flags and handle errors gracefully @@ -68,10 +68,10 @@ func RefreshGlobalFeatureFlags() error { } // GetGlobalFeatureFlags returns the current global feature flags. -// This method never returns nil. It returns a default-initialized struct if manager is not initialized. +// This method never returns nil. It returns default flags if manager is not initialized. func GetGlobalFeatureFlags() GlobalFeatureFlags { if globalManager == nil { - return GlobalFeatureFlags{} // Return default-initialized struct + return defaultGlobalFeatureFlags() } globalManager.mutex.RLock() defer globalManager.mutex.RUnlock() @@ -87,3 +87,10 @@ func IsCustomDetectionRulesEnabled() bool { flags := GetGlobalFeatureFlags() return flags.EnableCustomDetectionRules } + +// defaultGlobalFeatureFlags returns the flags used when they could not be fetched. +func defaultGlobalFeatureFlags() GlobalFeatureFlags { + return GlobalFeatureFlags{ + RevertGithubDNSExperiment: true, + } +}