# Makefile for Load Testing Framework
# Simplifies common load testing operations
.PHONY: help install test-dry test-small test-medium test-large test-production
.PHONY: generate-small generate-medium generate-large generate-production generate-massive
.PHONY: cleanup cleanup-all verify install-deps
# Default target
help:
@echo "MCP Gateway Load Testing Framework"
@echo "==================================="
@echo ""
@echo "Installation:"
@echo " make install-deps Install required dependencies"
@echo ""
@echo "Dry Run (no data generated):"
@echo " make test-dry-small Dry run with small profile (100 users)"
@echo " make test-dry-medium Dry run with medium profile (10K users)"
@echo " make test-dry-production Dry run with production profile (160K users)"
@echo ""
@echo "Generate Data:"
@echo " make generate-small Generate small dataset (100 users, ~8K records, <1 min)"
@echo " make generate-medium Generate medium dataset (10K users, ~1M records, <10 min)"
@echo " make generate-large Generate large dataset (50K users, ~5M records, <20 min)"
@echo " make generate-production Generate production dataset (160K users, ~156M records, <30 min)"
@echo " make generate-massive Generate massive dataset (1M users, ~1B records, <2 hours)"
@echo ""
@echo "Verification:"
@echo " make verify Verify data integrity"
@echo " make verify-verbose Verify with verbose output"
@echo ""
@echo "Cleanup:"
@echo " make cleanup Clean up test data (requires confirmation)"
@echo " make cleanup-force Clean up without confirmation (DANGEROUS)"
@echo " make cleanup-dry Show what would be cleaned up"
@echo ""
@echo "Testing:"
@echo " make test Full test cycle (generate small, verify, cleanup)"
@echo " make test-small Test small profile end-to-end"
@echo " make test-medium Test medium profile end-to-end"
@echo ""
@echo "Reports:"
@echo " make show-report Display latest generation report"
@echo " make clean-reports Remove all reports"
# Install dependencies
install-deps:
@echo "Installing load testing dependencies..."
pip install -r requirements.txt
# Python command (must run from project root)
PYTHON=cd ../.. && python
# Dry runs (no actual data generation)
test-dry-small:
@echo "Dry run: Small profile (100 users)"
$(PYTHON) -m tests.load.generate --profile small --dry-run
test-dry-medium:
@echo "Dry run: Medium profile (10K users)"
$(PYTHON) -m tests.load.generate --profile medium --dry-run
test-dry-production:
@echo "Dry run: Production profile (160K users)"
$(PYTHON) -m tests.load.generate --profile production --dry-run
# Generate data
generate-small:
@echo "Generating small dataset (100 users, ~8K records)..."
$(PYTHON) -m tests.load.generate --profile small
generate-medium:
@echo "Generating medium dataset (10K users, ~1M records)..."
$(PYTHON) -m tests.load.generate --profile medium
generate-large:
@echo "Generating large dataset (50K users, ~5M records)..."
$(PYTHON) -m tests.load.generate --profile large
generate-production:
@echo "Generating production dataset (160K users, ~156M records)..."
$(PYTHON) -m tests.load.generate --profile production
generate-massive:
@echo "Generating massive dataset (1M users, ~1B records)..."
@echo "WARNING: This will take ~2 hours and require significant disk space!"
@read -p "Continue? [y/N] " -n 1 -r; \
echo; \
if [[ $$REPLY =~ ^[Yy]$$ ]]; then \
$(PYTHON) -m tests.load.generate --profile massive; \
fi
# Verification
verify:
@echo "Verifying data integrity..."
$(PYTHON) -m tests.load.verify
verify-verbose:
@echo "Verifying data integrity (verbose)..."
$(PYTHON) -m tests.load.verify --verbose
# Cleanup
cleanup-dry:
@echo "Showing what would be cleaned up..."
$(PYTHON) -m tests.load.cleanup --all --dry-run
cleanup:
@echo "Cleaning up test data..."
$(PYTHON) -m tests.load.cleanup --all --confirm
cleanup-force:
@echo "Cleaning up test data (no confirmation)..."
@echo "This will delete all test data!"
$(PYTHON) -m tests.load.cleanup --all --confirm
# Testing workflows
test: test-small
test-small:
@echo "=== Testing Small Profile ==="
@echo "1. Generating data..."
$(PYTHON) -m tests.load.generate --profile small
@echo ""
@echo "2. Verifying integrity..."
$(PYTHON) -m tests.load.verify --profile small
@echo ""
@echo "3. Cleaning up..."
$(PYTHON) -m tests.load.cleanup --all --confirm
@echo ""
@echo "✓ Test complete!"
test-medium:
@echo "=== Testing Medium Profile ==="
@echo "WARNING: This will generate 10K users and ~1M records"
@read -p "Continue? [y/N] " -n 1 -r; \
echo; \
if [[ $$REPLY =~ ^[Yy]$$ ]]; then \
$(PYTHON) -m tests.load.generate --profile medium && \
$(PYTHON) -m tests.load.verify --profile medium && \
$(PYTHON) -m tests.load.cleanup --all --confirm && \
echo "✓ Test complete!"; \
fi
# Reports
show-report:
@echo "Latest generation report:"
@if [ -f reports/small_load_report.json ]; then \
cat reports/small_load_report.json | python -m json.tool; \
elif [ -f reports/medium_load_report.json ]; then \
cat reports/medium_load_report.json | python -m json.tool; \
elif [ -f reports/production_load_report.json ]; then \
cat reports/production_load_report.json | python -m json.tool; \
else \
echo "No reports found. Generate data first."; \
fi
clean-reports:
@echo "Removing all reports..."
rm -f reports/*.json
@echo "Reports cleaned"
# Statistics
stats:
@echo "Database statistics:"
@sqlite3 ../../mcp.db "SELECT 'Users: ' || COUNT(*) FROM email_users WHERE email LIKE '%loadtest.example.com';"
@sqlite3 ../../mcp.db "SELECT 'Teams: ' || COUNT(*) FROM email_teams WHERE owner_email LIKE '%loadtest.example.com';"
@sqlite3 ../../mcp.db "SELECT 'Tools: ' || COUNT(*) FROM tools WHERE created_by LIKE '%loadtest.example.com';"
@sqlite3 ../../mcp.db "SELECT 'Resources: ' || COUNT(*) FROM resources WHERE created_by LIKE '%loadtest.example.com';"
@sqlite3 ../../mcp.db "SELECT 'Prompts: ' || COUNT(*) FROM prompts WHERE created_by LIKE '%loadtest.example.com';"
# Database backup/restore (before large tests)
backup-db:
@echo "Backing up database..."
@if [ -f ../../mcp.db ]; then \
cp ../../mcp.db ../../mcp.db.backup.$$(date +%Y%m%d_%H%M%S); \
echo "Database backed up"; \
else \
echo "No database found"; \
fi
restore-db:
@echo "Restoring database from latest backup..."
@LATEST=$$(ls -t ../../mcp.db.backup.* 2>/dev/null | head -1); \
if [ -n "$$LATEST" ]; then \
cp "$$LATEST" ../../mcp.db; \
echo "Database restored from $$LATEST"; \
else \
echo "No backup found"; \
fi
# Quick commands
quick-test: test-dry-small
full-test: test-small