name: dev-short-tests
# Faster tests: mostly build tests, along with some other
# misc tests

concurrency:
  group: fast-${{ github.ref }}
  cancel-in-progress: true

on:
  pull_request:
    branches: [ dev, release, actionsTest ]

jobs:
  linux-kernel:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: linux kernel, library + build + test
      run: make -C contrib/linux-kernel test CFLAGS="-Werror -Wunused-const-variable -Wunused-but-set-variable"

  benchmarking:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: make benchmarking
      run: make benchmarking

  check-32bit: # designed to catch https://github.com/facebook/zstd/issues/2428
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: make check on 32-bit
      run: |
        sudo apt update
        APT_PACKAGES="gcc-multilib" make apt-install
        CFLAGS="-m32 -O1 -fstack-protector" make check V=1

  check-x32:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: make check on x32 ABI # https://en.wikipedia.org/wiki/X32_ABI
      env:
        CHECK_CONSTRAINED_MEM: true
      run: |
        sudo apt update
        APT_PACKAGES="gcc-multilib" make apt-install
        CFLAGS="-mx32 -O1 -fstack-protector" make check V=1

  gcc-7-libzstd:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: gcc-7 + libzstdmt compilation
      run: |
        sudo apt-get -qqq update
        make gcc7install
        CC=gcc-7 CFLAGS=-Werror make -j all
        make clean
        LDFLAGS=-Wl,--no-undefined make -C lib libzstd-mt

    # candidate test (to check) : underlink test
    # LDFLAGS=-Wl,--no-undefined : will make the linker fail if dll is underlinked

  cmake-build-and-test-check:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: cmake build and test check
      run: |
        FUZZERTEST=-T1mn ZSTREAM_TESTTIME=-T1mn make cmakebuild
        cp -r ./ "../zstd source"
        cd "../zstd source"
        FUZZERTEST=-T1mn ZSTREAM_TESTTIME=-T1mn make cmakebuild

  cpp-gnu90-c99-compatibility:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: C++, gnu90 and c99 compatibility
      run: |
        make cxxtest
        make clean
        make gnu90build
        make clean
        make c99build
        make clean
        make travis-install   # just ensures `make install` works

  mingw-cross-compilation:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: mingw cross-compilation
      run: |
        # sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix; (doesn't work)
        sudo apt-get -qqq update
        sudo apt-get install gcc-mingw-w64
        CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ CFLAGS="-Werror -O1" make zstd

  armbuild:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: ARM Build Test
      run: |
        sudo apt-get -qqq update
        make arminstall
        make armbuild

  bourne-shell:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Bourne shell compatibility (shellcheck)
      run: |
        wget https://github.com/koalaman/shellcheck/releases/download/v0.7.1/shellcheck-v0.7.1.linux.x86_64.tar.xz
        tar -xf shellcheck-v0.7.1.linux.x86_64.tar.xz
        shellcheck-v0.7.1/shellcheck --shell=sh --severity=warning --exclude=SC2010 tests/playTests.sh

  zlib-wrapper:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: zlib wrapper test
      run: |
        sudo apt-get -qqq update
        make valgrindinstall
        make -C zlibWrapper test
        make -C zlibWrapper test-valgrind

  lz4-threadpool-libs:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: LZ4, thread pool, and libs build testslib wrapper test
      run: |
        make lz4install
        make -C tests test-lz4
        make check < /dev/null | tee   # mess with lz4 console detection
        make clean
        make -C tests test-pool
        make clean
        bash tests/libzstd_builds.sh

  gcc-make-tests-32bit:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Make all, 32bit mode
      run: |
        sudo apt-get -qqq update
        make libc6install
        CFLAGS="-Werror -m32" make -j all32

  gcc-8-make:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: gcc-8 build
        run: |
          sudo apt-get -qqq update
          make gcc8install
          CC=gcc-8 CFLAGS="-Werror" make -j all

  implicit-fall-through:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: -Wimplicit-fallthrough build
        run: |
          make clean
          CC=gcc MOREFLAGS="-Werror -Wimplicit-fallthrough=2 -O0" make -C lib -j libzstd.a ZSTD_LEGACY_SUPPORT=0
          make clean
          CC=clang MOREFLAGS="-Werror -Wimplicit-fallthrough -O0" make -C lib -j libzstd.a ZSTD_LEGACY_SUPPORT=0

  cmake-visual-2019:
    runs-on: windows-2019
    strategy:
      matrix:
        include:
          - generator: "Visual Studio 16 2019"
            flags: "-A x64"
          - generator: "Visual Studio 16 2019"
            flags: "-A Win32"
          - generator: "MinGW Makefiles"
    steps:
    - uses: actions/checkout@v3
    - name: Add MSBuild to PATH
      uses: microsoft/setup-msbuild@v1.0.2
    - name: Build
      working-directory: ${{env.GITHUB_WORKSPACE}}
      run: |
        cd build\cmake
        mkdir build
        cd build
        cmake.exe -G "${{matrix.generator}}" ${{matrix.flags}} ..
        cmake.exe --build .

  visual-2019:
    runs-on: windows-2019
    strategy:
      matrix:
        platform: [x64, Win32]
        configuration: [Debug, Release]
    steps:
    - uses: actions/checkout@v3
    - name: Add MSBuild to PATH
      uses: microsoft/setup-msbuild@v1.0.2
    - name: Build
      working-directory: ${{env.GITHUB_WORKSPACE}}
      # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
      run: >
        msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v142
        /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}}

