Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions apiclient.go
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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
Expand Down
44 changes: 44 additions & 0 deletions apiclient_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
13 changes: 10 additions & 3 deletions global_feature_flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand All @@ -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,
}
}
Loading