package credhelper import ( "net/http" "net/http/httptest" "strings" "testing" ) func TestUserAgent_Format(t *testing.T) { old := cfg cfg = Config{ BinaryName: "docker-credential-test", Version: "0.0.0", Commit: "abc1234deadbeef", } t.Cleanup(func() { cfg = old }) ua := userAgent() if !strings.HasPrefix(ua, "docker-credential-test/") { t.Errorf("UA missing product prefix: %q", ua) } if !strings.Contains(ua, "commit abc1234)") { t.Errorf("UA should truncate commit to 7 chars, got %q", ua) } if strings.Contains(ua, "Go-http-client") { t.Errorf("UA leaked default Go client string: %q", ua) } } func TestHTTPClient_SetsUserAgent(t *testing.T) { old := cfg cfg = Config{ BinaryName: "docker-credential-test", Version: "0.0.0", Commit: "abc1234", } t.Cleanup(func() { cfg = old }) var got string srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { got = r.Header.Get("User-Agent") w.WriteHeader(http.StatusNoContent) })) t.Cleanup(srv.Close) resp, err := httpClient().Get(srv.URL) if err != nil { t.Fatalf("get: %v", err) } resp.Body.Close() want := userAgent() if got != want { t.Errorf("server saw User-Agent %q, want %q", got, want) } } func TestHTTPClient_RespectsExplicitUserAgent(t *testing.T) { old := cfg cfg = Config{BinaryName: "docker-credential-test"} t.Cleanup(func() { cfg = old }) var got string srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { got = r.Header.Get("User-Agent") w.WriteHeader(http.StatusNoContent) })) t.Cleanup(srv.Close) req, err := http.NewRequest("GET", srv.URL, nil) if err != nil { t.Fatalf("new request: %v", err) } req.Header.Set("User-Agent", "explicit-test/1.0") resp, err := httpClient().Do(req) if err != nil { t.Fatalf("do: %v", err) } resp.Body.Close() if got != "explicit-test/1.0" { t.Errorf("explicit UA was overwritten: got %q", got) } }