# TODO: fix as part of https://github.com/facebook/zstd/issues/3064
#  visual-2015:
#    # only GH actions windows-2016 contains VS 2015
#    runs-on: windows-2016
#    strategy:
#      matrix:
#        platform: [x64, Win32]
#        configuration: [Debug, Release]
#    steps:
#    - uses: actions/checkout@v3
#    - name: Add MSBuild to PATH
#      uses: microsoft/setup-msbuild@v1.0.2
#    - name: Build
#      working-directory: ${{env.GITHUB_WORKSPACE}}
#      run: >
#        msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140
#        /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}}

  minimal-decompressor-macros:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: minimal decompressor macros
      run: |
        make clean && make -j all ZSTD_LIB_MINIFY=1 MOREFLAGS="-Werror"
        make clean && make check ZSTD_LIB_MINIFY=1 MOREFLAGS="-Werror"
        make clean && make -j all MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X1 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT"
        make clean && make check MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X1 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT"
        make clean && make -j all MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X2 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG"
        make clean && make check MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X2 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG"
        make clean && make -j all MOREFLAGS="-Werror -DZSTD_NO_INLINE -DZSTD_STRIP_ERROR_STRINGS"
        make clean && make check MOREFLAGS="-Werror -DZSTD_NO_INLINE -DZSTD_STRIP_ERROR_STRINGS"

  dynamic-bmi2:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: dynamic bmi2 tests
      run: |
        make clean && make -j check MOREFLAGS="-O0 -Werror -mbmi2"
        make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=1"
        make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=1 -mbmi2"
        make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=0"
        make clean && make -j check MOREFLAGS="-O0 -Werror -DDYNAMIC_BMI2=0 -mbmi2"

  test-variants:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: make all variants & validate
      run: |
        make -j -C programs allVariants MOREFLAGS=-O0
        ./tests/test-variants.sh


  qemu-consistency:
    name: QEMU ${{ matrix.name }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false  # 'false' means Don't stop matrix workflows even if some matrix failed.
      matrix:
        include: [
          { name: ARM,      xcc_pkg: gcc-arm-linux-gnueabi,     xcc: arm-linux-gnueabi-gcc,     xemu_pkg: qemu-system-arm,    xemu: qemu-arm-static     },
          { name: ARM64,    xcc_pkg: gcc-aarch64-linux-gnu,     xcc: aarch64-linux-gnu-gcc,     xemu_pkg: qemu-system-arm,    xemu: qemu-aarch64-static },
          { name: PPC,      xcc_pkg: gcc-powerpc-linux-gnu,     xcc: powerpc-linux-gnu-gcc,     xemu_pkg: qemu-system-ppc,    xemu: qemu-ppc-static     },
          { name: PPC64LE,  xcc_pkg: gcc-powerpc64le-linux-gnu, xcc: powerpc64le-linux-gnu-gcc, xemu_pkg: qemu-system-ppc,    xemu: qemu-ppc64le-static },
          { name: S390X,    xcc_pkg: gcc-s390x-linux-gnu,       xcc: s390x-linux-gnu-gcc,       xemu_pkg: qemu-system-s390x,  xemu: qemu-s390x-static   },
          { name: MIPS,     xcc_pkg: gcc-mips-linux-gnu,        xcc: mips-linux-gnu-gcc,        xemu_pkg: qemu-system-mips,   xemu: qemu-mips-static    },
          { name: M68K,     xcc_pkg: gcc-m68k-linux-gnu,        xcc: m68k-linux-gnu-gcc,        xemu_pkg: qemu-system-m68k,   xemu: qemu-m68k-static    },
        ]
    env:                        # Set environment variables
      XCC: ${{ matrix.xcc }}
      XEMU: ${{ matrix.xemu }}
    steps:
    - uses: actions/checkout@v3
    - name: apt update & install
      run: |
        sudo apt-get update
        sudo apt-get install gcc-multilib g++-multilib qemu-utils qemu-user-static
        sudo apt-get install ${{ matrix.xcc_pkg }} ${{ matrix.xemu_pkg }}
    - name: Environment info
      run: |
        echo && which $XCC
        echo && $XCC --version
        echo && $XCC -v  # Show built-in specs
        echo && which $XEMU
        echo && $XEMU --version
    - name: ARM
      if: ${{ matrix.name == 'ARM' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: ARM64
      if: ${{ matrix.name == 'ARM64' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: PPC
      if: ${{ matrix.name == 'PPC' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: PPC64LE
      if: ${{ matrix.name == 'PPC64LE' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: S390X
      if: ${{ matrix.name == 'S390X' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: MIPS
      if: ${{ matrix.name == 'MIPS' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check
    - name: M68K
      if: ${{ matrix.name == 'M68K' }}
      run: |
        LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check

  mingw-short-test:
    runs-on: windows-2019
    strategy:
      fail-fast: false
      matrix:
        include: [
          { compiler: gcc, platform: x64, script: "CFLAGS=-Werror make -j allzstd DEBUGLEVEL=2"},
          { compiler: gcc, platform: x86, script: "CFLAGS=-Werror make -j allzstd"},
          { compiler: clang, platform: x64, script: "CFLAGS='--target=x86_64-w64-mingw32 -Werror -Wconversion -Wno-sign-conversion' make -j allzstd V=1"},
        ]
    steps:
    - uses: actions/checkout@v3
    - name: Mingw short test
      run: |
        ECHO "Building ${{matrix.compiler}} ${{matrix.platform}}"
        $env:PATH_ORIGINAL = $env:PATH
        $env:PATH_MINGW32 = "C:\msys64\mingw32\bin"
        $env:PATH_MINGW64 = "C:\msys64\mingw64\bin"
        COPY C:\msys64\usr\bin\make.exe C:\msys64\mingw32\bin\make.exe
        COPY C:\msys64\usr\bin\make.exe C:\msys64\mingw64\bin\make.exe
        IF ("${{matrix.platform}}" -eq "x64")
        {
            $env:PATH = $env:PATH_MINGW64 + ";" + $env:PATH_ORIGINAL
        }
        ELSEIF ("${{matrix.platform}}" -eq "x86")
        {
            $env:PATH = $env:PATH_MINGW32 + ";" + $env:PATH_ORIGINAL
        }
        make -v
        sh -c "${{matrix.compiler}} -v"
        $env:CC = "${{matrix.compiler}}"
        sh -c "${{matrix.script}}"
        ECHO "Testing ${{matrix.compiler}} ${{matrix.platform}}"
        make clean
        make check


  visual-runtime-tests:
    runs-on: windows-2019
    strategy:
      matrix:
        platform: [x64, Win32]
        configuration: [Release]
    steps:
    - uses: actions/checkout@v3
    - name: Add MSBuild to PATH
      uses: microsoft/setup-msbuild@v1.0.2
    - name: Build and run tests
      working-directory: ${{env.GITHUB_WORKSPACE}}
      env:
        ZSTD_BIN: ./zstd.exe
        DATAGEN_BIN: ./datagen.exe
      # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
      run: |
        msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v142 /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}}
        COPY build\VS2010\bin\${{matrix.platform}}_${{matrix.configuration}}\*.exe tests\
        CD tests
        sh -e playTests.sh
        DIR
        .\fuzzer.exe -T2m

  intel-cet-compatibility:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Build Zstd
      run: |
        make -j zstd V=1
        readelf -n zstd
    - name: Get Intel SDE
      run: |
        curl -LO https://downloadmirror.intel.com/684899/sde-external-9.0.0-2021-11-07-lin.tar.xz
        tar xJvf sde-external-9.0.0-2021-11-07-lin.tar.xz
    - name: Configure Permissions
      run: |
        echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
    - name: Run Under SDE
      run: |
        sde-external-9.0.0-2021-11-07-lin/sde -cet -cet-raise 0 -cet-endbr-exe -cet-stderr -cet-abort -- ./zstd -b3

  pkg-config:
    runs-on: ubuntu-latest
    container:
      image: debian:testing
    steps:
      - uses: actions/checkout@v3
      - name: Install dependencies
        run: |
          apt -y update
          apt -y install --no-install-recommends gcc libc6-dev make pkg-config
      - name: Build and install
        run: make -C lib install
      - name: Test pkg-config
        run: |
          cc -Wall -Wextra -Wpedantic -Werror -o simple examples/simple_compression.c $(pkg-config --cflags --libs libzstd)
          ./simple LICENSE


# This test currently fails on Github Actions specifically.
# Possible reason : TTY emulation.
# Note that the same test works fine locally and on travisCI.
# This will have to be fixed before transferring the test to GA.
#  versions-compatibility:
#    runs-on: ubuntu-latest
#    steps:
#    - uses: actions/checkout@v3
#    - name: Versions Compatibility Test
#      run: |
#        make -C tests versionsTest


# For reference : icc tests
# icc tests are currently failing on Github Actions, likely to issues during installation stage
# To be fixed later
#
#  icc:
#    name: icc-check
#    runs-on: ubuntu-latest
#    steps:
#    - name: install icc
#      run: |
#        export DEBIAN_FRONTEND=noninteractive
#        sudo apt-get -qqq update
#        sudo apt-get install -y wget build-essential pkg-config cmake ca-certificates gnupg
#        sudo wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2023.PUB
#        sudo apt-key add GPG-PUB-KEY-INTEL-SW-PRODUCTS-2023.PUB
#        sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main"
#        sudo apt-get update
#        sudo apt-get install -y intel-basekit intel-hpckit
#    - uses: actions/checkout@v3
#    - name: make check
#      run: |
#        make CC=/opt/intel/oneapi/compiler/latest/linux/bin/intel64/icc check
