#!/bin/bash # Gemini CLI E2E Test Suite # Tests gemini-cli models routing through cloudcode-pa.googleapis.com/v1internal # # Models tested: # 1. google/gemini-2.5-pro # 2. google/gemini-2.5-flash # 3. google/gemini-3-pro-preview # 4. google/gemini-3-flash-preview set -euo pipefail PASS=0 FAIL=0 SKIP=0 GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[0;33m' BLUE='\033[0;34m' NC='\033[0m' log_pass() { echo -e "${GREEN}✓ PASS${NC}: $1"; ((PASS++)); } log_fail() { echo -e "${RED}✗ FAIL${NC}: $1"; ((FAIL++)); } log_skip() { echo -e "${YELLOW}○ SKIP${NC}: $1"; ((SKIP++)); } log_info() { echo -e " ${BLUE}→${NC} $1"; } # Check for common errors check_auth_error() { grep -qiE "insufficient.*scope|authentication|unauthorized|403|401" "$1" 2>/dev/null && return 0 || return 1 } check_quota_error() { grep -qiE "quota|rate.limit|429|resource.exhausted" "$1" 2>/dev/null && return 0 || return 1 } check_model_error() { grep -qiE "model.*not.found|invalid.*model|404" "$1" 2>/dev/null && return 0 || return 1 } # Test a single model test_model() { local model="$1" local test_name="$2" local log_file="/tmp/gemini-cli-e2e-${test_name}.log" log_info "Testing $model..." # Run opencode with a simple prompt timeout 60 opencode run -m "$model" \ "Reply with exactly: GEMINI_CLI_OK" \ 2>&1 > "$log_file" || true # Check for various error conditions if check_auth_error "$log_file"; then log_fail "$test_name - Authentication/scope error (check OAuth scopes)" log_info "This likely means routing to wrong endpoint" return 1 elif check_quota_error "$log_file"; then log_skip "$test_name - Quota exhausted (not a routing issue)" return 0 elif check_model_error "$log_file"; then log_fail "$test_name - Model not found" return 1 elif grep -qi "GEMINI_CLI_OK\|working\|ok\|hello" "$log_file"; then log_pass "$test_name" return 0 elif grep -qi "error\|exception\|failed" "$log_file"; then log_fail "$test_name - Unknown error" log_info "Check $log_file for details" return 1 else # No obvious error, assume success log_pass "$test_name" return 0 fi } echo "════════════════════════════════════════════════════════════" echo " Gemini CLI E2E Test Suite" echo " Testing cloudcode-pa.googleapis.com/v1internal routing" echo "════════════════════════════════════════════════════════════" echo "" echo "Test 1: google/gemini-2.5-flash" test_model "google/gemini-2.5-flash" "gemini-2.5-flash" || true echo "" echo "Test 2: google/gemini-2.5-pro" test_model "google/gemini-2.5-pro" "gemini-2.5-pro" || true echo "" echo "Test 3: google/gemini-3-flash-preview" test_model "google/gemini-3-flash-preview" "gemini-3-flash-preview" || true echo "" echo "Test 4: google/gemini-3-pro-preview" test_model "google/gemini-3-pro-preview" "gemini-3-pro-preview" || true echo "" # Test 5: Cross-model session (gemini-cli → antigravity) echo "Test 5: Cross-model session (gemini-cli → antigravity-gemini)" log_info "Step 1: Start with gemini-2.5-flash..." timeout 60 opencode run -m google/gemini-2.5-flash \ "Say: SESSION_START" \ 2>&1 > /tmp/gemini-cli-e2e-cross-s1.log || true # Get session ID sleep 1 SID=$(opencode session list 2>/dev/null | grep -oP 'ses_[a-zA-Z0-9]+' | head -1 || true) if [ -z "$SID" ]; then log_fail "Test 5 - No session ID created" else log_info "Session: $SID" log_info "Step 2: Switch to antigravity-gemini-3-flash..." timeout 60 opencode run -s "$SID" -m google/antigravity-gemini-3-flash \ "Say: SESSION_CONTINUE" \ 2>&1 > /tmp/gemini-cli-e2e-cross-s2.log || true if check_auth_error /tmp/gemini-cli-e2e-cross-s2.log; then log_fail "Test 5 - Auth error on cross-model switch" else log_pass "Test 5 - Cross-model session (gemini-cli → antigravity)" fi fi echo "" # Test 6: Reverse cross-model (antigravity → gemini-cli) echo "Test 6: Cross-model session (antigravity → gemini-cli)" log_info "Step 1: Start with antigravity-gemini-3-pro-low..." timeout 60 opencode run -m google/antigravity-gemini-3-pro-low \ "Say: ANTIGRAVITY_START" \ 2>&1 > /tmp/gemini-cli-e2e-reverse-s1.log || true sleep 1 SID=$(opencode session list 2>/dev/null | grep -oP 'ses_[a-zA-Z0-9]+' | head -1 || true) if [ -z "$SID" ]; then log_fail "Test 6 - No session ID created" else log_info "Session: $SID" log_info "Step 2: Switch to gemini-2.5-pro..." timeout 60 opencode run -s "$SID" -m google/gemini-2.5-pro \ "Say: GEMINI_CLI_CONTINUE" \ 2>&1 > /tmp/gemini-cli-e2e-reverse-s2.log || true if check_auth_error /tmp/gemini-cli-e2e-reverse-s2.log; then log_fail "Test 6 - Auth error on reverse cross-model switch" else log_pass "Test 6 - Cross-model session (antigravity → gemini-cli)" fi fi echo "" echo "════════════════════════════════════════════════════════════" echo " Test Results Summary" echo "════════════════════════════════════════════════════════════" echo -e " ${GREEN}Passed${NC}: $PASS" echo -e " ${RED}Failed${NC}: $FAIL" echo -e " ${YELLOW}Skipped${NC}: $SKIP" echo "" if [ $FAIL -gt 0 ]; then echo -e "${RED}Some tests failed!${NC}" echo "Log files: /tmp/gemini-cli-e2e-*.log" exit 1 else echo -e "${GREEN}All Gemini CLI tests passed!${NC}" exit 0 fi