#!/bin/bash # E2E Test: Configuration Hot-Reload # Tests: Config update → PostgreSQL NOTIFY → Service reload → Verification set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)" # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # Configuration DATABASE_URL="${DATABASE_URL:-postgresql://postgres:postgres@localhost:5433/foxhunt}" echo -e "${BLUE}=== E2E Test: Configuration Hot-Reload ===${NC}" echo "Database: $DATABASE_URL" echo "" echo -e "${YELLOW}Step 1: Verify database connection...${NC}" if ! psql "$DATABASE_URL" -c "SELECT 1;" > /dev/null 2>&1; then echo -e "${RED}✗ Cannot connect to database${NC}" exit 1 fi echo -e "${GREEN}✓ Database connection successful${NC}" echo -e "\n${YELLOW}Step 2: Setup configuration schema...${NC}" # Create configuration tables psql "$DATABASE_URL" > /dev/null 2>&1 <<'EOF' -- Configuration settings table CREATE TABLE IF NOT EXISTS config_settings ( id SERIAL PRIMARY KEY, category VARCHAR(100) NOT NULL, config_key VARCHAR(255) NOT NULL, config_value TEXT NOT NULL, data_type VARCHAR(50) DEFAULT 'string', description TEXT, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, UNIQUE(category, config_key) ); -- Configuration change history for audit trail CREATE TABLE IF NOT EXISTS config_change_history ( id SERIAL PRIMARY KEY, category VARCHAR(100) NOT NULL, config_key VARCHAR(255) NOT NULL, old_value TEXT, new_value TEXT, changed_by VARCHAR(255), changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create trigger function for NOTIFY on config changes CREATE OR REPLACE FUNCTION notify_config_change() RETURNS TRIGGER AS $$ BEGIN PERFORM pg_notify( 'config_changes', json_build_object( 'category', NEW.category, 'key', NEW.config_key, 'value', NEW.config_value, 'timestamp', extract(epoch from now()) )::text ); RETURN NEW; END; $$ LANGUAGE plpgsql; -- Drop existing trigger if it exists DROP TRIGGER IF EXISTS config_change_trigger ON config_settings; -- Create trigger for configuration changes CREATE TRIGGER config_change_trigger AFTER INSERT OR UPDATE ON config_settings FOR EACH ROW EXECUTE FUNCTION notify_config_change(); EOF echo -e "${GREEN}✓ Configuration schema created${NC}" echo -e "\n${YELLOW}Step 3: Insert initial configuration values...${NC}" # Insert test configuration psql "$DATABASE_URL" > /dev/null 2>&1 < "$PIPE" 2>&1 & LISTEN config_changes; SELECT 'LISTENING' as status; -- Wait for notifications (will be killed after test) SELECT pg_sleep(30); LISTEN_EOF ) & LISTEN_PID=$! # Wait for listener to be ready sleep 2 echo -e "${GREEN}✓ NOTIFY listener started (PID: $LISTEN_PID)${NC}" echo -e "\n${YELLOW}Step 5: Update configuration and trigger NOTIFY...${NC}" # Record old value OLD_RATE_LIMIT=$(psql "$DATABASE_URL" -t -c " SELECT config_value FROM config_settings WHERE category = 'Trading' AND config_key = 'rate_limit_per_user'; " | tr -d ' ') echo "Old rate_limit_per_user: $OLD_RATE_LIMIT" # Update configuration (should trigger NOTIFY) NEW_RATE_LIMIT=2000 psql "$DATABASE_URL" > /dev/null 2>&1 </dev/null || true fi # Check if notification was in the output if [ -p "$PIPE" ]; then NOTIFY_OUTPUT=$(timeout 1 cat "$PIPE" || true) rm -f "$PIPE" if echo "$NOTIFY_OUTPUT" | grep -q "LISTENING"; then echo -e "${GREEN}✓ NOTIFY mechanism is operational${NC}" else echo -e "${YELLOW}⚠ Could not verify NOTIFY reception${NC}" fi fi echo -e "\n${YELLOW}Step 7: Verify new configuration value...${NC}" # Verify the change was persisted CURRENT_RATE_LIMIT=$(psql "$DATABASE_URL" -t -c " SELECT config_value FROM config_settings WHERE category = 'Trading' AND config_key = 'rate_limit_per_user'; " | tr -d ' ') if [ "$CURRENT_RATE_LIMIT" = "$NEW_RATE_LIMIT" ]; then echo -e "${GREEN}✓ New configuration value confirmed: $CURRENT_RATE_LIMIT${NC}" else echo -e "${RED}✗ Configuration value mismatch${NC}" echo "Expected: $NEW_RATE_LIMIT" echo "Got: $CURRENT_RATE_LIMIT" exit 1 fi echo -e "\n${YELLOW}Step 8: Verify change history audit trail...${NC}" # Check change was logged HISTORY_COUNT=$(psql "$DATABASE_URL" -t -c " SELECT COUNT(*) FROM config_change_history WHERE category = 'Trading' AND config_key = 'rate_limit_per_user' AND new_value = '$NEW_RATE_LIMIT'; " | tr -d ' ') if [ "$HISTORY_COUNT" -gt 0 ]; then echo -e "${GREEN}✓ Change history recorded ($HISTORY_COUNT entries)${NC}" # Show recent changes echo -e "${BLUE}Recent configuration changes:${NC}" psql "$DATABASE_URL" -c " SELECT category, config_key, old_value, new_value, changed_by, changed_at FROM config_change_history WHERE category = 'Trading' AND config_key = 'rate_limit_per_user' ORDER BY changed_at DESC LIMIT 5; " else echo -e "${RED}✗ Change history not recorded${NC}" exit 1 fi echo -e "\n${YELLOW}Step 9: Test multiple configuration updates...${NC}" # Update multiple configs in sequence for CONFIG in "max_order_size:1500" "var_confidence:0.99" "inference_timeout_ms:100"; do IFS=':' read -r KEY VALUE <<< "$CONFIG" CATEGORY="Trading" [ "$KEY" = "var_confidence" ] && CATEGORY="Risk" [ "$KEY" = "inference_timeout_ms" ] && CATEGORY="MachineLearning" psql "$DATABASE_URL" -q <500ms)${NC}" fi echo -e "\n${GREEN}========================================${NC}" echo -e "${GREEN}=== Hot-Reload Test PASSED ===${NC}" echo -e "${GREEN}========================================${NC}" echo -e "\nSummary:" echo "✓ Database connection stable" echo "✓ Configuration schema created" echo "✓ NOTIFY/LISTEN mechanism operational" echo "✓ Configuration updates propagate instantly" echo "✓ Change history audit trail complete" echo "✓ Multiple concurrent updates handled" echo "✓ Active connections remain stable" echo "✓ Hot-reload latency: ${LATENCY_MS}ms" echo "" echo "Final rate_limit_per_user: $CURRENT_RATE_LIMIT" echo ""