Files
SEEN/backend/test-cache.sh
2026-04-10 12:06:24 +02:00

384 lines
11 KiB
Bash
Executable File

#!/bin/bash
# SEEN Dragonfly Cache Integration Test
# Tests all cache operations to verify full functionality
set -e
CACHE_ADDR="localhost:6379"
echo "🔥 SEEN Dragonfly Cache Test Suite"
echo "===================================="
echo ""
# Colors for output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
success() {
echo -e "${GREEN}${NC} $1"
}
error() {
echo -e "${RED}${NC} $1"
}
info() {
echo -e "${YELLOW}${NC} $1"
}
section() {
echo -e "${BLUE}${NC} $1"
}
# Check if redis-cli is available
if ! command -v redis-cli &> /dev/null; then
error "redis-cli not found. Please install redis-tools."
exit 1
fi
# Test basic connectivity
test_connectivity() {
section "Testing Dragonfly Connectivity..."
info "PING"
if redis-cli -h localhost -p 6379 PING | grep -q "PONG"; then
success "Dragonfly is responsive"
else
error "Dragonfly is not responding"
exit 1
fi
echo ""
}
# Test basic operations
test_basic_operations() {
section "Testing Basic Cache Operations..."
# SET
info "SET test:key 'test-value'"
redis-cli -h localhost -p 6379 SET "test:key" "test-value" > /dev/null
success "SET operation successful"
# GET
info "GET test:key"
VALUE=$(redis-cli -h localhost -p 6379 GET "test:key")
if [ "$VALUE" = "test-value" ]; then
success "GET operation successful"
else
error "GET operation failed"
fi
# EXISTS
info "EXISTS test:key"
if redis-cli -h localhost -p 6379 EXISTS "test:key" | grep -q "1"; then
success "EXISTS operation successful"
else
error "EXISTS operation failed"
fi
# DEL
info "DEL test:key"
redis-cli -h localhost -p 6379 DEL "test:key" > /dev/null
success "DEL operation successful"
echo ""
}
# Test TTL operations
test_ttl_operations() {
section "Testing TTL Operations..."
# SETEX
info "SETEX test:ttl 5 'expires-soon'"
redis-cli -h localhost -p 6379 SETEX "test:ttl" 5 "expires-soon" > /dev/null
success "SETEX operation successful"
# TTL
info "TTL test:ttl"
TTL=$(redis-cli -h localhost -p 6379 TTL "test:ttl")
if [ "$TTL" -gt 0 ] && [ "$TTL" -le 5 ]; then
success "TTL operation successful (${TTL}s remaining)"
else
error "TTL operation failed"
fi
# EXPIRE
info "EXPIRE test:ttl 10"
redis-cli -h localhost -p 6379 EXPIRE "test:ttl" 10 > /dev/null
success "EXPIRE operation successful"
# Cleanup
redis-cli -h localhost -p 6379 DEL "test:ttl" > /dev/null
echo ""
}
# Test atomic operations
test_atomic_operations() {
section "Testing Atomic Operations..."
# INCR
info "INCR test:counter"
COUNT=$(redis-cli -h localhost -p 6379 INCR "test:counter")
if [ "$COUNT" = "1" ]; then
success "INCR operation successful"
else
error "INCR operation failed"
fi
# INCRBY
info "INCRBY test:counter 5"
COUNT=$(redis-cli -h localhost -p 6379 INCRBY "test:counter" 5)
if [ "$COUNT" = "6" ]; then
success "INCRBY operation successful"
else
error "INCRBY operation failed"
fi
# SETNX (lock simulation)
info "SETNX test:lock 'owner-123'"
ACQUIRED=$(redis-cli -h localhost -p 6379 SETNX "test:lock" "owner-123")
if [ "$ACQUIRED" = "1" ]; then
success "SETNX operation successful (lock acquired)"
else
error "SETNX operation failed"
fi
# Try to acquire again (should fail)
info "SETNX test:lock 'owner-456' (should fail)"
ACQUIRED=$(redis-cli -h localhost -p 6379 SETNX "test:lock" "owner-456")
if [ "$ACQUIRED" = "0" ]; then
success "SETNX correctly prevented duplicate lock"
else
error "SETNX allowed duplicate lock"
fi
# Cleanup
redis-cli -h localhost -p 6379 DEL "test:counter" "test:lock" > /dev/null
echo ""
}
# Test JSON operations
test_json_operations() {
section "Testing JSON Storage..."
# Store JSON
info "SET test:json '{\"name\":\"test\",\"value\":123}'"
redis-cli -h localhost -p 6379 SET "test:json" '{"name":"test","value":123}' > /dev/null
success "JSON storage successful"
# Retrieve JSON
info "GET test:json"
JSON=$(redis-cli -h localhost -p 6379 GET "test:json")
if echo "$JSON" | grep -q "test"; then
success "JSON retrieval successful"
else
error "JSON retrieval failed"
fi
# Cleanup
redis-cli -h localhost -p 6379 DEL "test:json" > /dev/null
echo ""
}
# Test bulk operations
test_bulk_operations() {
section "Testing Bulk Operations..."
# MSET
info "MSET test:key1 'value1' test:key2 'value2' test:key3 'value3'"
redis-cli -h localhost -p 6379 MSET "test:key1" "value1" "test:key2" "value2" "test:key3" "value3" > /dev/null
success "MSET operation successful"
# MGET
info "MGET test:key1 test:key2 test:key3"
VALUES=$(redis-cli -h localhost -p 6379 MGET "test:key1" "test:key2" "test:key3")
if echo "$VALUES" | grep -q "value1" && echo "$VALUES" | grep -q "value2" && echo "$VALUES" | grep -q "value3"; then
success "MGET operation successful"
else
error "MGET operation failed"
fi
# DEL multiple keys
info "DEL test:key1 test:key2 test:key3"
redis-cli -h localhost -p 6379 DEL "test:key1" "test:key2" "test:key3" > /dev/null
success "Bulk DEL operation successful"
echo ""
}
# Test pattern operations
test_pattern_operations() {
section "Testing Pattern Operations..."
# Create test keys
redis-cli -h localhost -p 6379 SET "seen:session:123" "data1" > /dev/null
redis-cli -h localhost -p 6379 SET "seen:session:456" "data2" > /dev/null
redis-cli -h localhost -p 6379 SET "seen:user:789" "data3" > /dev/null
# KEYS pattern
info "KEYS seen:session:*"
KEYS=$(redis-cli -h localhost -p 6379 KEYS "seen:session:*")
KEY_COUNT=$(echo "$KEYS" | wc -l)
if [ "$KEY_COUNT" -ge 2 ]; then
success "KEYS pattern matching successful (found $KEY_COUNT keys)"
else
error "KEYS pattern matching failed"
fi
# Cleanup
redis-cli -h localhost -p 6379 DEL "seen:session:123" "seen:session:456" "seen:user:789" > /dev/null
echo ""
}
# Test cache statistics
test_statistics() {
section "Testing Cache Statistics..."
# DBSIZE
info "DBSIZE"
SIZE=$(redis-cli -h localhost -p 6379 DBSIZE)
success "Database size: $SIZE keys"
# INFO memory
info "INFO memory"
MEMORY=$(redis-cli -h localhost -p 6379 INFO memory | grep "used_memory_human" | cut -d: -f2 | tr -d '\r')
success "Memory usage: $MEMORY"
# INFO stats
info "INFO stats"
TOTAL_COMMANDS=$(redis-cli -h localhost -p 6379 INFO stats | grep "total_commands_processed" | cut -d: -f2 | tr -d '\r')
success "Total commands processed: $TOTAL_COMMANDS"
echo ""
}
# Test session cache pattern
test_session_pattern() {
section "Testing Session Cache Pattern..."
# Simulate session storage
SESSION_ID="session-test-123"
SESSION_DATA='{"sessionId":"session-test-123","userId":"user-456","expiresAt":"2026-04-07T00:00:00Z"}'
info "Store session: seen:session:$SESSION_ID"
redis-cli -h localhost -p 6379 SETEX "seen:session:$SESSION_ID" 3600 "$SESSION_DATA" > /dev/null
success "Session stored with 1 hour TTL"
info "Retrieve session"
RETRIEVED=$(redis-cli -h localhost -p 6379 GET "seen:session:$SESSION_ID")
if echo "$RETRIEVED" | grep -q "user-456"; then
success "Session retrieved successfully"
else
error "Session retrieval failed"
fi
info "Check session TTL"
TTL=$(redis-cli -h localhost -p 6379 TTL "seen:session:$SESSION_ID")
if [ "$TTL" -gt 0 ]; then
success "Session TTL: ${TTL}s"
else
error "Session TTL check failed"
fi
# Cleanup
redis-cli -h localhost -p 6379 DEL "seen:session:$SESSION_ID" > /dev/null
echo ""
}
# Test download progress pattern
test_download_pattern() {
section "Testing Download Progress Pattern..."
# Simulate download progress
JOB_ID="job-test-789"
PROGRESS_DATA='{"jobId":"job-test-789","status":"downloading","progressPercent":45,"bytesDownloaded":450000000,"bytesTotal":1000000000}'
info "Store download progress: seen:download:job:$JOB_ID"
redis-cli -h localhost -p 6379 SETEX "seen:download:job:$JOB_ID" 30 "$PROGRESS_DATA" > /dev/null
success "Download progress stored with 30s TTL"
info "Retrieve download progress"
RETRIEVED=$(redis-cli -h localhost -p 6379 GET "seen:download:job:$JOB_ID")
if echo "$RETRIEVED" | grep -q "downloading"; then
success "Download progress retrieved successfully"
else
error "Download progress retrieval failed"
fi
# Cleanup
redis-cli -h localhost -p 6379 DEL "seen:download:job:$JOB_ID" > /dev/null
echo ""
}
# Test rate limiting pattern
test_rate_limit_pattern() {
section "Testing Rate Limit Pattern..."
USER_ID="user-ratelimit-test"
LIMIT_KEY="seen:ratelimit:$USER_ID:api-call"
info "Simulate API calls (limit: 5 per minute)"
for i in {1..5}; do
COUNT=$(redis-cli -h localhost -p 6379 INCR "$LIMIT_KEY")
if [ "$i" -eq 1 ]; then
redis-cli -h localhost -p 6379 EXPIRE "$LIMIT_KEY" 60 > /dev/null
fi
echo " Call $i: count=$COUNT"
done
success "Rate limit counter working"
info "Check if limit exceeded"
COUNT=$(redis-cli -h localhost -p 6379 GET "$LIMIT_KEY")
if [ "$COUNT" -eq 5 ]; then
success "Rate limit at threshold: $COUNT/5"
else
error "Rate limit count incorrect: $COUNT"
fi
# Cleanup
redis-cli -h localhost -p 6379 DEL "$LIMIT_KEY" > /dev/null
echo ""
}
# Run all tests
test_connectivity
test_basic_operations
test_ttl_operations
test_atomic_operations
test_json_operations
test_bulk_operations
test_pattern_operations
test_statistics
test_session_pattern
test_download_pattern
test_rate_limit_pattern
echo "===================================="
echo "✅ All cache tests completed!"
echo ""
echo "Summary:"
echo " - Basic operations: working"
echo " - TTL management: working"
echo " - Atomic operations: working"
echo " - JSON storage: working"
echo " - Bulk operations: working"
echo " - Pattern matching: working"
echo " - Statistics: working"
echo " - Session caching: working"
echo " - Download progress: working"
echo " - Rate limiting: working"
echo ""
echo "🔥 Dragonfly DB is fully integrated and functional!"