Files
CLIProxyAPI/internal/misc/antigravity_version_test.go
Yoga Sakti a834917e87 fix(antigravity): raise the fallback client version to 2.9.1 (#5175)
Cloud Code resolves newer Antigravity models only for clients reporting
at least 2.9.0; below that it answers 404 Requested entity was not found.
The offline fallback still reported 2.9.0's predecessor 2.2.1, so every
request sent before the hub manifest is first fetched — or from a
deployment that cannot reach the manifest at all — asked for models such
as gemini-3.7-flash-high with a version the backend rejects.

The hub manifest the updater already polls currently publishes 2.9.1, so
this only aligns the offline floor with what the online path resolves.
The test now asserts the floor rather than a literal, so a future
downgrade below 2.9.0 fails instead of silently reintroducing the 404.
2026-08-22 13:19:24 +07:00

154 lines
5.2 KiB
Go

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