FfiClient state guarding, additional testing coverage (#125) #166
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Tests | |
| on: | |
| push: | |
| branches: ["main"] | |
| paths: | |
| - src/** | |
| - include/** | |
| - client-sdk-rust/** | |
| - CMakeLists.txt | |
| - CMakePresets.json | |
| - build.sh | |
| - build.cmd | |
| - vcpkg.json | |
| - .token_helpers/** | |
| - .github/workflows/tests.yml | |
| pull_request: | |
| branches: ["main"] | |
| paths: | |
| - src/** | |
| - include/** | |
| - client-sdk-rust/** | |
| - CMakeLists.txt | |
| - CMakePresets.json | |
| - build.sh | |
| - build.cmd | |
| - vcpkg.json | |
| - .token_helpers/** | |
| - .github/workflows/tests.yml | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| actions: read | |
| packages: read | |
| env: | |
| CARGO_TERM_COLOR: always | |
| # vcpkg binary caching for Windows (mirrors builds.yml) | |
| VCPKG_DEFAULT_TRIPLET: x64-windows-static-md | |
| VCPKG_DEFAULT_HOST_TRIPLET: x64-windows-static-md | |
| VCPKG_TARGET_TRIPLET: x64-windows-static-md | |
| jobs: | |
| test: | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| name: linux-x64 | |
| build_cmd: ./build.sh release-tests | |
| e2e-testing: true | |
| - os: ubuntu-24.04-arm | |
| name: linux-arm64 | |
| build_cmd: ./build.sh release-tests | |
| e2e-testing: true | |
| - os: macos-26-xlarge | |
| name: macos-arm64 | |
| build_cmd: ./build.sh release-tests | |
| # E2E not possible on GHA Mac runner currently | |
| e2e-testing: false | |
| - os: macos-26-large | |
| name: macos-x64 | |
| build_cmd: ./build.sh release-tests --macos-arch x86_64 | |
| # E2E not possible on GHA Mac runner currently | |
| e2e-testing: false | |
| # Pinned to Windows 2022 for current VS 17 implementation | |
| - os: windows-2022 | |
| name: windows-x64 | |
| build_cmd: .\build.cmd release-tests | |
| name: Test (${{ matrix.name }}) | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - name: Checkout (with submodules) | |
| uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| with: | |
| submodules: recursive | |
| fetch-depth: 1 | |
| - name: Pull LFS files | |
| run: git lfs pull | |
| # ---------- vcpkg caching for Windows (mirrors builds.yml) ---------- | |
| - name: Export GitHub Actions cache environment variables | |
| if: runner.os == 'Windows' | |
| uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 | |
| with: | |
| script: | | |
| core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || ''); | |
| core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || ''); | |
| - name: Setup vcpkg (Windows only) | |
| if: runner.os == 'Windows' | |
| uses: lukka/run-vcpkg@6fe69898af670ac05f4a8427cc5cff4fb361cee5 # v11.5 | |
| with: | |
| vcpkgGitCommitId: 'fb87e2bb3fe69e16c224989acb5a61349166c782' | |
| # ---------- OS-specific deps ---------- | |
| - name: Install deps (Ubuntu) | |
| if: runner.os == 'Linux' | |
| run: | | |
| set -eux | |
| sudo apt-get update | |
| sudo apt-get install -y \ | |
| build-essential cmake ninja-build pkg-config \ | |
| llvm-dev libclang-dev clang \ | |
| libva-dev libdrm-dev libgbm-dev libx11-dev libgl1-mesa-dev \ | |
| libxext-dev libxcomposite-dev libxdamage-dev libxfixes-dev \ | |
| libxrandr-dev libxi-dev libxkbcommon-dev \ | |
| libasound2-dev libpulse-dev \ | |
| libssl-dev \ | |
| libprotobuf-dev protobuf-compiler \ | |
| libabsl-dev \ | |
| libwayland-dev libdecor-0-dev \ | |
| jq | |
| - name: Install deps (macOS) | |
| if: runner.os == 'macOS' | |
| run: | | |
| set -eux | |
| brew update | |
| brew install cmake ninja protobuf abseil jq | |
| # ---------- Rust toolchain ---------- | |
| - name: Install Rust (stable) | |
| uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 | |
| with: | |
| toolchain: stable | |
| - name: Install Rust cross-compilation target | |
| if: matrix.name == 'macos-x64' | |
| run: rustup target add x86_64-apple-darwin | |
| # ---------- Cache Cargo ---------- | |
| - name: Cache Cargo | |
| uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 | |
| with: | |
| workspaces: client-sdk-rust -> target | |
| # ---------- Build environment setup ---------- | |
| - name: Set Linux build environment | |
| if: runner.os == 'Linux' | |
| run: | | |
| echo "CXXFLAGS=-Wno-deprecated-declarations" >> $GITHUB_ENV | |
| echo "CFLAGS=-Wno-deprecated-declarations" >> $GITHUB_ENV | |
| LLVM_VERSION=$(llvm-config --version | cut -d. -f1) | |
| echo "LIBCLANG_PATH=/usr/lib/llvm-${LLVM_VERSION}/lib" >> $GITHUB_ENV | |
| # ---------- Build (release-tests: tests on, examples off) ---------- | |
| - name: Build tests (Unix) | |
| if: runner.os != 'Windows' | |
| shell: bash | |
| run: | | |
| chmod +x build.sh | |
| ${{ matrix.build_cmd }} | |
| - name: Build tests (Windows) | |
| if: runner.os == 'Windows' | |
| shell: pwsh | |
| run: ${{ matrix.build_cmd }} | |
| # ---------- Run unit tests ---------- | |
| - name: Run unit tests (Unix) | |
| if: runner.os != 'Windows' | |
| timeout-minutes: 1 | |
| shell: bash | |
| run: | | |
| build-release/bin/livekit_unit_tests \ | |
| --gtest_output=xml:build-release/unit-test-results.xml | |
| - name: Run unit tests (Windows) | |
| if: runner.os == 'Windows' | |
| timeout-minutes: 1 | |
| shell: pwsh | |
| run: | | |
| build-release\bin\livekit_unit_tests.exe ` | |
| --gtest_output="xml:build-release\unit-test-results.xml" | |
| # ---------- Install + start livekit-server for integration tests ---------- | |
| - name: Install livekit-server and lk CLI | |
| if: matrix.e2e-testing | |
| shell: bash | |
| run: | | |
| set -euxo pipefail | |
| if [[ "$RUNNER_OS" == "Linux" ]]; then | |
| # Linux: official install scripts. lk's installer parses the GitHub | |
| # API JSON with jq (already installed above). | |
| curl -sSL https://get.livekit.io | bash | |
| curl -sSL https://get.livekit.io/cli | bash | |
| else | |
| # macOS: Homebrew formulas. Server install script aborts on Darwin. | |
| brew install livekit livekit-cli | |
| fi | |
| livekit-server --version | |
| lk --version | |
| - name: Start livekit-server | |
| if: matrix.e2e-testing | |
| shell: bash | |
| env: | |
| LIVEKIT_CONFIG: "enable_data_tracks: true" | |
| run: | | |
| set -euxo pipefail | |
| # Background the server with nohup so it survives this step's shell | |
| # exit and remains running for the integration-test step. | |
| nohup livekit-server --dev > livekit-server.log 2>&1 & | |
| echo $! > livekit-server.pid | |
| # Port 7880 is a WebSocket endpoint, so a TCP-connect probe is the | |
| # most reliable readiness signal. | |
| for i in $(seq 1 30); do | |
| if nc -z 127.0.0.1 7880 >/dev/null 2>&1; then | |
| echo "livekit-server is ready" | |
| exit 0 | |
| fi | |
| sleep 1 | |
| done | |
| echo "::error::livekit-server failed to start within 30s" | |
| tail -n 200 livekit-server.log || true | |
| exit 1 | |
| - name: Run integration tests | |
| if: matrix.e2e-testing | |
| timeout-minutes: 5 | |
| shell: bash | |
| env: | |
| RUST_LOG: "metrics=debug" | |
| run: | | |
| set -euo pipefail | |
| source .token_helpers/set_data_track_test_tokens.bash | |
| build-release/bin/livekit_integration_tests \ | |
| --gtest_output=xml:build-release/integration-test-results.xml | |
| - name: Stop livekit-server | |
| if: always() && matrix.e2e-testing | |
| shell: bash | |
| run: | | |
| if [ -f livekit-server.pid ]; then | |
| kill "$(cat livekit-server.pid)" 2>/dev/null || true | |
| rm -f livekit-server.pid | |
| fi | |
| - name: Dump livekit-server log on failure | |
| if: failure() && matrix.e2e-testing | |
| shell: bash | |
| run: tail -n 500 livekit-server.log || true | |
| # ---------- Upload results ---------- | |
| - name: Upload test results | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: test-results-${{ matrix.name }} | |
| path: | | |
| build-release/unit-test-results.xml | |
| build-release/integration-test-results.xml | |
| livekit-server.log | |
| if-no-files-found: ignore | |
| retention-days: 7 | |
| # ============================================================================ | |
| # Code Coverage (Linux only) | |
| # Runs a debug build through gcov/lcov and generates an inline action summary | |
| # alongside an HTML report of unit test coverage. | |
| # ============================================================================ | |
| coverage: | |
| name: Code Coverage | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout (with submodules) | |
| uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | |
| with: | |
| submodules: recursive | |
| fetch-depth: 1 | |
| - name: Pull LFS files | |
| run: git lfs pull | |
| # ---------- OS deps ---------- | |
| - name: Install deps | |
| run: | | |
| set -eux | |
| sudo apt-get update | |
| sudo apt-get install -y \ | |
| build-essential cmake ninja-build pkg-config \ | |
| llvm-dev libclang-dev clang \ | |
| libva-dev libdrm-dev libgbm-dev libx11-dev libgl1-mesa-dev \ | |
| libxext-dev libxcomposite-dev libxdamage-dev libxfixes-dev \ | |
| libxrandr-dev libxi-dev libxkbcommon-dev \ | |
| libasound2-dev libpulse-dev \ | |
| libssl-dev \ | |
| libprotobuf-dev protobuf-compiler \ | |
| libabsl-dev \ | |
| libwayland-dev libdecor-0-dev | |
| pip install --break-system-packages gcovr | |
| # ---------- Rust toolchain ---------- | |
| - name: Install Rust (stable) | |
| uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 | |
| with: | |
| toolchain: stable | |
| # ---------- Cache Cargo ---------- | |
| - name: Cache Cargo | |
| uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 | |
| with: | |
| workspaces: client-sdk-rust -> target | |
| key: coverage | |
| # ---------- Build environment setup ---------- | |
| - name: Set build environment | |
| run: | | |
| LLVM_VERSION=$(llvm-config --version | cut -d. -f1) | |
| echo "LIBCLANG_PATH=/usr/lib/llvm-${LLVM_VERSION}/lib" >> $GITHUB_ENV | |
| GCC_VER=$(gcc -dumpversion | cut -d. -f1) | |
| echo "GCOV_EXECUTABLE=gcov-${GCC_VER}" >> $GITHUB_ENV | |
| # ---------- Configure with upstream preset + coverage flag overrides ---------- | |
| - name: Configure (linux-debug-tests preset + coverage flags) | |
| run: | | |
| cmake --preset linux-debug-tests \ | |
| -DCMAKE_C_FLAGS="-Wno-deprecated-declarations --coverage" \ | |
| -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations --coverage" \ | |
| -DCMAKE_EXE_LINKER_FLAGS="--coverage" \ | |
| -DCMAKE_SHARED_LINKER_FLAGS="--coverage" | |
| - name: Build | |
| run: cmake --build build-debug --parallel | |
| # ---------- Run unit tests ---------- | |
| - name: Run unit tests | |
| timeout-minutes: 5 | |
| run: | | |
| build-debug/bin/livekit_unit_tests \ | |
| --gtest_output=xml:build-debug/unit-test-results.xml | |
| # ---------- Generate coverage reports ---------- | |
| - name: Generate coverage reports | |
| run: | | |
| mkdir -p coverage-html | |
| gcovr build-debug \ | |
| --root . \ | |
| --gcov-executable "${GCOV_EXECUTABLE}" \ | |
| --gcov-ignore-parse-errors=all \ | |
| --filter 'include/' \ | |
| --filter 'src/' \ | |
| --exclude 'src/tests/' \ | |
| --exclude '.*\.pb\.' \ | |
| --exclude-unreachable-branches \ | |
| --exclude-throw-branches \ | |
| --cobertura coverage.xml \ | |
| --html-details coverage-html/index.html \ | |
| --txt coverage-summary.txt | |
| - name: Add coverage summary to job | |
| run: | | |
| { | |
| echo '## Code Coverage Summary' | |
| echo '' | |
| echo '```' | |
| cat coverage-summary.txt | |
| echo '```' | |
| echo '' | |
| echo '*Full HTML report available in the **coverage-report** artifact.*' | |
| } >> "$GITHUB_STEP_SUMMARY" | |
| # ---------- Upload reports ---------- | |
| - name: Upload coverage HTML report | |
| if: always() | |
| uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 | |
| with: | |
| name: coverage-report | |
| path: coverage-html/ | |
| retention-days: 14 | |
| - name: Upload coverage to Codecov | |
| uses: getsentry/codecov-action@03112cc3b486a3397dc8d17a58680008721fc86f # v0.3.7 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} |