359 lines
9.4 KiB
Markdown
359 lines
9.4 KiB
Markdown
# FIFO Ordering Integration Tests - Execution Plan
|
||
|
||
**Date**: 2025-01-27
|
||
**Status**: Ready for Execution
|
||
**Priority**: P0 - Critical
|
||
|
||
## Overview
|
||
|
||
Comprehensive integration and stress tests have been created to validate the FIFO policy execution ordering system. These tests verify end-to-end correctness, performance under load, and edge case handling.
|
||
|
||
## Test Suite Location
|
||
|
||
**File**: `crates/executor/tests/fifo_ordering_integration_test.rs`
|
||
|
||
## Test Coverage
|
||
|
||
### 1. Basic Integration Test: `test_fifo_ordering_with_database`
|
||
**Purpose**: Verify FIFO ordering with database persistence
|
||
**Scenario**: 10 executions, concurrency=1
|
||
**Validates**:
|
||
- Database execution creation
|
||
- Queue manager integration
|
||
- Queue stats persistence to database
|
||
- Strict FIFO ordering
|
||
- Completion notification flow
|
||
|
||
**Expected Runtime**: ~2-3 seconds
|
||
|
||
---
|
||
|
||
### 2. High Concurrency Stress Test: `test_high_concurrency_stress`
|
||
**Purpose**: Validate ordering under heavy load
|
||
**Scenario**: 1000 executions, concurrency=5
|
||
**Validates**:
|
||
- FIFO ordering maintained at scale
|
||
- Queue stats accuracy under load
|
||
- Performance characteristics (throughput)
|
||
- Memory efficiency
|
||
- Database write performance
|
||
|
||
**Expected Runtime**: ~30-60 seconds
|
||
**Expected Throughput**: >100 exec/sec
|
||
|
||
---
|
||
|
||
### 3. Multiple Workers Simulation: `test_multiple_workers_simulation`
|
||
**Purpose**: Simulate real-world worker behavior
|
||
**Scenario**: 30 executions, 3 workers with varying speeds
|
||
**Validates**:
|
||
- FIFO ordering independent of worker speed
|
||
- Worker completion rate tracking
|
||
- Load distribution across workers
|
||
- Async notification correctness
|
||
|
||
**Expected Runtime**: ~5-10 seconds
|
||
|
||
---
|
||
|
||
### 4. Cross-Action Independence: `test_cross_action_independence`
|
||
**Purpose**: Ensure actions don't interfere with each other
|
||
**Scenario**: 3 actions × 50 executions each (150 total)
|
||
**Validates**:
|
||
- Separate queues per action
|
||
- Concurrent action execution
|
||
- Independent queue statistics
|
||
- Interleaved completion handling
|
||
|
||
**Expected Runtime**: ~10-15 seconds
|
||
|
||
---
|
||
|
||
### 5. Cancellation Test: `test_cancellation_during_queue`
|
||
**Purpose**: Verify cancellation removes from queue correctly
|
||
**Scenario**: 10 queued executions, cancel 3 specific positions
|
||
**Validates**:
|
||
- Cancellation removes correct execution
|
||
- Queue length decreases appropriately
|
||
- Remaining executions proceed in order
|
||
- Cancelled tasks return errors
|
||
|
||
**Expected Runtime**: ~2-3 seconds
|
||
|
||
---
|
||
|
||
### 6. Queue Stats Persistence: `test_queue_stats_persistence`
|
||
**Purpose**: Verify database sync during execution
|
||
**Scenario**: 50 executions with periodic stats checks
|
||
**Validates**:
|
||
- Memory and database stats match
|
||
- Real-time stats updates
|
||
- Final stats accuracy
|
||
- Database write consistency
|
||
|
||
**Expected Runtime**: ~5-10 seconds
|
||
|
||
---
|
||
|
||
### 7. Queue Full Rejection: `test_queue_full_rejection`
|
||
**Purpose**: Test queue limit enforcement
|
||
**Scenario**: Fill queue to max_queue_length (10), attempt overflow
|
||
**Validates**:
|
||
- Queue full detection
|
||
- Rejection with clear error message
|
||
- Stats accuracy at capacity
|
||
- No memory overflow
|
||
|
||
**Expected Runtime**: ~2 seconds
|
||
|
||
---
|
||
|
||
### 8. Extreme Stress Test: `test_extreme_stress_10k_executions`
|
||
**Purpose**: Validate system under extreme load
|
||
**Scenario**: 10,000 executions, concurrency=10
|
||
**Validates**:
|
||
- FIFO ordering at extreme scale
|
||
- Memory stability
|
||
- Database performance
|
||
- No resource leaks
|
||
- Throughput metrics
|
||
|
||
**Expected Runtime**: ~5-10 minutes
|
||
**Note**: This is marked `#[ignore]` and should be run separately
|
||
|
||
---
|
||
|
||
## Execution Instructions
|
||
|
||
### Prerequisites
|
||
|
||
1. **Database Setup**:
|
||
```bash
|
||
# Ensure PostgreSQL is running
|
||
sudo systemctl start postgresql
|
||
|
||
# Apply latest migrations
|
||
cd attune
|
||
sqlx migrate run
|
||
```
|
||
|
||
2. **Environment Configuration**:
|
||
```bash
|
||
# Ensure config.development.yaml has correct database URL
|
||
# Or set environment variable:
|
||
export ATTUNE__DATABASE__URL="postgresql://attune:attune@localhost/attune"
|
||
```
|
||
|
||
### Running Tests
|
||
|
||
#### Run All Tests (Except Extreme Stress)
|
||
```bash
|
||
cd attune/crates/executor
|
||
cargo test --test fifo_ordering_integration_test -- --ignored --test-threads=1
|
||
```
|
||
|
||
**Important**: Use `--test-threads=1` to avoid database contention between tests.
|
||
|
||
#### Run Individual Test
|
||
```bash
|
||
# Basic integration test
|
||
cargo test --test fifo_ordering_integration_test test_fifo_ordering_with_database -- --ignored --nocapture
|
||
|
||
# High concurrency stress test
|
||
cargo test --test fifo_ordering_integration_test test_high_concurrency_stress -- --ignored --nocapture
|
||
|
||
# Multiple workers simulation
|
||
cargo test --test fifo_ordering_integration_test test_multiple_workers_simulation -- --ignored --nocapture
|
||
```
|
||
|
||
#### Run Extreme Stress Test (Separately)
|
||
```bash
|
||
# Run with verbose output to see progress
|
||
cargo test --test fifo_ordering_integration_test test_extreme_stress_10k_executions -- --ignored --nocapture --test-threads=1
|
||
```
|
||
|
||
### Expected Output
|
||
|
||
All tests should:
|
||
- ✅ Pass with `test result: ok`
|
||
- ✅ Show progress messages during execution
|
||
- ✅ Report throughput metrics (stress tests)
|
||
- ✅ Complete within expected runtime
|
||
- ✅ Clean up test data automatically
|
||
|
||
---
|
||
|
||
## Performance Benchmarks
|
||
|
||
### Target Metrics
|
||
|
||
| Metric | Target | Acceptable |
|
||
|--------|--------|------------|
|
||
| Throughput (1000 exec) | >200/sec | >100/sec |
|
||
| Throughput (10k exec) | >500/sec | >300/sec |
|
||
| Memory per queued exec | <1 KB | <5 KB |
|
||
| Queue stats DB write | <5ms | <10ms |
|
||
| Cancellation latency | <1ms | <5ms |
|
||
|
||
### Measuring Performance
|
||
|
||
```bash
|
||
# Run with timing
|
||
time cargo test --test fifo_ordering_integration_test test_high_concurrency_stress -- --ignored --nocapture
|
||
|
||
# Monitor memory usage
|
||
/usr/bin/time -v cargo test --test fifo_ordering_integration_test test_extreme_stress_10k_executions -- --ignored --nocapture
|
||
```
|
||
|
||
---
|
||
|
||
## Troubleshooting
|
||
|
||
### Test Failures
|
||
|
||
#### Database Connection Issues
|
||
```
|
||
Error: Failed to connect to database
|
||
```
|
||
**Solution**: Ensure PostgreSQL is running and connection URL is correct.
|
||
|
||
#### Queue Full Errors During Tests
|
||
```
|
||
Error: Queue full (max length: 10000)
|
||
```
|
||
**Solution**: Increase `max_queue_length` in test config or reduce concurrent spawns.
|
||
|
||
#### Timeout Errors
|
||
```
|
||
Error: Execution timed out waiting for queue slot
|
||
```
|
||
**Solution**: Increase `queue_timeout_seconds` or check for completion notification issues.
|
||
|
||
#### FIFO Order Violations
|
||
```
|
||
assertion failed: order == expected
|
||
```
|
||
**Solution**: This is a CRITICAL bug. Check:
|
||
- Notify mechanism is working
|
||
- Queue entry/exit logic
|
||
- Lock ordering
|
||
- Race conditions in queue manager
|
||
|
||
### Database Cleanup
|
||
|
||
If tests crash and leave test data:
|
||
```sql
|
||
-- Clean up test data
|
||
DELETE FROM attune.queue_stats WHERE action_id IN (
|
||
SELECT id FROM attune.action WHERE pack IN (
|
||
SELECT id FROM attune.pack WHERE ref LIKE 'fifo_test_pack_%'
|
||
)
|
||
);
|
||
|
||
DELETE FROM attune.execution WHERE action IN (
|
||
SELECT id FROM attune.action WHERE pack IN (
|
||
SELECT id FROM attune.pack WHERE ref LIKE 'fifo_test_pack_%'
|
||
)
|
||
);
|
||
|
||
DELETE FROM attune.action WHERE pack IN (
|
||
SELECT id FROM attune.pack WHERE ref LIKE 'fifo_test_pack_%'
|
||
);
|
||
|
||
DELETE FROM attune.pack WHERE ref LIKE 'fifo_test_pack_%';
|
||
```
|
||
|
||
---
|
||
|
||
## Test Maintenance
|
||
|
||
### Adding New Tests
|
||
|
||
When adding new test scenarios:
|
||
|
||
1. **Follow naming convention**: `test_<scenario_description>`
|
||
2. **Mark as `#[ignore]`**: All tests require database
|
||
3. **Use unique suffix**: Include timestamp to avoid conflicts
|
||
4. **Clean up data**: Always call `cleanup_test_data()` at end
|
||
5. **Document expectations**: Add comments explaining what's validated
|
||
|
||
### Updating Tests
|
||
|
||
When modifying queue manager behavior:
|
||
|
||
1. Review all tests for assumptions
|
||
2. Update expected values if behavior changes
|
||
3. Add new tests for new features
|
||
4. Run full suite before committing
|
||
|
||
---
|
||
|
||
## Integration with CI/CD
|
||
|
||
### GitHub Actions Workflow (Future)
|
||
|
||
```yaml
|
||
name: FIFO Integration Tests
|
||
|
||
on: [push, pull_request]
|
||
|
||
jobs:
|
||
test:
|
||
runs-on: ubuntu-latest
|
||
|
||
services:
|
||
postgres:
|
||
image: postgres:14
|
||
env:
|
||
POSTGRES_DB: attune
|
||
POSTGRES_USER: attune
|
||
POSTGRES_PASSWORD: attune
|
||
options: >-
|
||
--health-cmd pg_isready
|
||
--health-interval 10s
|
||
--health-timeout 5s
|
||
--health-retries 5
|
||
|
||
steps:
|
||
- uses: actions/checkout@v3
|
||
- name: Run migrations
|
||
run: sqlx migrate run
|
||
- name: Run integration tests
|
||
run: |
|
||
cargo test --test fifo_ordering_integration_test -- --ignored --test-threads=1
|
||
- name: Run stress test
|
||
if: github.ref == 'refs/heads/main'
|
||
run: |
|
||
cargo test --test fifo_ordering_integration_test test_high_concurrency_stress -- --ignored --nocapture
|
||
```
|
||
|
||
---
|
||
|
||
## Success Criteria
|
||
|
||
All tests must:
|
||
- ✅ Pass consistently (3+ consecutive runs)
|
||
- ✅ Maintain strict FIFO ordering
|
||
- ✅ Complete within 2x expected runtime
|
||
- ✅ Show no memory leaks (valgrind/miri)
|
||
- ✅ Clean up all test data
|
||
- ✅ Work with concurrent test runs
|
||
|
||
---
|
||
|
||
## Next Steps
|
||
|
||
1. **Run Test Suite**: Execute all tests and verify they pass
|
||
2. **Document Results**: Record actual performance metrics
|
||
3. **Fix Any Issues**: Address test failures before production
|
||
4. **Update TODO**: Mark Step 7 as complete
|
||
5. **Proceed to Step 8**: Documentation and production readiness
|
||
|
||
---
|
||
|
||
## Related Documents
|
||
|
||
- `work-summary/2025-01-policy-ordering-plan.md` - Implementation plan
|
||
- `work-summary/FIFO-ORDERING-STATUS.md` - Overall status
|
||
- `crates/executor/src/queue_manager.rs` - Queue manager implementation
|
||
- `crates/executor/tests/fifo_ordering_integration_test.rs` - Test suite |