databuild/tests/end_to_end/delegation_test.sh
soaxelbrooke bfec05e065
Some checks are pending
/ setup (push) Waiting to run
Big change
2025-07-13 21:18:15 -07:00

135 lines
No EOL
5.5 KiB
Bash
Executable file

#!/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 <cli_build_binary> [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