Files
foxhunt/tests/smoke_tests/README.md
jgrusewski 94cf3bc135 test: Add end-to-end smoke tests (Agent 99)
- Create comprehensive smoke test suite for post-deployment validation
- Implement 4 test categories: infrastructure, service, authentication, order flow
- Add graceful failure handling for unavailable services
- Create automated test runner script with multiple modes (fast, verbose, category)
- Document known blockers from Agent 96 (Backtesting/ML services)
- Add 30+ individual smoke tests covering critical paths
- Enable smoke-tests feature in tests/Cargo.toml
- Create detailed README with usage and troubleshooting

Test Categories:
1. Infrastructure Health: PostgreSQL, Redis, Vault, InfluxDB, Prometheus, Grafana
2. Service Health: Trading Service, API Gateway (+ blocked: Backtesting, ML)
3. Authentication Flow: JWT, sessions, revocation, rate limiting
4. Basic Order Flow: Order CRUD, positions, order history

Features:
- Configurable timeouts (5-10s per test)
- Environment variable configuration
- Graceful service unavailability handling
- Parallel and sequential execution modes
- Detailed pass/fail reporting

Usage:
  ./run_smoke_tests.sh              # Run all tests
  ./run_smoke_tests.sh --fast       # Critical tests only
  ./run_smoke_tests.sh --verbose    # Debug logging
  ./run_smoke_tests.sh --category infrastructure

