name: Comprehensive Integration Tests on: push: branches: [ main, develop ] pull_request: branches: [ main ] schedule: # Run comprehensive tests daily at 2 AM UTC - cron: '0 2 * * *' workflow_dispatch: inputs: test_mode: description: 'Test mode to run' required: false default: 'full' type: choice options: - full - smoke - services - e2e env: CARGO_TERM_COLOR: always RUST_BACKTRACE: 1 RUST_LOG: info jobs: # Quick smoke tests - run on every commit smoke-tests: name: 🚨 Smoke Tests runs-on: ubuntu-latest timeout-minutes: 10 services: postgres: image: postgres:15 env: POSTGRES_USER: foxhunt POSTGRES_PASSWORD: foxhunt POSTGRES_DB: foxhunt_test options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 steps: - name: Checkout code uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: components: clippy, rustfmt - name: Setup Rust cache uses: Swatinem/rust-cache@v2 - name: Set up test environment run: | echo "DATABASE_URL=postgresql://foxhunt:foxhunt@localhost:5432/foxhunt_test" >> $GITHUB_ENV echo "TEST_DATABASE_URL=postgresql://foxhunt:foxhunt@localhost:5432/foxhunt_test" >> $GITHUB_ENV - name: Run database migrations run: | cargo install sqlx-cli --no-default-features --features postgres sqlx database create sqlx migrate run - name: Run smoke tests run: cargo test --test run_comprehensive_tests smoke --verbose timeout-minutes: 5 - name: Upload smoke test results if: always() uses: actions/upload-artifact@v4 with: name: smoke-test-results path: target/debug/test-results/ # Service integration tests - run on PR and main branch service-integration-tests: name: 🔧 Service Integration Tests runs-on: ubuntu-latest timeout-minutes: 30 if: github.event_name == 'pull_request' || github.ref == 'refs/heads/main' services: postgres: image: postgres:15 env: POSTGRES_USER: foxhunt POSTGRES_PASSWORD: foxhunt POSTGRES_DB: foxhunt_test options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 steps: - name: Checkout code uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: components: clippy, rustfmt - name: Setup Rust cache uses: Swatinem/rust-cache@v2 - name: Set up test environment run: | echo "DATABASE_URL=postgresql://foxhunt:foxhunt@localhost:5432/foxhunt_test" >> $GITHUB_ENV echo "TEST_DATABASE_URL=postgresql://foxhunt:foxhunt@localhost:5432/foxhunt_test" >> $GITHUB_ENV - name: Run database migrations run: | cargo install sqlx-cli --no-default-features --features postgres sqlx database create sqlx migrate run - name: Build all services run: cargo build --workspace --verbose - name: Run service integration tests run: cargo test --test run_comprehensive_tests services --verbose timeout-minutes: 25 - name: Upload service test results if: always() uses: actions/upload-artifact@v4 with: name: service-test-results path: target/debug/test-results/ # Comprehensive tests - run on schedule and manual trigger comprehensive-tests: name: 🎯 Comprehensive Integration Tests runs-on: ubuntu-latest timeout-minutes: 60 if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' services: postgres: image: postgres:15 env: POSTGRES_USER: foxhunt POSTGRES_PASSWORD: foxhunt POSTGRES_DB: foxhunt_test options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 redis: image: redis:7 options: >- --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 6379:6379 steps: - name: Checkout code uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: components: clippy, rustfmt - name: Setup Rust cache uses: Swatinem/rust-cache@v2 - name: Set up test environment run: | echo "DATABASE_URL=postgresql://foxhunt:foxhunt@localhost:5432/foxhunt_test" >> $GITHUB_ENV echo "TEST_DATABASE_URL=postgresql://foxhunt:foxhunt@localhost:5432/foxhunt_test" >> $GITHUB_ENV echo "REDIS_URL=redis://localhost:6379" >> $GITHUB_ENV echo "TEST_TIMEOUT=3600" >> $GITHUB_ENV - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y postgresql-client - name: Run database migrations run: | cargo install sqlx-cli --no-default-features --features postgres sqlx database create sqlx migrate run - name: Populate test data run: | # Add test data population scripts here echo "Populating test data..." - name: Build all services in release mode run: cargo build --workspace --release --verbose - name: Run comprehensive integration tests run: | TEST_MODE="${{ github.event.inputs.test_mode || 'full' }}" cargo test --test run_comprehensive_tests $TEST_MODE --verbose --release timeout-minutes: 50 - name: Generate test report if: always() run: | echo "# Comprehensive Integration Test Report" > test-report.md echo "Date: $(date)" >> test-report.md echo "Commit: ${{ github.sha }}" >> test-report.md echo "Branch: ${{ github.ref_name }}" >> test-report.md echo "" >> test-report.md if [ -f target/debug/test-results/summary.json ]; then echo "## Test Summary" >> test-report.md cat target/debug/test-results/summary.json >> test-report.md fi - name: Upload comprehensive test results if: always() uses: actions/upload-artifact@v4 with: name: comprehensive-test-results path: | target/debug/test-results/ test-report.md - name: Comment PR with results if: github.event_name == 'pull_request' && always() uses: actions/github-script@v7 with: script: | const fs = require('fs'); if (fs.existsSync('test-report.md')) { const report = fs.readFileSync('test-report.md', 'utf8'); github.rest.issues.createComment({ issue_number: context.issue.number, owner: context.repo.owner, repo: context.repo.repo, body: '## 🎯 Comprehensive Integration Test Results\n\n' + report }); } # Performance validation tests performance-tests: name: ⚡ Performance Validation runs-on: ubuntu-latest timeout-minutes: 20 if: github.event_name == 'push' && github.ref == 'refs/heads/main' services: postgres: image: postgres:15 env: POSTGRES_USER: foxhunt POSTGRES_PASSWORD: foxhunt POSTGRES_DB: foxhunt_test options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 steps: - name: Checkout code uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable - name: Setup Rust cache uses: Swatinem/rust-cache@v2 - name: Set up test environment run: | echo "DATABASE_URL=postgresql://foxhunt:foxhunt@localhost:5432/foxhunt_test" >> $GITHUB_ENV echo "TEST_DATABASE_URL=postgresql://foxhunt:foxhunt@localhost:5432/foxhunt_test" >> $GITHUB_ENV - name: Run database migrations run: | cargo install sqlx-cli --no-default-features --features postgres sqlx database create sqlx migrate run - name: Build in release mode with optimizations run: | export RUSTFLAGS="-C target-cpu=native -C opt-level=3" cargo build --workspace --release - name: Run HFT performance benchmarks run: | # Run performance-focused integration tests cargo test --release --test performance_benchmarks cargo test --release --test latency_validation - name: Validate HFT requirements run: | # Check if performance metrics meet HFT requirements echo "Validating HFT performance requirements..." # This would check for: # - Sub-50μs end-to-end latency # - >10k ops/sec throughput # - <10μs risk validation # - <50ms ML inference - name: Upload performance results if: always() uses: actions/upload-artifact@v4 with: name: performance-test-results path: target/release/test-results/ # Security and compliance tests security-tests: name: 🔒 Security & Compliance Tests runs-on: ubuntu-latest timeout-minutes: 15 steps: - name: Checkout code uses: actions/checkout@v4 - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: components: clippy - name: Setup Rust cache uses: Swatinem/rust-cache@v2 - name: Run security audit run: | cargo install cargo-audit cargo audit - name: Run clippy security lints run: | cargo clippy --workspace --all-targets -- \ -W clippy::all \ -W clippy::pedantic \ -W clippy::restriction \ -A clippy::implicit_return \ -A clippy::missing_docs_in_private_items - name: Check for vulnerabilities run: | cargo install cargo-deny cargo deny check - name: Validate compliance requirements run: | # SOX compliance checks echo "Validating SOX compliance..." cargo test compliance::sox_tests # MiFID II compliance checks echo "Validating MiFID II compliance..." cargo test compliance::mifid_tests # Best execution compliance echo "Validating best execution compliance..." cargo test compliance::best_execution_tests # Summary job that aggregates all test results test-summary: name: 📊 Test Summary runs-on: ubuntu-latest if: always() needs: [smoke-tests, service-integration-tests, security-tests] steps: - name: Download all artifacts uses: actions/download-artifact@v4 - name: Generate summary report run: | echo "# Foxhunt HFT Integration Test Summary" > summary.md echo "Date: $(date)" >> summary.md echo "Commit: ${{ github.sha }}" >> summary.md echo "" >> summary.md echo "## Test Results" >> summary.md echo "- Smoke Tests: ${{ needs.smoke-tests.result }}" >> summary.md echo "- Service Integration: ${{ needs.service-integration-tests.result }}" >> summary.md echo "- Security & Compliance: ${{ needs.security-tests.result }}" >> summary.md if [[ "${{ needs.comprehensive-tests.result }}" != "" ]]; then echo "- Comprehensive Tests: ${{ needs.comprehensive-tests.result }}" >> summary.md fi if [[ "${{ needs.performance-tests.result }}" != "" ]]; then echo "- Performance Tests: ${{ needs.performance-tests.result }}" >> summary.md fi - name: Create status check uses: actions/github-script@v7 with: script: | const allPassed = [ "${{ needs.smoke-tests.result }}", "${{ needs.service-integration-tests.result }}", "${{ needs.security-tests.result }}" ].every(result => result === 'success'); const state = allPassed ? 'success' : 'failure'; const description = allPassed ? 'All integration tests passed' : 'Some integration tests failed'; github.rest.repos.createCommitStatus({ owner: context.repo.owner, repo: context.repo.repo, sha: context.sha, state: state, target_url: `https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`, description: description, context: 'integration-tests/summary' });