From 9aad403b7f57720c80573440e22e57a08e938350 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 1 May 2026 13:54:56 +0530 Subject: [PATCH] test(e2e): run published telegram rtt as black box --- scripts/e2e/npm-telegram-rtt-docker.sh | 191 +++++++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100755 scripts/e2e/npm-telegram-rtt-docker.sh diff --git a/scripts/e2e/npm-telegram-rtt-docker.sh b/scripts/e2e/npm-telegram-rtt-docker.sh new file mode 100755 index 00000000000..57b0f5a169e --- /dev/null +++ b/scripts/e2e/npm-telegram-rtt-docker.sh @@ -0,0 +1,191 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +source "$ROOT_DIR/scripts/lib/docker-e2e-image.sh" + +IMAGE_NAME="$(docker_e2e_resolve_image "openclaw-npm-telegram-rtt-e2e" OPENCLAW_NPM_TELEGRAM_RTT_E2E_IMAGE)" +DOCKER_TARGET="${OPENCLAW_NPM_TELEGRAM_DOCKER_TARGET:-build}" +PACKAGE_SPEC="${OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC:-openclaw@beta}" +PACKAGE_TGZ="${OPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ:-${OPENCLAW_CURRENT_PACKAGE_TGZ:-}}" +PACKAGE_LABEL="${OPENCLAW_NPM_TELEGRAM_PACKAGE_LABEL:-}" +OUTPUT_DIR="${OPENCLAW_NPM_TELEGRAM_OUTPUT_DIR:-.artifacts/qa-e2e/npm-telegram-rtt}" + +validate_openclaw_package_spec() { + local spec="$1" + if [[ "$spec" =~ ^openclaw@(beta|latest|[0-9]{4}\.[1-9][0-9]*\.[1-9][0-9]*(-[1-9][0-9]*|-beta\.[1-9][0-9]*)?)$ ]]; then + return 0 + fi + echo "OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC must be openclaw@beta, openclaw@latest, or an exact OpenClaw release version; got: $spec" >&2 + exit 1 +} + +resolve_package_tgz() { + local candidate="$1" + if [ -z "$candidate" ]; then + return 0 + fi + if [ ! -f "$candidate" ]; then + echo "OPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ must point to an existing .tgz file; got: $candidate" >&2 + exit 1 + fi + case "$candidate" in + *.tgz) ;; + *) + echo "OPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ must point to a .tgz file; got: $candidate" >&2 + exit 1 + ;; + esac + local dir + local base + dir="$(cd "$(dirname "$candidate")" && pwd)" + base="$(basename "$candidate")" + printf "%s/%s" "$dir" "$base" +} + +package_mount_args=() +package_install_source="$PACKAGE_SPEC" +resolved_package_tgz="$(resolve_package_tgz "$PACKAGE_TGZ")" +if [ -n "$resolved_package_tgz" ]; then + package_install_source="/package-under-test/$(basename "$resolved_package_tgz")" + package_mount_args=(-v "$resolved_package_tgz:$package_install_source:ro") +else + validate_openclaw_package_spec "$PACKAGE_SPEC" +fi +if [ -z "$PACKAGE_LABEL" ]; then + if [ -n "$resolved_package_tgz" ]; then + PACKAGE_LABEL="$(basename "$resolved_package_tgz")" + else + PACKAGE_LABEL="$PACKAGE_SPEC" + fi +fi + +for key in \ + OPENCLAW_QA_TELEGRAM_GROUP_ID \ + OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN \ + OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN; do + if [ -z "${!key:-}" ]; then + echo "Missing required env: $key" >&2 + exit 1 + fi +done + +docker_e2e_build_or_reuse "$IMAGE_NAME" npm-telegram-rtt "$ROOT_DIR/scripts/e2e/Dockerfile" "$ROOT_DIR" "$DOCKER_TARGET" + +mkdir -p "$ROOT_DIR/.artifacts/qa-e2e" +run_log="$(mktemp "${TMPDIR:-/tmp}/openclaw-npm-telegram-rtt.XXXXXX")" +npm_prefix_host="$(mktemp -d "$ROOT_DIR/.artifacts/qa-e2e/npm-telegram-rtt-prefix.XXXXXX")" +trap 'rm -f "$run_log"; rm -rf "$npm_prefix_host"' EXIT + +docker_env=( + -e COREPACK_ENABLE_DOWNLOAD_PROMPT=0 + -e OPENCLAW_NPM_TELEGRAM_INSTALL_SOURCE="$package_install_source" + -e OPENCLAW_NPM_TELEGRAM_PACKAGE_LABEL="$PACKAGE_LABEL" + -e OPENCLAW_NPM_TELEGRAM_OUTPUT_DIR="$OUTPUT_DIR" + -e OPENCLAW_QA_TELEGRAM_GROUP_ID + -e OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN + -e OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN + -e OPENCLAW_QA_TELEGRAM_CANARY_TIMEOUT_MS="${OPENCLAW_QA_TELEGRAM_CANARY_TIMEOUT_MS:-180000}" + -e OPENCLAW_QA_TELEGRAM_SCENARIO_TIMEOUT_MS="${OPENCLAW_QA_TELEGRAM_SCENARIO_TIMEOUT_MS:-180000}" + -e OPENCLAW_NPM_TELEGRAM_SCENARIOS="${OPENCLAW_NPM_TELEGRAM_SCENARIOS:-telegram-mentioned-message-reply}" + -e OPENCLAW_NPM_TELEGRAM_PROVIDER_MODE="${OPENCLAW_NPM_TELEGRAM_PROVIDER_MODE:-mock-openai}" +) + +run_logged() { + if ! "$@" >"$run_log" 2>&1; then + cat "$run_log" + exit 1 + fi + cat "$run_log" + >"$run_log" +} + +echo "Running package Telegram RTT Docker E2E ($PACKAGE_LABEL)..." +run_logged docker run --rm \ + "${docker_env[@]}" \ + ${package_mount_args[@]+"${package_mount_args[@]}"} \ + -v "$ROOT_DIR/scripts:/app/scripts:ro" \ + -v "$ROOT_DIR/.artifacts:/app/.artifacts" \ + -v "$npm_prefix_host:/npm-global" \ + -i "$IMAGE_NAME" bash -s <<'EOF' +set -euo pipefail + +export HOME="$(mktemp -d "/tmp/openclaw-npm-telegram-rtt.XXXXXX")" +export NPM_CONFIG_PREFIX="/npm-global" +export PATH="$NPM_CONFIG_PREFIX/bin:$PATH" +export OPENAI_API_KEY="sk-openclaw-rtt" +export GATEWAY_AUTH_TOKEN_REF="openclaw-rtt" +export TELEGRAM_BOT_TOKEN="$OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN" +export OPENCLAW_DISABLE_BONJOUR="1" + +install_source="${OPENCLAW_NPM_TELEGRAM_INSTALL_SOURCE:?missing OPENCLAW_NPM_TELEGRAM_INSTALL_SOURCE}" +package_label="${OPENCLAW_NPM_TELEGRAM_PACKAGE_LABEL:-$install_source}" +mock_port="${OPENCLAW_NPM_TELEGRAM_MOCK_PORT:-44080}" +config_path="$HOME/.openclaw/openclaw.json" +gateway_log="/tmp/openclaw-npm-telegram-rtt-gateway.log" +mock_log="/tmp/openclaw-npm-telegram-rtt-mock.log" +export MOCK_PORT="$mock_port" + +dump_logs() { + local status="$1" + if [ "$status" -eq 0 ]; then + return + fi + echo "package Telegram RTT failed with exit code $status" >&2 + for file in \ + "$mock_log" \ + "$gateway_log"; do + if [ -f "$file" ]; then + echo "--- $file ---" >&2 + sed -n '1,260p' "$file" >&2 || true + fi + done +} +trap 'status=$?; kill ${gateway_pid:-} ${mock_pid:-} 2>/dev/null || true; dump_logs "$status"; exit "$status"' EXIT + +echo "Installing ${package_label} from ${install_source}..." +npm install -g "$install_source" --no-fund --no-audit +command -v openclaw +openclaw --version +installed_version="$(node -p "require('/npm-global/lib/node_modules/openclaw/package.json').version")" + +node /app/scripts/e2e/mock-openai-server.mjs >"$mock_log" 2>&1 & +mock_pid="$!" +for _ in $(seq 1 60); do + if node -e "fetch('http://127.0.0.1:${mock_port}/health').then((r)=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"; then + break + fi + sleep 1 +done + +mkdir -p "$(dirname "$config_path")" "$HOME/.openclaw/workspace" "$HOME/.openclaw/agents/main/sessions" "$HOME/workspace" + +node /app/scripts/e2e/npm-telegram-rtt-config.mjs \ + "$config_path" \ + "$mock_port" \ + "$OPENCLAW_QA_TELEGRAM_GROUP_ID" \ + "$OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN" \ + "$OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN" \ + "$installed_version" + +openclaw gateway run --verbose >"$gateway_log" 2>&1 & +gateway_pid="$!" +for _ in $(seq 1 120); do + if ! kill -0 "$gateway_pid" 2>/dev/null; then + echo "gateway exited before readiness" >&2 + exit 1 + fi + if bash -c ":/dev/null 2>&1; then + break + fi + sleep 1 +done +if ! bash -c ":/dev/null 2>&1; then + echo "gateway did not open port 18789" >&2 + exit 1 +fi + +node /app/scripts/e2e/npm-telegram-rtt-driver.mjs +EOF + +echo "package Telegram RTT Docker E2E passed ($PACKAGE_LABEL)"