fork 0.10.0

Library for creating a new process detached from the controlling terminal (daemon)
Documentation
---
name: Test

on:
  workflow_call:
  pull_request:
    branches:
      - '*'

jobs:
  format:
    name: Format
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable

      - name: Format
        run: cargo fmt --all -- --check

  lint:
    name: Clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable

      - name: Clippy
        run: cargo clippy --all-targets --all-features --locked -- -D warnings

  check:
    name: Check
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable

      - name: Check
        run: cargo check --all-targets --all-features --locked

  docs:
    name: Documentation
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable

      - name: Build API documentation
        run: cargo doc --no-deps --all-features --locked
        env:
          RUSTDOCFLAGS: -D warnings

      - name: Test API examples
        run: cargo test --doc --all-features --locked

  semver:
    name: Public API compatibility
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable
      - uses: taiki-e/install-action@v2
        with:
          tool: cargo-semver-checks

      - name: Compare with published 0.9.0 API
        run: cargo semver-checks --baseline-version 0.9.0

  policy:
    name: Dependency policy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable
      - uses: taiki-e/install-action@v2
        with:
          tool: cargo-audit
      - uses: taiki-e/install-action@v2
        with:
          tool: cargo-deny

      - name: Security advisories
        run: cargo audit

      - name: Licenses, sources, and duplicates
        run: cargo deny --all-features check

  test:
    name: Test
    strategy:
      matrix:
        os:
          - ubuntu-latest
          - macOS-latest
        rust:
          - stable
    runs-on: ${{ matrix.os }}
    needs:
      - format
      - lint
      - check
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable

      - name: test
        run: cargo test --all-targets --all-features --locked -- --test-threads=1

      - name: Verify test cleanup
        if: always()
        run: sh .github/scripts/check-test-cleanup.sh

      - name: Cleanup orphaned test processes
        if: always()
        run: |
          # Kill any remaining test processes
          pkill -9 -f "fork.*debug/deps" || true
          # Clean up test directories
          rm -rf /tmp/fork_test* || true

  freebsd-test:
    name: Test FreeBSD
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7

      - name: Run native FreeBSD lifecycle suite
        uses: vmactions/freebsd-vm@v1
        with:
          copyback: false
          usesh: true
          prepare: pkg install -y rust
          run: |
            set -eu
            cargo clippy --all-targets --all-features --locked -- -D warnings
            cargo test --all-targets --all-features --locked -- --test-threads=1
            sh .github/scripts/check-test-cleanup.sh
            cargo package --locked

  coverage:
    name: Coverage
    runs-on: ubuntu-latest
    needs:
      - format
      - lint
      - check
    steps:
      - uses: actions/checkout@v7
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: llvm-tools-preview

      - name: Install cargo-llvm-cov
        uses: taiki-e/install-action@v2
        with:
          tool: cargo-llvm-cov

      - name: Generate coverage (lcov)
        run: |
          cargo llvm-cov --all-features --workspace --locked --fail-under-lines 60 --lcov --output-path coverage.lcov -- --test-threads=1

      - name: Upload to codecov.io
        uses: codecov/codecov-action@v7
        env:
          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
        with:
          files: coverage.lcov
          flags: rust

      - name: Coveralls GitHub Action
        continue-on-error: true
        uses: coverallsapp/github-action@v2