name: Run Test
on:
  push:
    paths-ignore:
      - ".gitignore"
      - "docs/**"
      - "ChangeLog"
      - "CREDITS.TXT"
      - "COMPILE_MAKE.TXT"
      - "COMPILE_MSVC.TXT"
      - "COMPILE_CMAKE.TXT"
      - "HACK.TXT"
      - "LICENSE.TXT"
      - "LICENSE_LLVM.TXT"
      - "README.md"
      - "RELEASE_NOTES"
      - "SPONSORS.TXT"
      - "TODO"
  pull_request:

env:
  CI: true

jobs:
  Linux:
    runs-on: ${{ matrix.config.os }}
    name: ${{ matrix.config.name }}
    strategy:
      fail-fast: false
      matrix:
        config:
          - {
              name: 'ubuntu-22.04 x64 make',
              os: ubuntu-22.04,
              arch: x64,
              build-system: 'make',
              diet-build: 'OFF',
              enable-asan: 'OFF'
            }
          - {
              name: 'ubuntu-22.04 x64 cmake',
              os: ubuntu-22.04,
              arch: x64,
              build-system: 'cmake',
              diet-build: 'OFF',
              enable-asan: 'OFF'
            }
          - {
              name: 'ubuntu-24.04 x64 ASAN',
              os: ubuntu-24.04,
              arch: x64,
              build-system: 'cmake',
              diet-build: 'OFF',
              enable-asan: 'ON'
            }

    steps:
    - uses: actions/checkout@v3

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: ${{ matrix.config.python-version }}

    - name: Prepare fuzzing
      run: |
        export LD_LIBRARY_PATH=`pwd`/tests/:$LD_LIBRARY_PATH
        wget https://github.com/groundx/capstonefuzz/raw/master/corpus/corpus-libFuzzer-capstone_fuzz_disasmnext-latest.zip
        unzip -q corpus-libFuzzer-capstone_fuzz_disasmnext-latest.zip -d suite/fuzz

    - name: make
      if: startsWith(matrix.config.build-system, 'make')
      run: |
        ./make.sh
        sudo make install

    - name: cmake
      if: startsWith(matrix.config.build-system, 'cmake')
      env:
        asan: ${{ matrix.config.enable-asan }}
      run: |
        mkdir build && cd build
        # build static library
        cmake -DCAPSTONE_INSTALL=1 -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_ASAN=${asan} -DCAPSTONE_BUILD_DIET=${diet_build} ..
        cmake --build . --config Release
        # build shared library
        cmake -DCAPSTONE_INSTALL=1 -DBUILD_SHARED_LIBS=1 -DCMAKE_INSTALL_PREFIX=/usr -DCAPSTONE_BUILD_CSTEST=ON -DENABLE_ASAN=${asan} ..
        sudo cmake --build . --config Release --target install

    - name: Lower number of KASL randomized address bits
      run: |
        # Work-around ASAN bug https://github.com/google/sanitizers/issues/1716
        sudo sysctl vm.mmap_rnd_bits=28

    - name: "Compatibility header test"
      if: startsWith(matrix.config.build-system, 'cmake') && matrix.config.diet-build == 'OFF'
      run: |
        ctest --test-dir build --output-on-failure -R ASCompatibilityHeaderTest

    - name: cstool - reaches disassembler engine
      run: |
        sh suite/run_invalid_cstool.sh

    - name: cstest unit tests
      if: startsWith(matrix.config.build-system, 'cmake')
      run: |
        ctest --test-dir build --output-on-failure -R UnitCSTest

    - name: cstest integration tests
      if: startsWith(matrix.config.build-system, 'cmake')
      run: |
        ctest --test-dir build --output-on-failure -R IntegrationCSTest

    - name: cstest MC
      if: startsWith(matrix.config.build-system, 'cmake')
      run: |
        ctest --test-dir build --output-on-failure -R MCTests

    - name: cstest details
      if: startsWith(matrix.config.build-system, 'cmake')
      run: |
        ctest --test-dir build --output-on-failure -R DetailTests

    - name: cstest issues
      if: startsWith(matrix.config.build-system, 'cmake')
      run: |
        ctest --test-dir build --output-on-failure -R IssueTests

    - name: cstest features
      if: startsWith(matrix.config.build-system, 'cmake')
      run: |
        ctest --test-dir build --output-on-failure -R FeaturesTests

    - name: Legacy integration tests
      if: startsWith(matrix.config.build-system, 'cmake')
      run: |
        ctest --test-dir build --output-on-failure -R legacy*

  Windows:
    runs-on: ${{ matrix.config.os }}
    name: ${{ matrix.config.name }}
    strategy:
      fail-fast: false
      matrix:
        config:
          - name: 'windows x64 MSVC 64bit'
            os: windows-latest
            arch: x64
            platform: windows
            python-arch: x64
            python-version: '3.9'

    steps:
    - uses: actions/checkout@v3

    - uses: lukka/get-cmake@latest
      name: Get CMake

    - name: '🛠️ Win MSVC 64 setup'
      if: contains(matrix.config.name, 'MSVC 64')
      uses: ilammy/msvc-dev-cmd@v1
      with:
        arch: 'x64'

    - name: '🚧 Win MSVC 64 build'
      if: contains(matrix.config.name, 'MSVC 64')
      shell: bash
      run: |
        cmake --version
        cmake --preset=${{ matrix.config.platform }}-x64
        cmake --build --preset build-${{ matrix.config.platform }}-release
        cmake --build --preset install-${{ matrix.config.platform }}-release
