name: make test

on: [push, pull_request]

env:
  CTEST_PARALLEL_LEVEL: "1"
  CMAKE_BUILD_PARALLEL_LEVEL: "4"

permissions:
  contents: read

jobs:
  ubuntu:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Install deps
      run: |
        sudo apt install gettext libncurses5-dev libpcre2-dev python3-pip tmux
        sudo pip3 install pexpect
        # Generate a locale that uses a comma as decimal separator.
        sudo locale-gen fr_FR.UTF-8
    - name: cmake
      env:
          # Some warnings upgraded to errors to match Open Build Service platforms
          CXXFLAGS: "-Werror=address -Werror=return-type"
      run: |
        mkdir build && cd build
        cmake ..
    - name: make
      run: |
        make
    - name: make test
      run: |
        make test

  ubuntu-32bit-fetched-pcre2:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Install deps
      run: |
        sudo apt update
        sudo apt install gettext lib32ncurses5-dev python3-pip g++-multilib tmux
        sudo pip3 install pexpect
    - name: cmake
      env:
          CXXFLAGS: "-m32 -Werror=address -Werror=return-type"
          CFLAGS: "-m32"
      run: |
        mkdir build && cd build
        cmake -DFISH_USE_SYSTEM_PCRE2=OFF ..
    - name: make
      run: |
        make
    - name: make test
      run: |
        make test

  ubuntu-asan:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Install deps
      run: |
        sudo apt install gettext libncurses5-dev libpcre2-dev python3-pip tmux
        sudo pip3 install pexpect
    - name: cmake
      env:
          CC: clang
          CXX: clang++
          CXXFLAGS: "-fno-omit-frame-pointer -fsanitize=undefined -fsanitize=address -DFISH_CI_SAN"
      run: |
        mkdir build && cd build
        cmake ..
    - name: make
      run: |
        make
    - name: make test
      env:
          FISH_CI_SAN: 1
          ASAN_OPTIONS: check_initialization_order=1:detect_stack_use_after_return=1:detect_leaks=1
          UBSAN_OPTIONS: print_stacktrace=1:report_error_type=1
          # use_tls=0 is a workaround for LSAN crashing with "Tracer caught signal 11" (SIGSEGV),
          # which seems to be an issue with TLS support in newer glibc versions under virtualized
          # environments. Follow https://github.com/google/sanitizers/issues/1342 and
          # https://github.com/google/sanitizers/issues/1409 to track this issue.
          LSAN_OPTIONS: verbosity=0:log_threads=0:use_tls=0
      run: |
        make test

  ubuntu-threadsan:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Install deps
      run: |
        sudo apt install gettext libncurses5-dev libpcre2-dev python3-pip tmux
        sudo pip3 install pexpect
    - name: cmake
      env:
          FISH_CI_SAN: 1
          CC: clang
          CXX: clang++
          CXXFLAGS: "-fsanitize=thread"
      run: |
        mkdir build && cd build
        cmake ..
    - name: make
      run: |
        make
    - name: make test
      run: |
        make test

  macos:

    runs-on: macos-latest

    steps:
    - uses: actions/checkout@v3
    - name: Install deps
      run: |
        sudo pip3 install pexpect
        brew install tmux
    - name: cmake
      run: |
        mkdir build && cd build
        cmake -DWITH_GETTEXT=NO ..
    - name: make
      run: |
        make
    - name: make test
      run: |
        make test