* [Tests] Introduce client-server integration tests * Add an in-process loopback that connects a real client transport to a real server transport, draining both Fiber loops in one synchronous pass instead of polling. A stalled exchange fails where it happened rather than hanging. * Cover protocol version negotiation across both implementations, where the unit tests only ever drive one side against a canned counter-offer. * Cover the server-to-client round-trips end to end: elicitation, sampling, roots, plus progress and logging notifications. * Add the `integration` test suite and a `make integration-tests` target. * [Tests] Run the integration suite in CI The unit job pins `--testsuite=unit`, so the new suite would never have run on GitHub. It goes in that job rather than its own: the loopback leans on Fibers, and the matrix is what covers them down to the PHP 8.1 floor. * [Tests] Run integration tests against a real server process Replaces the in-process loopback with the setup from examples/client: the client spawns a fixture server over the real StdioTransport, so the tests exercise the shipped transports and no longer nest both sides' Fibers. Moves the suite into its own CI job, matrixed over PHP 8.1-8.5.
214 lines
5.8 KiB
YAML
214 lines
5.8 KiB
YAML
name: pipeline
|
|
on: pull_request
|
|
|
|
permissions:
|
|
contents: read
|
|
pull-requests: write
|
|
|
|
jobs:
|
|
unit:
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
php: ['8.1', '8.2', '8.3', '8.4', '8.5']
|
|
dependencies: ['lowest', 'highest']
|
|
symfony-version: ['']
|
|
include:
|
|
- symfony-version: '5.4.*'
|
|
dependencies: 'highest'
|
|
php: '8.2'
|
|
- symfony-version: '6.4.*'
|
|
dependencies: 'highest'
|
|
php: '8.2'
|
|
- symfony-version: '7.4.*'
|
|
dependencies: 'highest'
|
|
php: '8.4'
|
|
- symfony-version: '8.0.*'
|
|
dependencies: 'highest'
|
|
php: '8.4'
|
|
|
|
env:
|
|
SYMFONY_REQUIRE: ${{ matrix.symfony-version || '>=6.4' }}
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: ${{ matrix.php }}
|
|
tools: flex
|
|
coverage: "none"
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
with:
|
|
dependency-versions: "${{ matrix.dependencies }}"
|
|
|
|
- name: Tests
|
|
run: vendor/bin/phpunit --testsuite=unit
|
|
|
|
integration:
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
php: ['8.1', '8.2', '8.3', '8.4', '8.5']
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: ${{ matrix.php }}
|
|
coverage: "none"
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
|
|
- name: Tests
|
|
run: vendor/bin/phpunit --testsuite=integration
|
|
|
|
inspector:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: '8.4'
|
|
coverage: "none"
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v7
|
|
with:
|
|
node-version: '22'
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
|
|
- name: Tests
|
|
run: vendor/bin/phpunit --testsuite=inspector
|
|
|
|
conformance-server:
|
|
name: conformance / server
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v7
|
|
with:
|
|
node-version: '22'
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
|
|
- name: Start conformance server
|
|
run: |
|
|
mkdir -p tests/Conformance/sessions tests/Conformance/logs
|
|
chmod -R 777 tests/Conformance/sessions tests/Conformance/logs
|
|
docker compose -f tests/Conformance/Fixtures/docker-compose.yml up -d
|
|
sleep 5
|
|
|
|
- name: Run conformance tests
|
|
working-directory: ./tests/Conformance
|
|
run: npx @modelcontextprotocol/conformance server --url http://localhost:8000/ --expected-failures conformance-baseline.yml
|
|
|
|
- name: Show logs on failure
|
|
if: failure()
|
|
run: |
|
|
echo "=== Docker Compose Logs ==="
|
|
docker compose -f tests/Conformance/Fixtures/docker-compose.yml logs
|
|
echo ""
|
|
echo "=== Conformance Log ==="
|
|
cat tests/Conformance/logs/conformance.log 2>/dev/null || echo "No conformance log found"
|
|
echo ""
|
|
echo "=== Test Results (first failed test) ==="
|
|
find tests/Conformance/results -name "checks.json" 2>/dev/null | head -3 | while read f; do
|
|
echo "--- $f ---"
|
|
cat "$f"
|
|
echo ""
|
|
done || echo "No results found"
|
|
echo ""
|
|
echo "=== Directory permissions ==="
|
|
ls -la tests/Conformance/
|
|
ls -la tests/Conformance/logs/ 2>/dev/null || echo "logs dir issue"
|
|
ls -la tests/Conformance/sessions/ 2>/dev/null || echo "sessions dir issue"
|
|
|
|
- name: Cleanup
|
|
if: always()
|
|
run: docker compose -f tests/Conformance/Fixtures/docker-compose.yml down
|
|
|
|
conformance-client:
|
|
name: conformance / client
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: '8.4'
|
|
coverage: "none"
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v7
|
|
with:
|
|
node-version: '22'
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
|
|
- name: Create log directory
|
|
run: mkdir -p tests/Conformance/logs
|
|
|
|
- name: Run client conformance tests
|
|
working-directory: ./tests/Conformance
|
|
run: npx @modelcontextprotocol/conformance client --command "php ${{ github.workspace }}/tests/Conformance/client.php" --suite all --expected-failures conformance-baseline.yml
|
|
|
|
- name: Show logs on failure
|
|
if: failure()
|
|
run: |
|
|
echo "=== Client Conformance Log ==="
|
|
cat tests/Conformance/logs/client-conformance.log 2>/dev/null || echo "No client conformance log found"
|
|
echo ""
|
|
echo "=== Test Results ==="
|
|
find tests/Conformance/results -name "checks.json" 2>/dev/null | head -3 | while read f; do
|
|
echo "--- $f ---"
|
|
cat "$f"
|
|
echo ""
|
|
done || echo "No results found"
|
|
|
|
qa:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: '8.1'
|
|
coverage: "none"
|
|
|
|
- name: Composer Validation
|
|
run: composer validate --strict
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
|
|
- name: Code Style PHP
|
|
run: vendor/bin/php-cs-fixer fix --dry-run
|
|
|
|
- name: PHPStan
|
|
run: vendor/bin/phpstan analyse
|
|
|
|
- name: Documentation
|
|
run: make docs
|