Blocked Tests (marked with #[ignore]):
- Backtesting Service (config issues from Agent 96)
- ML Training Service (config issues from Agent 96)

Wave 125 Phase 3B - Deployment Excellence
2025-10-07 20:56:34 +02:00

360 lines
9.3 KiB
Markdown

# Smoke Tests - End-to-End System Validation
## Overview
Automated smoke test suite for validating complete Foxhunt HFT system functionality after deployment. These tests provide quick validation that all critical components are operational.
## Test Categories
### 1. Infrastructure Health (`infrastructure_health.rs`)
Tests core infrastructure services:
- **PostgreSQL**: Connection, schema validation, TimescaleDB extension
- **Redis**: Connection, SET/GET operations, key expiration
- **Vault**: Connectivity and health status
- **InfluxDB**: Ping endpoint and availability
- **Prometheus**: Health endpoint and metrics availability
- **Grafana**: API health check
### 2. Service Health (`service_health.rs`)
Tests gRPC microservices:
- **Trading Service**: HTTP health check, gRPC connection (port 50052)
- **API Gateway**: gRPC connection (port 50051)
- **Backtesting Service**: gRPC connection (port 50053) - BLOCKED
- **ML Training Service**: gRPC connection (port 50054) - BLOCKED
- **Service Ports**: Validates all services are listening
- **Response Times**: Measures connection latency
- **Metrics Endpoints**: Validates Prometheus exporters (ports 9091-9094)
### 3. Authentication Flow (`authentication_flow.rs`)
Tests authentication and security:
- **JWT Generation**: Token creation with claims
- **JWT Validation**: Signature verification and claim extraction
- **JWT Expiration**: Expired token rejection
- **JWT Signature**: Invalid signature detection
- **Session Storage**: Redis-based session management
- **Token Revocation**: Revocation list checking
- **Rate Limiting**: Request throttling with Redis
### 4. Basic Order Flow (`basic_order_flow.rs`)
Tests core trading operations:
- **Order Submission**: Insert orders into PostgreSQL
- **Order Query**: Retrieve order by ID
- **Order Cancellation**: Update order status to cancelled
- **Position Management**: Create and query positions
- **Order History**: Query user's order history
- **Complete Lifecycle**: Full order flow from submission to cleanup
## Usage
### Run All Smoke Tests
```bash
# Using the automated script (recommended)
./run_smoke_tests.sh
# Using Cargo directly
cargo test --test smoke_tests --features smoke-tests
```
### Run Specific Categories
```bash
# Infrastructure only
./run_smoke_tests.sh --category infrastructure
# Service health only
./run_smoke_tests.sh --category service
# Authentication only
./run_smoke_tests.sh --category authentication
# Order flow only
./run_smoke_tests.sh --category order_flow
```
### Fast Mode (Critical Tests Only)
```bash
# Run only infrastructure and service health checks
./run_smoke_tests.sh --fast
```
### Verbose Mode
```bash
# Run with debug logging
./run_smoke_tests.sh --verbose
```
## Environment Variables
All tests use environment variables with sensible defaults:
```bash
# Infrastructure
DATABASE_URL=postgresql://foxhunt:foxhunt_dev_password@localhost:5432/foxhunt
REDIS_URL=redis://localhost:6379
VAULT_ADDR=http://localhost:8200
INFLUXDB_URL=http://localhost:8086
# Services
API_GATEWAY_URL=http://localhost:50051
TRADING_SERVICE_URL=http://localhost:50052
BACKTESTING_SERVICE_URL=http://localhost:50053
ML_TRAINING_SERVICE_URL=http://localhost:50054
# Monitoring
PROMETHEUS_URL=http://localhost:9090
GRAFANA_URL=http://localhost:3000
# Authentication
JWT_SECRET=dev_secret_key_change_in_production
# Logging
RUST_LOG=info # Set to 'debug' for verbose output
```
## Known Issues and Blockers
### Blocked Tests (Agent 96 Findings)
1. **Backtesting Service** - Configuration issues prevent deployment
- Test marked with `#[ignore]` attribute
- Skips gracefully when service unavailable
2. **ML Training Service** - Configuration issues prevent deployment
- Test marked with `#[ignore]` attribute
- Skips gracefully when service unavailable
### Working Tests
- ✅ Infrastructure Health (PostgreSQL, Redis, Vault, InfluxDB, Prometheus, Grafana)
- ✅ Trading Service Health (confirmed working by Agent 96)
- ✅ API Gateway Health
- ✅ Authentication Flow (JWT, Sessions, Rate Limiting)
- ✅ Basic Order Flow (Database operations)
## Test Architecture
### Graceful Failure Handling
Tests use the `skip_if_unavailable!` macro to handle service unavailability:
```rust
skip_if_unavailable!("Service Name", {
// Test code here
result
});
```
This allows tests to:
- Pass when services are available
- Skip gracefully when services are down (connection refused, timeout)
- Fail hard for actual test failures
### Timeout Management
All tests have configurable timeouts:
- **Standard smoke tests**: 10 seconds
- **Infrastructure tests**: 5 seconds
Timeouts prevent hanging tests and provide quick feedback.
### Parallel Execution
Tests can run in parallel by default, but use `--test-threads=1` for sequential execution when debugging:
```bash
cargo test --test smoke_tests -- --test-threads=1 --nocapture
```
## Integration with CI/CD
### Docker Deployment Validation
After deploying with Docker Compose:
```bash
# 1. Start all services
docker-compose up -d
# 2. Wait for health checks
docker-compose ps
# 3. Run smoke tests
./run_smoke_tests.sh
# 4. Check exit code
if [ $? -eq 0 ]; then
echo "Deployment validated - ready for production"
else
echo "Deployment issues detected - review logs"
fi
```
### Kubernetes Deployment Validation
```bash
# 1. Deploy to cluster
kubectl apply -f k8s/
# 2. Wait for pods
kubectl wait --for=condition=ready pod -l app=foxhunt --timeout=300s
# 3. Port forward services
kubectl port-forward svc/api-gateway 50051:50051 &
kubectl port-forward svc/trading-service 50052:50051 &
# 4. Run smoke tests
./run_smoke_tests.sh
# 5. Cleanup port forwards
pkill -f "kubectl port-forward"
```
## Metrics and Reporting
### Test Pass Rate
The smoke test runner reports:
- Total categories tested
- Passed/failed counts
- Pass percentage
- Exit code (0 = success, 1 = failure)
### Sample Output
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Foxhunt HFT System - Smoke Test Suite
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Environment Configuration:
Database: postgresql://foxhunt:***@localhost:5432/foxhunt
Redis: redis://localhost:6379
Vault: http://localhost:8200
API Gateway: http://localhost:50051
Trading Service: http://localhost:50052
Log Level: info
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Testing: Infrastructure Health
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ PostgreSQL connection successful (TimescaleDB: true)
✅ Redis connection and operations successful
✅ Vault connectivity successful (status: 200)
✅ Infrastructure Health - PASSED
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Smoke Test Summary
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Total Categories: 4
Passed: 4
Failed: 0
Pass Rate: 100%
✅ All smoke tests passed!
System is ready for deployment.
```
## Future Enhancements
### Planned Test Categories (Not Implemented)
5. **Market Data Tests** (blocked by service availability)
- Subscribe to market data stream
- Receive quote updates
- Historical data queries
6. **ML Inference Tests** (blocked by service availability)
- Model prediction requests
- Feature engineering pipeline
- Inference latency validation (<100ms)
7. **Compliance Tests** (requires ML service)
- Audit log creation
- Best execution analysis
- Risk check validation
8. **Advanced Monitoring** (requires full deployment)
- Alert manager connectivity
- Custom dashboard validation
- Log aggregation checks
## Troubleshooting
### Common Issues
1. **Connection Refused**
```bash
# Check if services are running
docker-compose ps
# Restart failed services
docker-compose restart trading_service
```
2. **Database Schema Missing**
```bash
# Run migrations
cargo sqlx migrate run
```
3. **Redis Connection Failed**
```bash
# Check Redis is running
redis-cli ping
# Restart Redis
docker-compose restart redis
```
4. **JWT Secret Not Set**
```bash
# Set JWT secret
export JWT_SECRET="your-secret-key-here"
```
### Debug Mode
Run tests with full debug output:
```bash
RUST_LOG=debug ./run_smoke_tests.sh --verbose
```
This shows:
- Full test execution flow
- Connection attempts
- Query execution
- Error details
## Contributing
When adding new smoke tests:
1. Create test file in `tests/smoke_tests/`
2. Add module to `tests/smoke_tests/mod.rs`
3. Use `skip_if_unavailable!` macro for graceful failures
4. Add timeout with `with_timeout()` wrapper
5. Update this README with test documentation
6. Update `run_smoke_tests.sh` with new category
### Test Template
```rust
#[tokio::test]
async fn test_new_feature() {
let result = with_timeout(async {
// Your test code here
Ok(())
}).await;
skip_if_unavailable!("Service Name", { result });
}
```