on: [push, pull_request] jobs: integration: strategy: fail-fast: false matrix: os: [ "ubuntu" ] go: [ "1.24.x", "1.25.x" ] race: [ false ] use32bit: [ false ] include: - os: "ubuntu" go: "1.25.x" race: true - os: "ubuntu" go: "1.25.x" use32bit: true - os: "windows" go: "1.25.x" race: false - os: "macos" go: "1.25.x" race: false runs-on: ${{ fromJSON(vars[format('INTEGRATION_RUNNER_{0}', matrix.os)] || format('"{0}-latest"', matrix.os)) }} timeout-minutes: 30 defaults: run: shell: bash # by default Windows uses PowerShell, which uses a different syntax for setting environment variables env: DEBUG: false # set this to true to export qlogs and save them as artifacts TIMESCALE_FACTOR: 3 name: "Integration (${{ matrix.os }}, Go ${{ matrix.go }}${{ matrix.race && ', race' || '' }}${{ matrix.use32bit && ', 32-bit' || '' }})" steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: go-version: ${{ matrix.go }} - name: Install go-junit-report run: go install github.com/jstemmer/go-junit-report/v2@v2.1.0 - name: Set qlogger if: env.DEBUG == 'true' run: echo "QLOGFLAG= -qlog" >> $GITHUB_ENV - name: Enable race detector if: ${{ matrix.race }} run: echo "RACEFLAG= -race" >> $GITHUB_ENV - name: Enable 32-bit build if: ${{ matrix.use32bit }} run: echo "GOARCH=386" >> $GITHUB_ENV - run: go version - name: Run tools tests run: go test ${{ env.RACEFLAG }} -v -timeout 30s -shuffle=on ./integrationtests/tools/... 2>&1 | go-junit-report -set-exit-code -iocopy -out report_tools.xml - name: Run version negotiation tests run: go test ${{ env.RACEFLAG }} -v -timeout 30s -shuffle=on ./integrationtests/versionnegotiation ${{ env.QLOGFLAG }} 2>&1 | go-junit-report -set-exit-code -iocopy -out report_versionnegotiation.xml - name: Run self tests, using QUIC v1 if: success() || failure() # run this step even if the previous one failed run: go test ${{ env.RACEFLAG }} -v -timeout 5m -shuffle=on ./integrationtests/self -version=1 ${{ env.QLOGFLAG }} 2>&1 | go-junit-report -set-exit-code -iocopy -out report_self.xml - name: Run self tests, using QUIC v2 if: ${{ !matrix.race && (success() || failure()) }} # run this step even if the previous one failed run: go test ${{ env.RACEFLAG }} -v -timeout 5m -shuffle=on ./integrationtests/self -version=2 ${{ env.QLOGFLAG }} 2>&1 | go-junit-report -set-exit-code -iocopy -out report_self_v2.xml - name: Run self tests, with GSO disabled if: ${{ matrix.os == 'ubuntu' && (success() || failure()) }} # run this step even if the previous one failed env: QUIC_GO_DISABLE_GSO: true run: go test ${{ env.RACEFLAG }} -v -timeout 5m -shuffle=on ./integrationtests/self -version=1 ${{ env.QLOGFLAG }} 2>&1 | go-junit-report -set-exit-code -iocopy -out report_self_nogso.xml - name: Run self tests, with ECN disabled if: ${{ !matrix.race && matrix.os == 'ubuntu' && (success() || failure()) }} # run this step even if the previous one failed env: QUIC_GO_DISABLE_ECN: true run: go test ${{ env.RACEFLAG }} -v -timeout 5m -shuffle=on ./integrationtests/self -version=1 ${{ env.QLOGFLAG }} 2>&1 | go-junit-report -set-exit-code -iocopy -out report_self_noecn.xml - name: Run benchmarks if: ${{ !matrix.race }} run: go test -v -run=^$ -timeout 5m -shuffle=on -bench=. ./integrationtests/self - name: save qlogs if: ${{ always() && env.DEBUG == 'true' }} uses: actions/upload-artifact@v4 with: name: qlogs-${{ matrix.os }}-go${{ matrix.go }}-race${{ matrix.race }}${{ matrix.use32bit && '-32bit' || '' }} path: integrationtests/self/*.qlog retention-days: 7 - name: Upload report to Codecov if: ${{ !cancelled() && !matrix.race && !matrix.use32bit }} uses: codecov/test-results-action@v1 with: name: Unit tests files: report_tools.xml,report_versionnegotiation.xml,report_self.xml,report_self_v2.xml,report_self_nogso.xml,report_self_noecn.xml env_vars: OS,GO token: ${{ secrets.CODECOV_TOKEN }}