name: Test Coverage
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
jobs:
coverage:
name: Generate Coverage Report
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
components: llvm-tools-preview
- name: Install cargo-tarpaulin
run: cargo install cargo-tarpaulin --locked --force
- name: Check if external dependencies exist
id: check_deps
shell: bash
run: |
if [ -d "../zerobus-sdk-rs/sdk" ] && [ -f "../zerobus-sdk-rs/sdk/Cargo.toml" ]; then
echo "zerobus_sdk_exists=true" >> $GITHUB_OUTPUT
else
echo "zerobus_sdk_exists=false" >> $GITHUB_OUTPUT
echo "External dependencies not available - creating stub to allow cargo metadata to succeed"
# Create a minimal stub Cargo.toml to allow cargo to resolve dependencies
mkdir -p ../zerobus-sdk-rs/sdk
echo '[package]' > ../zerobus-sdk-rs/sdk/Cargo.toml
echo 'name = "databricks-zerobus-ingest-sdk"' >> ../zerobus-sdk-rs/sdk/Cargo.toml
echo 'version = "0.1.0"' >> ../zerobus-sdk-rs/sdk/Cargo.toml
echo 'edition = "2021"' >> ../zerobus-sdk-rs/sdk/Cargo.toml
# Create a minimal lib.rs
mkdir -p ../zerobus-sdk-rs/sdk/src
echo '// Stub for CI - actual SDK not available' > ../zerobus-sdk-rs/sdk/src/lib.rs
echo 'pub struct ZerobusSdk;' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo 'pub struct ZerobusStream;' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo 'pub struct StreamConfigurationOptions;' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo 'pub struct TableProperties;' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo '' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo 'impl ZerobusSdk {' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo ' pub fn new(_endpoint: String, _unity_catalog_url: String) -> Result<Self, String> {' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo ' Err("SDK not available in CI".to_string())' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo ' }' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo '}' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo '' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo 'impl Default for StreamConfigurationOptions {' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo ' fn default() -> Self {' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo ' Self' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo ' }' >> ../zerobus-sdk-rs/sdk/src/lib.rs
echo '}' >> ../zerobus-sdk-rs/sdk/src/lib.rs
fi
- name: Run tests with coverage
continue-on-error: true
run: |
cargo tarpaulin --features python --out Xml --output-dir coverage/ || echo "Coverage run completed"
cargo tarpaulin --features python --out Html --output-dir coverage/ || echo "Coverage run completed"
cargo tarpaulin --features python --out Lcov --output-dir coverage/ || echo "Coverage run completed"
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./coverage/cobertura.xml
flags: unittests
name: codecov-umbrella
fail_ci_if_error: false
- name: Check coverage threshold
if: steps.check_deps.outputs.zerobus_sdk_exists == 'true'
continue-on-error: true
run: |
# Extract coverage percentage from tarpaulin output
if [ -f "coverage/cobertura.xml" ]; then
COVERAGE=$(grep -oP 'line-rate="\K[0-9.]+' coverage/cobertura.xml | head -1)
THRESHOLD=90.0
if (( $(echo "$COVERAGE < $THRESHOLD" | bc -l) )); then
echo "Coverage $COVERAGE% is below threshold $THRESHOLD%"
exit 1
fi
echo "Coverage $COVERAGE% meets threshold $THRESHOLD%"
else
echo "Coverage file not found, skipping threshold check"
fi