name: Run Cygwin-based tests

on: [pull_request,workflow_dispatch]

concurrency:  
  group: ${{ github.workflow}}-${{ github.head_ref }}  
  cancel-in-progress: true

env:
  SHELLOPTS: igncr
  CHERE_INVOKING: 1
  CYGWIN_NOWINPATH: 1
  REMOTETESTDOWN: ${{ vars.REMOTETESTDOWN }}

jobs:
  build-and-test-autotools:
    runs-on: windows-latest
    defaults:
      run:
        shell: C:/cygwin/bin/bash.exe -eo pipefail -o igncr "{0}"

    name: Cygwin-based Autotools tests
    
    strategy:
      matrix:
        plugin_dir_option: ["", "--without-plugin-dir"]

    steps:
      - name: Fix line endings
        shell: pwsh
        run: git config --global core.autocrlf input

      - uses: actions/checkout@v4

      - uses: cygwin/cygwin-install-action@v4
        with:
          platform: x86_64
          install-dir: 'C:\cygwin'
          packages: >-
            git automake libtool autoconf2.5 make libhdf5-devel
            libhdf4-devel zipinfo libxml2-devel perl zlib-devel
            libzstd-devel libbz2-devel libaec-devel libzip-devel
            libdeflate-devel gcc-core gcc-g++ libcurl-devel libiconv-devel
            libssl-devel libcrypt-devel attr libattr-devel

      - name: (Autotools) Run autoconf and friends
        run: |
          cp -f /bin/dash /bin/sh
          mkdir m4
          /bin/dash /usr/bin/libtoolize --force --copy --verbose
          /usr/bin/autoreconf-2.69 --force --install --verbose --debug

      - name: (Autotools) Configure in-tree build
        run: >-
          /bin/dash ./configure --enable-hdf5 --enable-shared
          --disable-static --enable-dap --disable-dap-remote-tests
          --enable-plugins ${{ matrix.plugin_dir_option }}
          --disable-nczarr --disable-nczarr-filters
          --disable-s3 --with-s3-testing=no


      - name: Look at config.log if error
        if: ${{ failure() }}
        run: cat config.log

      - name: Print summary
        run: cat libnetcdf.settings

      - name: (Autotools) Build library and utilities
        run: make -j8 SHELL=/bin/dash

      - name: (Autotools) Test DESTDIR install
        run: |
          make install DESTDIR=/tmp/pretend-root SHELL=/bin/dash
          if [ -d "/tmp/pretend-root/$(pwd)" ];
          then
              find /tmp/pretend-root/$(pwd)
              if [ $(find /tmp/pretend-root/$(pwd) -type f | wc -l) -gt 0 ]; then exit 1; fi
          fi

      - name: (Autotools) Build tests
        timeout-minutes: 30
        run: |
          make check -j$(nproc) TESTS="" SHELL=/bin/dash

      - name: (Autotools) Run tests
        timeout-minutes: 30
        run: |
          make check -j$(nproc) SHELL=/bin/dash

      - name: Upload autoconf test results
        uses: actions/upload-artifact@v4
        with:
          name: cygwin-autotools-test-logs-${{ matrix.plugin_dir_option }}
          path: |
            */*.log
            */*.trs
  
  build-and-test-cmake:
    name: Cygwin-based CMake tests
    runs-on: windows-latest
    defaults:
      run:
        shell: C:/cygwin/bin/bash.exe -eo pipefail -o igncr "{0}"

    steps:

      - run: git config --global core.autocrlf input
        shell: pwsh
      - uses: actions/checkout@v4
      - uses: cygwin/cygwin-install-action@v4
        with:
          platform: x86_64
          install-dir: 'C:\cygwin'
          packages: >-
            git automake libtool autoconf2.5 make libhdf5-devel
            libhdf4-devel zipinfo libxml2-devel perl zlib-devel
            libzstd-devel libbz2-devel libaec-devel libzip-devel
            libdeflate-devel gcc-core gcc-g++ libcurl-devel libiconv-devel
            libssl-devel libcrypt-devel cmake ninja make m4 diffutils unzip

###
# Configure and build
###

      - name: (CMake) Configure Build
        env:
          MAKE: "/usr/bin/make"
          CXX: "/usr/bin/g++"
        run: |
          /usr/bin/cmake \
          -G"Unix Makefiles" \
          -B build \
          -S . \
          -DCMAKE_INSTALL_PREFIX=/tmp \
          -DBUILD_SHARED_LIBS=ON \
          -DNETCDF_ENABLE_NETCDF_4=ON \
          -DNETCDF_BUILD_UTILITIES=ON \
          -DNETCDF_ENABLE_TESTS=ON \
          -DNETCDF_ENABLE_HDF5=ON \
          -DNETCDF_ENABLE_NCZARR=TRUE \
          -DNETCDF_ENABLE_PLUGINS=ON
        if: ${{ success() }}

      - name: (CMake) Look at CMakeCache.txt if error
        run: cat build/CMakeCache.txt
        if: ${{ failure() }}

      - name: (CMake) Print Summary
        run: cat build/libnetcdf.settings

      - name: (CMake) Build All
        env:
          MAKE: "/usr/bin/make"
          CXX: "/usr/bin/g++"
        run: cmake --build build -j$(nproc)
        if: ${{ success() }}

      - name: (CMake) Run Tests
        run: PATH=$PWD/build:$PATH ctest --test-dir build
        if: ${{ success() }}

      - name: (CMake) Verbose output of CTest failures
        run: >-
          PATH=$PWD/build:$PATH ctest --test-dir build --output-on-failure -j$(nproc) --rerun-failed -VV
        if: ${{ failure() }}
