name: Quality

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - '*'

jobs:
  pre-commit:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v5
    - uses: actions/setup-python@v6
    - uses: pre-commit/action@v3.0.1

  scan-build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v5
    - name: Create LLVM clang-tools scan-build Workspace
      run: |
        sudo apt-get update -qq
        sudo apt-get install -qq clang-tools
    - name: Static Defect Analysis using scan-build
      run: |
        make clean
        make scan-build

  splint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v5
    - name: Create SPLint Workspace
      run: |
        sudo apt-get update -qq
        sudo apt-get install -qq splint
    - name: Static Defect Analysis using SPLint
      run: make splint


  cppcheck:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v5
    - name: Create CPPcheck Workspace
      run: |
        sudo apt-get update -qq
        sudo apt-get install -qq cppcheck
    - name: Static Defect Analysis using CPPcheck
      run: |
        cppcheck --version
        make clean
        make cppcheck

  flawfinder:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v5
    - name: Create Flawfinder Workspace
      run: |
        sudo apt-get update -qq
        sudo apt-get install -qq flawfinder
    - name: Static Defect Analysis using flawfinder
      run: |
        flawfinder --version
        make clean
        make flawfinder

  codespell:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v5
    - name: Create codespell Workspace
      run: |
        sudo apt-get update -qq
        sudo apt-get install -qq codespell
    - name: Static Spelling Analysis using codespell
      run: make spell

  unittest:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v5
    - name: Create Build Environment
      run: |
        sudo apt-get update -qq
        sudo apt-get install -qq lcov
    - name: Run Unit Test with Code Coverage
      run: make test

  unittest-secure-connect:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout BACnet Stack
      uses: actions/checkout@v5
    - name: Checkout libwebsockets
      uses: actions/checkout@v5
      with:
        repository: warmcat/libwebsockets
        ref: v4.3-stable
        path: libwebsockets
    - name: Create BACnet/SC Build Environment
      run: |
        sudo apt-get update -qq
        sudo apt-get install -qq lcov
        sudo apt-get install -qq libssl-dev
        sudo apt-get install -qq libcap-dev
        sudo apt-get install -qq libuv1-dev
        bash -c 'cd libwebsockets;mkdir build;cd build;cmake .. -DLWS_WITH_LIBUV=ON -DLWS_WITH_MINIMAL_EXAMPLES=0 -DLWS_MAX_SMP=32 -DCMAKE_POLICY_VERSION_MINIMUM=3.5;make'
        sudo bash -c 'cd libwebsockets;cd build;make install'
    - name: Run BACnet/SC Unit Test with Code Coverage
      run: |
        pwd
        ls -al
        echo "make test-bsc"
