name: dev-long-tests
# Tests longer than 10mn

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

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

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

  # lasts ~24mn
  make-test:
    runs-on: ubuntu-latest
    env:
      DEVNULLRIGHTS: 1
      READFROMBLOCKDEVICE: 1
    steps:
    - uses: actions/checkout@v3
    - name: make test
      run: make test

  # lasts ~26mn
  make-test-osx:
    runs-on: macos-latest
    steps:
    - uses: actions/checkout@v3
    - name: OS-X test
      run: make test # make -c lib all doesn't work because of the fact that it's not a tty

  no-intrinsics-fuzztest:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: no intrinsics fuzztest
      run: MOREFLAGS="-DZSTD_NO_INTRINSICS" make -C tests fuzztest

  tsan-zstreamtest:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: thread sanitizer zstreamtest
      run: CC=clang ZSTREAM_TESTTIME=-T3mn make tsan-test-zstream

  ubsan-zstreamtest:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: undefined behavior sanitizer zstreamtest
      run: CC=clang make uasan-test-zstream

  # lasts ~15mn
  tsan-fuzztest:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: thread sanitizer fuzztest
      run: CC=clang make tsan-fuzztest

  # lasts ~23mn
  gcc-8-asan-ubsan-testzstd:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: gcc-8 + ASan + UBSan + Test Zstd
      run: |
        sudo apt-get -qqq update
        make gcc8install
        CC=gcc-8 make -j uasan-test-zstd </dev/null V=1

  clang-asan-ubsan-testzstd:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: clang + ASan + UBSan + Test Zstd
      run: CC=clang make -j uasan-test-zstd </dev/null V=1

  gcc-asan-ubsan-testzstd-32bit:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: ASan + UBSan + Test Zstd, 32bit mode
      run: |
        sudo apt-get -qqq update
        make libc6install
        make -j uasan-test-zstd32 V=1

    # Note : external libraries must be turned off when using MSAN tests,
    # because they are not msan-instrumented,
    # so any data coming from these libraries is always considered "uninitialized"

  gcc-8-asan-ubsan-fuzz:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: gcc-8 + ASan + UBSan + Fuzz Test
      run: |
        sudo apt-get -qqq update
        make gcc8install
        CC=gcc-8 FUZZER_FLAGS="--long-tests" make clean uasan-fuzztest

  clang-asan-ubsan-fuzz:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: clang + ASan + UBSan + Fuzz Test
      run: CC=clang FUZZER_FLAGS="--long-tests" make clean uasan-fuzztest

  gcc-asan-ubsan-fuzz32:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: ASan + UBSan + Fuzz Test 32bit
      run: |
        sudo apt-get -qqq update
        make libc6install
        CFLAGS="-O3 -m32" FUZZER_FLAGS="--long-tests" make uasan-fuzztest

  clang-asan-ubsan-fuzz32:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: clang + ASan + UBSan + Fuzz Test 32bit
      run: |
        sudo apt-get -qqq update
        make libc6install
        CC=clang CFLAGS="-O3 -m32" FUZZER_FLAGS="--long-tests" make uasan-fuzztest

  asan-ubsan-regression:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: ASan + UBSan + Regression Test
      run: make -j uasanregressiontest

  clang-ubsan-regression:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: clang + ASan + UBSan + Regression Test
      run: CC=clang make -j uasanregressiontest

  msan-regression:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: MSan + Regression Test
      run: make -j msanregressiontest

  clang-msan-fuzz:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: clang + MSan + Fuzz Test
      run: |
        sudo apt-get -qqq update
        sudo apt-get install clang
        CC=clang FUZZER_FLAGS="--long-tests" make clean msan-fuzztest

  # lasts ~24mn
  clang-msan-testzstd:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: clang + MSan + Test Zstd
      run: |
        sudo apt-get update
        sudo apt-get install clang
        CC=clang make msan-test-zstd HAVE_ZLIB=0 HAVE_LZ4=0 HAVE_LZMA=0 V=1

  armfuzz:
      runs-on: ubuntu-latest
      steps:
      - uses: actions/checkout@v3
      - name: Qemu ARM emulation + Fuzz Test
        run: |
          sudo apt-get -qqq update
          make arminstall
          make armfuzz

  valgrind-fuzz-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: valgrind + fuzz test stack mode    # ~ 7mn
      shell: 'script -q -e -c "bash {0}"'
      run: |
        sudo apt-get -qqq update
        make valgrindinstall
        make -C tests test-valgrind
        make clean
        make -C tests test-fuzzer-stackmode

  mingw-long-test:
    runs-on: windows-2019
    strategy:
      fail-fast: false
      matrix:
        include: [
          { compiler: clang, platform: x64, action: build, script: "MOREFLAGS='--target=x86_64-w64-mingw32 -Werror -Wconversion -Wno-sign-conversion -Wno-unused-command-line-argument -Wno-implicit-int-float-conversion' make -j allzstd V=1"},
          { compiler: gcc, platform: x64, action: test, script: ""},
        ]
    steps:
    - uses: actions/checkout@v3
    - name: Mingw long test
      run: |
        $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
        }
        IF ("${{matrix.action}}" -eq "build")
        {
          make -v
          sh -c "${{matrix.compiler}} -v"
          ECHO "Building zlib to static link"
          $env:CC = "${{matrix.compiler}}"
          sh -c "cd .. && git clone --depth 1 --branch v1.2.11 https://github.com/madler/zlib"
          sh -c "cd ../zlib && make -f win32/Makefile.gcc libz.a"
          ECHO "Building zstd"
          $env:CPPFLAGS = "-I../../zlib"
          $env:LDFLAGS = "../../zlib/libz.a"
          sh -c "${{matrix.script}}"
        }
        ELSEIF ("${{matrix.action}}" -eq "test")
        {
            ECHO "Testing ${{matrix.compiler}} ${{matrix.platform}}"
            $env:CC = "gcc"
            $env:CXX = "g++"
            MKDIR build\cmake\build
            CD build\cmake\build
            $env:FUZZERTEST = "-T2mn"
            $env:ZSTREAM_TESTTIME = "-T2mn"
            cmake -G "Visual Studio 14 2015 Win64" ..
            cd ..\..\..
            make clean
        }

  # lasts ~20mn
  oss-fuzz:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        sanitizer: [address, undefined, memory]
    steps:
    - name: Build Fuzzers (${{ matrix.sanitizer }})
      id: build
      uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
      with:
        oss-fuzz-project-name: 'zstd'
        dry-run: false
        sanitizer: ${{ matrix.sanitizer }}
    - name: Run Fuzzers (${{ matrix.sanitizer }})
      uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
      with:
        oss-fuzz-project-name: 'zstd'
        fuzz-seconds: 600
        dry-run: false
        sanitizer: ${{ matrix.sanitizer }}
    - name: Upload Crash
      uses: actions/upload-artifact@v1
      if: failure() && steps.build.outcome == 'success'
      with:
        name: ${{ matrix.sanitizer }}-artifacts
        path: ./out/artifacts
