Files
google--adk-python/tests/remote/triggers/conftest.py
T
wehub-resource-sync ec2b666284
Continuous Integration / Pre-commit Linter (push) Waiting to run
Continuous Integration / Mypy Check (Python 3.10) (push) Waiting to run
Continuous Integration / Mypy Check (Python 3.11) (push) Waiting to run
Continuous Integration / Mypy Check (Python 3.12) (push) Waiting to run
Continuous Integration / Mypy Check (Python 3.13) (push) Waiting to run
Continuous Integration / Unit Tests (Python 3.10) (push) Waiting to run
Continuous Integration / Unit Tests (Python 3.11) (push) Waiting to run
Continuous Integration / Unit Tests (Python 3.12) (push) Waiting to run
Continuous Integration / Unit Tests (Python 3.13) (push) Waiting to run
Continuous Integration / Unit Tests (Python 3.14) (push) Waiting to run
Continuous Integration / A2A v0.3 Tests (Python 3.10) (push) Waiting to run
Continuous Integration / A2A v0.3 Tests (Python 3.11) (push) Waiting to run
Continuous Integration / A2A v0.3 Tests (Python 3.12) (push) Waiting to run
Continuous Integration / A2A v0.3 Tests (Python 3.13) (push) Waiting to run
Continuous Integration / A2A v0.3 Tests (Python 3.14) (push) Waiting to run
Copybara PR Handler / close-imported-pr (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:25:13 +08:00

170 lines
4.8 KiB
Python

# Copyright 2026 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Shared pytest fixtures for remote trigger integration tests.
Exposes GCP resource references by reading current Terraform state.
Environment variables:
GCP_PROJECT_ID : GCP project.
GCP_REGION : GCP region (default: ``us-central1``).
ADK_TERRAFORM_BIN : Path to terraform binary (default: ``terraform``).
ADK_TERRAFORM_CWD : Directory to run terraform from (default:
``tests/remote/terraform``).
ADK_TERRAFORM_ARGS: Extra arguments for terraform commands.
"""
from __future__ import annotations
import json
import os
import shlex
import subprocess
import time
import pytest
import requests
TERRAFORM_DIR = os.path.join(os.path.dirname(__file__), "terraform")
def _get_project_id() -> str | None:
"""Return GCP project ID from env or gcloud config."""
project = os.environ.get("GCP_PROJECT_ID")
if project:
return project
try:
result = subprocess.run(
["gcloud", "config", "get-value", "project"],
capture_output=True,
text=True,
check=False,
)
return result.stdout.strip() or None
except FileNotFoundError:
return None
def _get_identity_token(audience: str) -> str | None:
"""Fetch an identity token for the given audience via gcloud."""
try:
result = subprocess.run(
[
"gcloud",
"auth",
"print-identity-token",
f"--audiences={audience}",
],
capture_output=True,
text=True,
check=True,
)
return result.stdout.strip()
except (FileNotFoundError, subprocess.CalledProcessError):
return None
# ---------------------------------------------------------------------------
# Infrastructure Fixtures
# ---------------------------------------------------------------------------
@pytest.fixture(scope="session")
def terraform_outputs():
"""Read Terraform outputs from the current state."""
project = _get_project_id()
if not project:
pytest.skip(
"GCP_PROJECT_ID not set and no gcloud default project configured"
)
tf_bin = os.environ.get("ADK_TERRAFORM_BIN", "terraform")
tf_cwd = os.environ.get("ADK_TERRAFORM_CWD", TERRAFORM_DIR)
tf_args = shlex.split(os.environ.get("ADK_TERRAFORM_ARGS", ""))
try:
# Build the command using provided overrides
cmd = [tf_bin] + tf_args + ["output", "-json"]
result = subprocess.run(
cmd,
cwd=tf_cwd,
capture_output=True,
text=True,
check=True,
)
raw = json.loads(result.stdout)
return {k: v["value"] for k, v in raw.items()}
except (
subprocess.CalledProcessError,
FileNotFoundError,
json.JSONDecodeError,
) as e:
pytest.fail(
"Failed to read Terraform outputs. Ensure 'terraform apply' has been"
f" run successfully.\nCommand: {' '.join(cmd)}\nCWD:"
f" {tf_cwd}\nError: {e}"
)
@pytest.fixture(scope="session")
def cloud_run_url(terraform_outputs) -> str:
"""Base URL of the deployed Cloud Run service."""
return terraform_outputs["cloud_run_url"]
@pytest.fixture(scope="session")
def pubsub_topic(terraform_outputs) -> str:
"""Fully qualified Pub/Sub topic name."""
return terraform_outputs["pubsub_topic"]
@pytest.fixture(scope="session")
def pubsub_topic_short(terraform_outputs) -> str:
"""Short Pub/Sub topic name."""
return terraform_outputs["pubsub_topic_short"]
@pytest.fixture(scope="session")
def eventarc_topic(terraform_outputs) -> str:
"""Fully qualified Eventarc source topic name."""
return terraform_outputs["eventarc_topic"]
@pytest.fixture(scope="session")
def eventarc_topic_short(terraform_outputs) -> str:
"""Short Eventarc source topic name."""
return terraform_outputs["eventarc_topic_short"]
@pytest.fixture(scope="session")
def project_id(terraform_outputs) -> str:
"""GCP project ID."""
return terraform_outputs["project_id"]
@pytest.fixture(scope="session")
def auth_headers(cloud_run_url) -> dict[str, str]:
"""Authorization headers for direct HTTP calls to Cloud Run."""
try:
resp = requests.get(cloud_run_url, timeout=10)
if resp.status_code != 403:
return {}
except requests.RequestException:
pass
token = _get_identity_token(cloud_run_url)
if token:
return {"Authorization": f"Bearer {token}"}
return {}