# Following tests are run _only_ on master branch
# To reproduce these tests, it's possible to push into a branch `appveyorTest`
# or a branch `visual*`, they will intentionnally trigger `master` tests

-
  version: 1.0.{build}
  branches:
    only:
    - master
    - appveyorTest
    - /visual*/
  environment:
    matrix:
    - COMPILER: "gcc"
      HOST:     "mingw"
      PLATFORM: "x64"
      SCRIPT:   "make allzstd MOREFLAGS=-static && make -C tests fullbench-lib"
      ARTIFACT: "true"
      BUILD:    "true"
    - COMPILER: "gcc"
      HOST:     "mingw"
      PLATFORM: "x86"
      SCRIPT:   "make allzstd MOREFLAGS=-static"
      ARTIFACT: "true"
      BUILD:    "true"
    - COMPILER: "clang"
      HOST:     "mingw"
      PLATFORM: "x64"
      SCRIPT:   "MOREFLAGS='--target=x86_64-w64-mingw32 -Werror -Wconversion -Wno-sign-conversion' make allzstd"
      BUILD:    "true"

    - COMPILER: "gcc"
      HOST:     "mingw"
      PLATFORM: "x64"
      SCRIPT:   ""
      TEST:     "cmake"

    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "x64"
      CONFIGURATION: "Debug"
    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "Win32"
      CONFIGURATION: "Debug"
    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "x64"
      CONFIGURATION: "Release"
    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "Win32"
      CONFIGURATION: "Release"

  install:
  - ECHO Installing %COMPILER% %PLATFORM% %CONFIGURATION%
  - SET PATH_ORIGINAL=%PATH%
  - if [%HOST%]==[mingw] (
      SET "PATH_MINGW32=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin" &&
      SET "PATH_MINGW64=C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin" &&
      COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin\make.exe &&
      COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin\make.exe
    )
  - IF [%HOST%]==[visual] IF [%PLATFORM%]==[x64] (
      SET ADDITIONALPARAM=/p:LibraryPath="C:\Program Files\Microsoft SDKs\Windows\v7.1\lib\x64;c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64;C:\Program Files (x86)\Microsoft Visual Studio 10.0\;C:\Program Files (x86)\Microsoft Visual Studio 10.0\lib\amd64;"
    )

  build_script:
  - if [%HOST%]==[mingw] (
      ( if [%PLATFORM%]==[x64] (
        SET "PATH=%PATH_MINGW64%;%PATH_ORIGINAL%"
      ) else if [%PLATFORM%]==[x86] (
        SET "PATH=%PATH_MINGW32%;%PATH_ORIGINAL%"
      ) )
    )
  - if [%HOST%]==[mingw] if [%BUILD%]==[true] (
      make -v &&
      sh -c "%COMPILER% -v" &&
      ECHO Building zlib to static link &&
      SET "CC=%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 &&
      SET "CPPFLAGS=-I../../zlib" &&
      SET "LDFLAGS=../../zlib/libz.a" &&
      sh -c "%SCRIPT%" &&
      ( if [%COMPILER%]==[gcc] if [%ARTIFACT%]==[true]
          ECHO Creating artifacts &&
          ECHO %cd% &&
          lib\dll\example\build_package.bat &&
          make -C programs DEBUGFLAGS= clean zstd &&
          cd programs\ && 7z a -tzip -mx9 zstd-win-binary-%PLATFORM%.zip zstd.exe &&
          appveyor PushArtifact zstd-win-binary-%PLATFORM%.zip &&
          cp zstd.exe ..\bin\zstd.exe &&
          git clone --depth 1 --branch master https://github.com/facebook/zstd &&
          cd zstd &&
          git archive --format=tar master -o zstd-src.tar &&
          ..\zstd -19 zstd-src.tar &&
          appveyor PushArtifact zstd-src.tar.zst &&
          certUtil -hashfile zstd-src.tar.zst SHA256 > zstd-src.tar.zst.sha256.sig &&
          appveyor PushArtifact zstd-src.tar.zst.sha256.sig &&
          cd ..\..\bin\ &&
          7z a -tzip -mx9 zstd-win-release-%PLATFORM%.zip * &&
          appveyor PushArtifact zstd-win-release-%PLATFORM%.zip
      )
    )
  - if [%HOST%]==[visual] (
      ECHO *** &&
      ECHO *** Building Visual Studio 2008 %PLATFORM%\%CONFIGURATION% in %APPVEYOR_BUILD_FOLDER% &&
      ECHO *** &&
      msbuild "build\VS2008\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v90 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2008\bin\%PLATFORM%\%CONFIGURATION%\*.exe &&
      MD5sum build/VS2008/bin/%PLATFORM%/%CONFIGURATION%/*.exe &&
      COPY build\VS2008\bin\%PLATFORM%\%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2008_%PLATFORM%_%CONFIGURATION%.exe &&
      ECHO *** &&
      ECHO *** Building Visual Studio 2010 %PLATFORM%\%CONFIGURATION% &&
      ECHO *** &&
      msbuild "build\VS2010\zstd.sln" %ADDITIONALPARAM% /m /verbosity:minimal /property:PlatformToolset=v100 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe &&
      MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe &&
      msbuild "build\VS2010\zstd.sln" %ADDITIONALPARAM% /m /verbosity:minimal /property:PlatformToolset=v100 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe &&
      MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe &&
      COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2010_%PLATFORM%_%CONFIGURATION%.exe &&
      ECHO *** &&
      ECHO *** Building Visual Studio 2012 %PLATFORM%\%CONFIGURATION% &&
      ECHO *** &&
      msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v110 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe &&
      MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe &&
      msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v110 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe &&
      MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe &&
      COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2012_%PLATFORM%_%CONFIGURATION%.exe &&
      ECHO *** &&
      ECHO *** Building Visual Studio 2013 %PLATFORM%\%CONFIGURATION% &&
      ECHO *** &&
      msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v120 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe &&
      MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe &&
      msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v120 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe &&
      MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe &&
      COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2013_%PLATFORM%_%CONFIGURATION%.exe &&
      ECHO *** &&
      ECHO *** Building Visual Studio 2015 %PLATFORM%\%CONFIGURATION% &&
      ECHO *** &&
      msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe &&
      MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe &&
      msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe &&
      MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe &&
      COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2015_%PLATFORM%_%CONFIGURATION%.exe &&
      COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe tests\
    )

  test_script:
  - ECHO Testing %COMPILER% %PLATFORM% %CONFIGURATION%
  - SET "CC=gcc"
  - SET "CXX=g++"
  - if [%TEST%]==[cmake] (
      mkdir build\cmake\build &&
      cd build\cmake\build &&
      cmake -G "Visual Studio 14 2015 Win64" .. &&
      cd ..\..\.. &&
      make clean
    )
  - SET "FUZZERTEST=-T30s"
  - if [%HOST%]==[visual] if [%CONFIGURATION%]==[Release] (
      CD tests &&
      SET ZSTD_BIN=./zstd.exe&&
      SET DATAGEN_BIN=./datagen.exe&&
      sh -e playTests.sh --test-large-data &&
      fullbench.exe -i1 &&
      fullbench.exe -i1 -P0 &&
      fuzzer_VS2012_%PLATFORM%_Release.exe %FUZZERTEST% &&
      fuzzer_VS2013_%PLATFORM%_Release.exe %FUZZERTEST% &&
      fuzzer_VS2015_%PLATFORM%_Release.exe %FUZZERTEST%
    )


# The following tests are for regular pushes
# into `dev` or some feature branch
# There run less tests, for shorter feedback loop

-
  version: 1.0.{build}
  environment:
    matrix:
    - COMPILER: "gcc"
      HOST:     "cygwin"
      PLATFORM: "x64"
    - COMPILER: "gcc"
      HOST:     "mingw"
      PLATFORM: "x64"
      SCRIPT:   "CPPFLAGS=-DDEBUGLEVEL=2 CFLAGS=-Werror make -j allzstd DEBUGLEVEL=2"
    - COMPILER: "gcc"
      HOST:     "mingw"
      PLATFORM: "x86"
      SCRIPT:   "CFLAGS=-Werror make -j allzstd"
    - COMPILER: "clang"
      HOST:     "mingw"
      PLATFORM: "x64"
      SCRIPT:   "CFLAGS='--target=x86_64-w64-mingw32 -Werror -Wconversion -Wno-sign-conversion' make -j allzstd"

    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "x64"
      CONFIGURATION: "Debug"
    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "Win32"
      CONFIGURATION: "Debug"
    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "x64"
      CONFIGURATION: "Release"
    - COMPILER: "visual"
      HOST:     "visual"
      PLATFORM: "Win32"
      CONFIGURATION: "Release"

  install:
  - ECHO Installing %COMPILER% %PLATFORM% %CONFIGURATION%
  - SET PATH_ORIGINAL=%PATH%
  - if [%HOST%]==[cygwin] (
      ECHO Installing Cygwin Packages &&
      C:\cygwin64\setup-x86_64.exe -qnNdO -R "C:\cygwin64" -g -P ^
        gcc-g++,^
        gcc,^
        cmake,^
        make
    )
  - if [%HOST%]==[mingw] (
      SET "PATH_MINGW32=C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin" &&
      SET "PATH_MINGW64=C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin" &&
      COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\i686-6.3.0-posix-dwarf-rt_v5-rev1\mingw32\bin\make.exe &&
      COPY C:\msys64\usr\bin\make.exe C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin\make.exe
    )
  - IF [%HOST%]==[visual] IF [%PLATFORM%]==[x64] (
      SET ADDITIONALPARAM=/p:LibraryPath="C:\Program Files\Microsoft SDKs\Windows\v7.1\lib\x64;c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64;C:\Program Files (x86)\Microsoft Visual Studio 10.0\;C:\Program Files (x86)\Microsoft Visual Studio 10.0\lib\amd64;"
    )

  build_script:
  - ECHO Building %COMPILER% %PLATFORM% %CONFIGURATION%
  - if [%HOST%]==[cygwin] (
      set CHERE_INVOKING=yes &&
      set CC=%COMPILER% &&
      C:\cygwin64\bin\bash --login -c "
        set -e;
        cd build/cmake;
        CFLAGS='-Werror' cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug -DZSTD_BUILD_TESTS:BOOL=ON -DZSTD_FUZZER_FLAGS=-T30s -DZSTD_ZSTREAM_FLAGS=-T30s .;
        make -j4;
        ctest -V -L Medium;
      "
    )
  - if [%HOST%]==[mingw] (
      ( if [%PLATFORM%]==[x64] (
        SET "PATH=%PATH_MINGW64%;%PATH_ORIGINAL%"
      ) else if [%PLATFORM%]==[x86] (
        SET "PATH=%PATH_MINGW32%;%PATH_ORIGINAL%"
      ) ) &&
      make -v &&
      sh -c "%COMPILER% -v" &&
      set "CC=%COMPILER%" &&
      sh -c "%SCRIPT%"
    )
  - if [%HOST%]==[visual] (
      ECHO *** &&
      ECHO *** Building Visual Studio 2015 %PLATFORM%\%CONFIGURATION% &&
      ECHO *** &&
      msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 /p:ForceImportBeforeCppTargets=%APPVEYOR_BUILD_FOLDER%\build\VS2010\CompileAsCpp.props /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe &&
      MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe &&
      msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 /t:Clean,Build /p:Platform=%PLATFORM% /p:Configuration=%CONFIGURATION% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" &&
      DIR build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe &&
      MD5sum build/VS2010/bin/%PLATFORM%_%CONFIGURATION%/*.exe &&
      COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\fuzzer.exe tests\fuzzer_VS2015_%PLATFORM%_%CONFIGURATION%.exe &&
      COPY build\VS2010\bin\%PLATFORM%_%CONFIGURATION%\*.exe tests\
    )


  test_script:
  - ECHO Testing %COMPILER% %PLATFORM% %CONFIGURATION%
  - if [%HOST%]==[mingw] (
      set "CC=%COMPILER%" &&
      make check
    )
