#!/bin/bash # End-to-end test for build delegation functionality # Tests that running the same build twice results in proper delegation on the second run set -euo pipefail CLI_BUILD="${1:-}" PARTITION_REF="${2:-}" if [[ -z "$CLI_BUILD" ]]; then echo "Usage: $0 [partition_ref]" exit 1 fi # Auto-detect partition based on binary name if not provided if [[ -z "$PARTITION_REF" ]]; then if [[ "$CLI_BUILD" == *"basic_graph"* ]]; then PARTITION_REF="generated_number/pippin" elif [[ "$CLI_BUILD" == *"podcast"* ]]; then PARTITION_REF="daily_summaries/category=comedy/date=2020-01-01" else echo "[ERROR] Could not auto-detect partition reference. Please provide one as second argument." exit 1 fi fi TEST_DB="/tmp/delegation_test.db" echo "[INFO] Testing delegation functionality..." # Clean up any existing state rm -f "$TEST_DB" /tmp/*generated_number* 2>/dev/null || true export DATABUILD_BUILD_EVENT_LOG="sqlite://$TEST_DB" echo "[INFO] Running first build (should execute all jobs)..." START_TIME=$(date +%s%N) if ! "$CLI_BUILD" "$PARTITION_REF" > /tmp/delegation_first_build.log 2>&1; then echo "[ERROR] First build failed" cat /tmp/delegation_first_build.log exit 1 fi FIRST_BUILD_TIME=$(($(date +%s%N) - START_TIME)) echo "[INFO] First build completed in $(($FIRST_BUILD_TIME / 1000000))ms" # Verify first build created events and partitions if [[ ! -f "$TEST_DB" ]]; then echo "[ERROR] Database not created after first build" exit 1 fi FIRST_BUILD_EVENTS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM build_events;" 2>/dev/null || echo "0") FIRST_JOB_EVENTS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM job_events;" 2>/dev/null || echo "0") PARTITION_AVAILABLE_COUNT=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM partition_events WHERE status = '4';" 2>/dev/null || echo "0") echo "[INFO] First build: $FIRST_BUILD_EVENTS total events, $FIRST_JOB_EVENTS job events, $PARTITION_AVAILABLE_COUNT partitions available" if [[ "$PARTITION_AVAILABLE_COUNT" -eq 0 ]]; then echo "[ERROR] No partitions marked as available after first build" sqlite3 "$TEST_DB" "SELECT partition_ref, status FROM partition_events ORDER BY rowid;" exit 1 fi echo "[INFO] Running second build (should delegate to existing partitions)..." START_TIME=$(date +%s%N) if ! "$CLI_BUILD" "$PARTITION_REF" > /tmp/delegation_second_build.log 2>&1; then echo "[ERROR] Second build failed" cat /tmp/delegation_second_build.log exit 1 fi SECOND_BUILD_TIME=$(($(date +%s%N) - START_TIME)) echo "[INFO] Second build completed in $(($SECOND_BUILD_TIME / 1000000))ms" # Verify second build was much faster (delegation working) SPEED_RATIO=$((FIRST_BUILD_TIME / SECOND_BUILD_TIME)) if [[ "$SPEED_RATIO" -lt 3 ]]; then echo "[WARNING] Second build not significantly faster than first (ratio: $SPEED_RATIO). May indicate delegation not working optimally." fi # Count events after second build SECOND_BUILD_EVENTS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM build_events;" 2>/dev/null || echo "0") SECOND_JOB_EVENTS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM job_events;" 2>/dev/null || echo "0") TOTAL_JOB_EVENTS=$((SECOND_JOB_EVENTS - FIRST_JOB_EVENTS)) echo "[INFO] Second build added: $((SECOND_BUILD_EVENTS - FIRST_BUILD_EVENTS)) total events, $TOTAL_JOB_EVENTS job events" # Verify delegation occurred by checking for JobSkipped events SKIPPED_JOBS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM job_events WHERE status = '6';" 2>/dev/null || echo "0") DELEGATION_EVENTS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM delegation_events;" 2>/dev/null || echo "0") echo "[INFO] Delegation results: $SKIPPED_JOBS jobs skipped, $DELEGATION_EVENTS delegation events" if [[ "$SKIPPED_JOBS" -eq 0 ]]; then echo "[ERROR] No jobs were skipped in second build - delegation not working" echo "[DEBUG] Job event status breakdown:" sqlite3 "$TEST_DB" "SELECT status, COUNT(*) FROM job_events GROUP BY status ORDER BY status;" 2>/dev/null || echo "Failed to query job events" exit 1 fi # Verify no duplicate partition building occurred DUPLICATE_PARTITIONS=$(sqlite3 "$TEST_DB" " SELECT partition_ref, COUNT(*) as build_count FROM partition_events WHERE status = '4' GROUP BY partition_ref HAVING build_count > 1 " 2>/dev/null || echo "") if [[ -n "$DUPLICATE_PARTITIONS" ]]; then echo "[ERROR] Partitions were built multiple times (delegation failed):" echo "$DUPLICATE_PARTITIONS" exit 1 fi # Verify the target partition was properly delegated TARGET_PARTITION_BUILDS=$(sqlite3 "$TEST_DB" " SELECT COUNT(*) FROM partition_events WHERE partition_ref = '$PARTITION_REF' AND status = '4' " 2>/dev/null || echo "0") if [[ "$TARGET_PARTITION_BUILDS" -ne 1 ]]; then echo "[ERROR] Target partition '$PARTITION_REF' was built $TARGET_PARTITION_BUILDS times instead of 1" sqlite3 "$TEST_DB" "SELECT be.build_request_id, pe.partition_ref, pe.status, be.timestamp FROM partition_events pe JOIN build_events be ON pe.event_id = be.event_id WHERE pe.partition_ref = '$PARTITION_REF' ORDER BY be.timestamp;" exit 1 fi echo "[INFO] ✅ Delegation test passed!" echo "[INFO] Summary:" echo "[INFO] - First build: $(($FIRST_BUILD_TIME / 1000000))ms, created $PARTITION_AVAILABLE_COUNT available partitions" echo "[INFO] - Second build: $(($SECOND_BUILD_TIME / 1000000))ms, delegated $SKIPPED_JOBS jobs" echo "[INFO] - Speed improvement: ${SPEED_RATIO}x faster" echo "[INFO] - No duplicate partition building detected" # Clean up rm -f "$TEST_DB" /tmp/delegation_*.log /tmp/*generated_number* 2>/dev/null || true