re-uploading work
This commit is contained in:
354
scripts/test-end-to-end-flow.sh
Executable file
354
scripts/test-end-to-end-flow.sh
Executable file
@@ -0,0 +1,354 @@
|
||||
#!/bin/bash
|
||||
# End-to-End Flow Test
|
||||
#
|
||||
# Tests the complete event lifecycle:
|
||||
# 1. Sensor generates event
|
||||
# 2. Rule matcher creates enforcement
|
||||
# 3. Executor schedules execution
|
||||
# 4. Worker executes action
|
||||
# 5. Results are recorded
|
||||
|
||||
set -e
|
||||
|
||||
# Colors for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Database connection
|
||||
DB_URL="postgresql://postgres:postgres@localhost:5432/attune"
|
||||
|
||||
# Service PIDs
|
||||
SENSOR_PID=""
|
||||
EXECUTOR_PID=""
|
||||
WORKER_PID=""
|
||||
|
||||
# Log files
|
||||
SENSOR_LOG=$(mktemp /tmp/attune-sensor-e2e.XXXXXX)
|
||||
EXECUTOR_LOG=$(mktemp /tmp/attune-executor-e2e.XXXXXX)
|
||||
WORKER_LOG=$(mktemp /tmp/attune-worker-e2e.XXXXXX)
|
||||
|
||||
echo -e "${BLUE}╔════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ Attune End-to-End Flow Test ║${NC}"
|
||||
echo -e "${BLUE}║ Sensor → Event → Enforcement → Execution ║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
|
||||
# Cleanup function
|
||||
cleanup() {
|
||||
echo ""
|
||||
echo -e "${YELLOW}Cleaning up services...${NC}"
|
||||
|
||||
if [ -n "$WORKER_PID" ]; then
|
||||
kill $WORKER_PID 2>/dev/null || true
|
||||
wait $WORKER_PID 2>/dev/null || true
|
||||
echo " Stopped worker service"
|
||||
fi
|
||||
|
||||
if [ -n "$EXECUTOR_PID" ]; then
|
||||
kill $EXECUTOR_PID 2>/dev/null || true
|
||||
wait $EXECUTOR_PID 2>/dev/null || true
|
||||
echo " Stopped executor service"
|
||||
fi
|
||||
|
||||
if [ -n "$SENSOR_PID" ]; then
|
||||
kill $SENSOR_PID 2>/dev/null || true
|
||||
wait $SENSOR_PID 2>/dev/null || true
|
||||
echo " Stopped sensor service"
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓ Cleanup complete${NC}"
|
||||
echo ""
|
||||
echo "Log files (preserved for inspection):"
|
||||
echo " Sensor: $SENSOR_LOG"
|
||||
echo " Executor: $EXECUTOR_LOG"
|
||||
echo " Worker: $WORKER_LOG"
|
||||
}
|
||||
|
||||
trap cleanup EXIT INT TERM
|
||||
|
||||
# Check prerequisites
|
||||
echo -e "${YELLOW}1. Checking prerequisites...${NC}"
|
||||
|
||||
if ! command -v psql &> /dev/null; then
|
||||
echo -e "${RED}ERROR: psql not found${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v cargo &> /dev/null; then
|
||||
echo -e "${RED}ERROR: cargo not found${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! psql "$DB_URL" -c "SELECT 1" &> /dev/null; then
|
||||
echo -e "${RED}ERROR: Cannot connect to database${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓ Prerequisites OK${NC}"
|
||||
echo ""
|
||||
|
||||
# Get initial counts
|
||||
echo -e "${YELLOW}2. Recording initial state...${NC}"
|
||||
INITIAL_EVENTS=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM event" | tr -d ' ')
|
||||
INITIAL_ENFORCEMENTS=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM enforcement" | tr -d ' ')
|
||||
INITIAL_EXECUTIONS=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM execution" | tr -d ' ')
|
||||
|
||||
echo " Events: $INITIAL_EVENTS"
|
||||
echo " Enforcements: $INITIAL_ENFORCEMENTS"
|
||||
echo " Executions: $INITIAL_EXECUTIONS"
|
||||
echo ""
|
||||
|
||||
# Verify configuration
|
||||
echo -e "${YELLOW}3. Verifying configuration...${NC}"
|
||||
|
||||
TIMER_SENSOR=$(psql "$DB_URL" -t -c "SELECT ref FROM sensor WHERE ref = 'core.interval_timer_sensor'" | tr -d ' ')
|
||||
TIMER_RULE=$(psql "$DB_URL" -t -c "SELECT ref FROM rule WHERE trigger_ref = 'core.intervaltimer' AND enabled = true LIMIT 1" | tr -d ' ')
|
||||
ECHO_ACTION=$(psql "$DB_URL" -t -c "SELECT ref FROM action WHERE ref = 'core.echo'" | tr -d ' ')
|
||||
|
||||
if [ -z "$TIMER_SENSOR" ]; then
|
||||
echo -e "${RED}ERROR: Timer sensor not found${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$TIMER_RULE" ]; then
|
||||
echo -e "${RED}ERROR: No enabled timer rules found${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$ECHO_ACTION" ]; then
|
||||
echo -e "${RED}ERROR: Echo action not found${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓ Sensor: $TIMER_SENSOR${NC}"
|
||||
echo -e "${GREEN}✓ Rule: $TIMER_RULE${NC}"
|
||||
echo -e "${GREEN}✓ Action: $ECHO_ACTION${NC}"
|
||||
echo ""
|
||||
|
||||
# Start sensor service
|
||||
echo -e "${YELLOW}4. Starting sensor service...${NC}"
|
||||
cargo build --quiet --bin attune-sensor 2>&1 > /dev/null
|
||||
cargo run --quiet --bin attune-sensor > "$SENSOR_LOG" 2>&1 &
|
||||
SENSOR_PID=$!
|
||||
echo " PID: $SENSOR_PID"
|
||||
sleep 3
|
||||
|
||||
if ! kill -0 $SENSOR_PID 2>/dev/null; then
|
||||
echo -e "${RED}ERROR: Sensor service failed to start${NC}"
|
||||
tail -30 "$SENSOR_LOG"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓ Sensor service running${NC}"
|
||||
echo ""
|
||||
|
||||
# Start executor service
|
||||
echo -e "${YELLOW}5. Starting executor service...${NC}"
|
||||
cargo build --quiet --bin attune-executor 2>&1 > /dev/null
|
||||
cargo run --quiet --bin attune-executor > "$EXECUTOR_LOG" 2>&1 &
|
||||
EXECUTOR_PID=$!
|
||||
echo " PID: $EXECUTOR_PID"
|
||||
sleep 3
|
||||
|
||||
if ! kill -0 $EXECUTOR_PID 2>/dev/null; then
|
||||
echo -e "${RED}ERROR: Executor service failed to start${NC}"
|
||||
tail -30 "$EXECUTOR_LOG"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓ Executor service running${NC}"
|
||||
echo ""
|
||||
|
||||
# Start worker service
|
||||
echo -e "${YELLOW}6. Starting worker service...${NC}"
|
||||
cargo build --quiet --bin attune-worker 2>&1 > /dev/null
|
||||
cargo run --quiet --bin attune-worker > "$WORKER_LOG" 2>&1 &
|
||||
WORKER_PID=$!
|
||||
echo " PID: $WORKER_PID"
|
||||
sleep 3
|
||||
|
||||
if ! kill -0 $WORKER_PID 2>/dev/null; then
|
||||
echo -e "${RED}ERROR: Worker service failed to start${NC}"
|
||||
tail -30 "$WORKER_LOG"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓ Worker service running${NC}"
|
||||
echo ""
|
||||
|
||||
# Monitor for events
|
||||
echo -e "${YELLOW}7. Monitoring for events (max 30 seconds)...${NC}"
|
||||
TIMEOUT=30
|
||||
ELAPSED=0
|
||||
|
||||
while [ $ELAPSED -lt $TIMEOUT ]; do
|
||||
CURRENT_EVENTS=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM event" | tr -d ' ')
|
||||
NEW_EVENTS=$((CURRENT_EVENTS - INITIAL_EVENTS))
|
||||
|
||||
if [ $NEW_EVENTS -gt 0 ]; then
|
||||
echo -e "${GREEN}✓ Generated $NEW_EVENTS new event(s)${NC}"
|
||||
break
|
||||
fi
|
||||
|
||||
echo -n "."
|
||||
sleep 1
|
||||
ELAPSED=$((ELAPSED + 1))
|
||||
done
|
||||
|
||||
echo ""
|
||||
|
||||
if [ $NEW_EVENTS -eq 0 ]; then
|
||||
echo -e "${RED}ERROR: No events generated${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Monitor for enforcements
|
||||
echo -e "${YELLOW}8. Monitoring for enforcements (max 10 seconds)...${NC}"
|
||||
TIMEOUT=10
|
||||
ELAPSED=0
|
||||
|
||||
while [ $ELAPSED -lt $TIMEOUT ]; do
|
||||
CURRENT_ENFORCEMENTS=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM enforcement" | tr -d ' ')
|
||||
NEW_ENFORCEMENTS=$((CURRENT_ENFORCEMENTS - INITIAL_ENFORCEMENTS))
|
||||
|
||||
if [ $NEW_ENFORCEMENTS -gt 0 ]; then
|
||||
echo -e "${GREEN}✓ Created $NEW_ENFORCEMENTS enforcement(s)${NC}"
|
||||
break
|
||||
fi
|
||||
|
||||
echo -n "."
|
||||
sleep 1
|
||||
ELAPSED=$((ELAPSED + 1))
|
||||
done
|
||||
|
||||
echo ""
|
||||
|
||||
if [ $NEW_ENFORCEMENTS -eq 0 ]; then
|
||||
echo -e "${RED}ERROR: No enforcements created${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Monitor for executions
|
||||
echo -e "${YELLOW}9. Monitoring for executions (max 15 seconds)...${NC}"
|
||||
TIMEOUT=15
|
||||
ELAPSED=0
|
||||
|
||||
while [ $ELAPSED -lt $TIMEOUT ]; do
|
||||
CURRENT_EXECUTIONS=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM execution" | tr -d ' ')
|
||||
NEW_EXECUTIONS=$((CURRENT_EXECUTIONS - INITIAL_EXECUTIONS))
|
||||
|
||||
if [ $NEW_EXECUTIONS -gt 0 ]; then
|
||||
echo -e "${GREEN}✓ Created $NEW_EXECUTIONS execution(s)${NC}"
|
||||
break
|
||||
fi
|
||||
|
||||
echo -n "."
|
||||
sleep 1
|
||||
ELAPSED=$((ELAPSED + 1))
|
||||
done
|
||||
|
||||
echo ""
|
||||
|
||||
if [ $NEW_EXECUTIONS -eq 0 ]; then
|
||||
echo -e "${RED}ERROR: No executions created${NC}"
|
||||
echo -e "${YELLOW}This might indicate executor service is not processing enforcements${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check for completed executions
|
||||
echo -e "${YELLOW}10. Waiting for execution completion (max 15 seconds)...${NC}"
|
||||
TIMEOUT=15
|
||||
ELAPSED=0
|
||||
COMPLETED=0
|
||||
|
||||
while [ $ELAPSED -lt $TIMEOUT ]; do
|
||||
COMPLETED=$(psql "$DB_URL" -t -c "SELECT COUNT(*) FROM execution WHERE status = 'succeeded' AND created > NOW() - INTERVAL '1 minute'" | tr -d ' ')
|
||||
|
||||
if [ $COMPLETED -gt 0 ]; then
|
||||
echo -e "${GREEN}✓ $COMPLETED execution(s) completed successfully${NC}"
|
||||
break
|
||||
fi
|
||||
|
||||
echo -n "."
|
||||
sleep 1
|
||||
ELAPSED=$((ELAPSED + 1))
|
||||
done
|
||||
|
||||
echo ""
|
||||
|
||||
# Display results
|
||||
echo -e "${BLUE}╔════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ Test Results ║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
|
||||
echo -e "${YELLOW}Recent Events:${NC}"
|
||||
psql "$DB_URL" -c "
|
||||
SELECT id, trigger_ref, LEFT(payload::text, 50) as payload_snippet, created
|
||||
FROM event
|
||||
ORDER BY created DESC
|
||||
LIMIT 3
|
||||
" 2>/dev/null
|
||||
|
||||
echo ""
|
||||
echo -e "${YELLOW}Recent Enforcements:${NC}"
|
||||
psql "$DB_URL" -c "
|
||||
SELECT id, rule_ref, status, created
|
||||
FROM enforcement
|
||||
ORDER BY created DESC
|
||||
LIMIT 3
|
||||
" 2>/dev/null
|
||||
|
||||
echo ""
|
||||
echo -e "${YELLOW}Recent Executions:${NC}"
|
||||
psql "$DB_URL" -c "
|
||||
SELECT id, action_ref, status, LEFT(result::text, 40) as result_snippet, created
|
||||
FROM execution
|
||||
ORDER BY created DESC
|
||||
LIMIT 3
|
||||
" 2>/dev/null
|
||||
|
||||
echo ""
|
||||
|
||||
# Final summary
|
||||
echo -e "${BLUE}╔════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ Summary ║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
echo " Events created: $NEW_EVENTS"
|
||||
echo " Enforcements created: $NEW_ENFORCEMENTS"
|
||||
echo " Executions created: $NEW_EXECUTIONS"
|
||||
echo " Executions completed: $COMPLETED"
|
||||
echo ""
|
||||
|
||||
# Determine overall result
|
||||
if [ $NEW_EVENTS -gt 0 ] && [ $NEW_ENFORCEMENTS -gt 0 ] && [ $NEW_EXECUTIONS -gt 0 ] && [ $COMPLETED -gt 0 ]; then
|
||||
echo -e "${GREEN}╔════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${GREEN}║ ✓ END-TO-END TEST PASSED ║${NC}"
|
||||
echo -e "${GREEN}║ ║${NC}"
|
||||
echo -e "${GREEN}║ Complete flow verified: ║${NC}"
|
||||
echo -e "${GREEN}║ Sensor → Event → Rule → Enforcement → ║${NC}"
|
||||
echo -e "${GREEN}║ Execution → Worker → Completion ║${NC}"
|
||||
echo -e "${GREEN}╚════════════════════════════════════════════════╝${NC}"
|
||||
exit 0
|
||||
elif [ $NEW_EVENTS -gt 0 ] && [ $NEW_ENFORCEMENTS -gt 0 ] && [ $NEW_EXECUTIONS -gt 0 ]; then
|
||||
echo -e "${YELLOW}╔════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${YELLOW}║ ⚠ PARTIAL SUCCESS ║${NC}"
|
||||
echo -e "${YELLOW}║ ║${NC}"
|
||||
echo -e "${YELLOW}║ Flow works up to execution creation but ║${NC}"
|
||||
echo -e "${YELLOW}║ executions haven't completed yet. ║${NC}"
|
||||
echo -e "${YELLOW}║ This may be timing - check worker logs. ║${NC}"
|
||||
echo -e "${YELLOW}╚════════════════════════════════════════════════╝${NC}"
|
||||
exit 0
|
||||
else
|
||||
echo -e "${RED}╔════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${RED}║ ✗ TEST FAILED ║${NC}"
|
||||
echo -e "${RED}║ ║${NC}"
|
||||
echo -e "${RED}║ Flow did not complete as expected. ║${NC}"
|
||||
echo -e "${RED}║ Check service logs for details. ║${NC}"
|
||||
echo -e "${RED}╚════════════════════════════════════════════════╝${NC}"
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user