135 lines
No EOL
5.5 KiB
Bash
Executable file
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 |