package misc import ( "context" "fmt" "net/http" "net/http/httptest" "testing" "time" ) func overrideAntigravityVersionURLsForTest(t *testing.T, hubManifestURL string) func() { t.Helper() oldHubManifest := antigravityHubLatestManifestURL antigravityHubLatestManifestURL = hubManifestURL return func() { antigravityHubLatestManifestURL = oldHubManifest } } func overrideAntigravityVersionCacheForTest(t *testing.T, version string, expiry time.Time) func() { t.Helper() antigravityVersionMu.Lock() oldVersion := cachedAntigravityVersion oldExpiry := antigravityVersionExpiry cachedAntigravityVersion = version antigravityVersionExpiry = expiry antigravityVersionMu.Unlock() return func() { antigravityVersionMu.Lock() cachedAntigravityVersion = oldVersion antigravityVersionExpiry = oldExpiry antigravityVersionMu.Unlock() } } func TestAntigravityLatestVersionUsesCurrentHubFallback(t *testing.T) { restore := overrideAntigravityVersionCacheForTest(t, "", time.Time{}) defer restore() version := AntigravityLatestVersion() if version != antigravityFallbackVersion { t.Fatalf("AntigravityLatestVersion() = %q, want %q", version, antigravityFallbackVersion) } } // Cloud Code resolves newer models only for clients reporting at least 2.9.0; // older versions get 404 Requested entity was not found. func TestAntigravityFallbackVersionMeetsBackendFloor(t *testing.T) { const floorMajor, floorMinor = 2, 9 var major, minor, patch int if _, err := fmt.Sscanf(antigravityFallbackVersion, "%d.%d.%d", &major, &minor, &patch); err != nil { t.Fatalf("antigravityFallbackVersion = %q is not a dotted version: %v", antigravityFallbackVersion, err) } if major < floorMajor || (major == floorMajor && minor < floorMinor) { t.Fatalf("antigravityFallbackVersion = %q, want at least %d.%d.0", antigravityFallbackVersion, floorMajor, floorMinor) } } func TestAntigravityUserAgentUsesHubFamily(t *testing.T) { restore := overrideAntigravityVersionCacheForTest(t, "2.2.1", time.Now().Add(time.Hour)) defer restore() want := "antigravity/hub/2.2.1 darwin/arm64" if got := AntigravityUserAgent(); got != want { t.Fatalf("AntigravityUserAgent() = %q, want %q", got, want) } } func TestAntigravityVersionFromUserAgentParsesHubFamily(t *testing.T) { if got := AntigravityVersionFromUserAgent("antigravity/hub/2.2.1 darwin/arm64"); got != "2.2.1" { t.Fatalf("AntigravityVersionFromUserAgent() = %q, want %q", got, "2.2.1") } } func TestAntigravityVersionFromUserAgentParsesLegacyFamily(t *testing.T) { if got := AntigravityVersionFromUserAgent("antigravity/1.23.2 windows/amd64"); got != "1.23.2" { t.Fatalf("AntigravityVersionFromUserAgent() = %q, want %q", got, "1.23.2") } } func TestAntigravityLoadCodeAssistUserAgentUsesShortUA(t *testing.T) { restore := overrideAntigravityVersionCacheForTest(t, "2.2.1", time.Now().Add(time.Hour)) defer restore() want := "antigravity/hub/2.2.1 darwin/arm64" if got := AntigravityLoadCodeAssistUserAgent(""); got != want { t.Fatalf("AntigravityLoadCodeAssistUserAgent() = %q, want %q", got, want) } if got := AntigravityLoadCodeAssistUserAgent(want); got != want { t.Fatalf("AntigravityLoadCodeAssistUserAgent(configured) = %q, want %q", got, want) } } func TestAntigravityOnboardUserUserAgentUsesLongUA(t *testing.T) { restore := overrideAntigravityVersionCacheForTest(t, "2.2.1", time.Now().Add(time.Hour)) defer restore() want := "antigravity/hub/2.2.1 darwin/arm64 google-api-nodejs-client/10.3.0" if got := AntigravityOnboardUserUserAgent(""); got != want { t.Fatalf("AntigravityOnboardUserUserAgent() = %q, want %q", got, want) } } func TestFetchAntigravityLatestVersionUsesHubManifest(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/hub/latest-arm64-mac.yml": if got := r.Header.Get("User-Agent"); got != "electron-builder" { t.Errorf("hub manifest User-Agent = %q, want %q", got, "electron-builder") } if got := r.Header.Get("Cache-Control"); got != "no-cache" { t.Errorf("hub manifest Cache-Control = %q, want %q", got, "no-cache") } w.Header().Set("Content-Type", "application/yaml") _, _ = w.Write([]byte("version: 2.2.1\npath: Antigravity-arm64-mac.zip\n")) default: http.NotFound(w, r) } })) defer server.Close() restore := overrideAntigravityVersionURLsForTest(t, server.URL+"/hub/latest-arm64-mac.yml") defer restore() version, errFetch := fetchAntigravityLatestVersion(context.Background()) if errFetch != nil { t.Fatalf("fetchAntigravityLatestVersion() error = %v", errFetch) } if version != "2.2.1" { t.Fatalf("fetchAntigravityLatestVersion() = %q, want %q", version, "2.2.1") } } func TestFetchAntigravityLatestVersionReturnsHubManifestError(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.Error(w, "temporary outage", http.StatusInternalServerError) })) defer server.Close() restore := overrideAntigravityVersionURLsForTest(t, server.URL+"/hub/latest-arm64-mac.yml") defer restore() _, errFetch := fetchAntigravityLatestVersion(context.Background()) if errFetch == nil { t.Fatal("fetchAntigravityLatestVersion() error = nil, want error") } }