name: Ubuntu-Macos-Windows Tests

# START OF COMMON SECTION
on:
  push:
    branches: [ 'master', 'main', 'release/**' ]
  pull_request:
    branches: [ '*' ]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true
# END OF COMMON SECTION

jobs:
  make_check:
    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-22.04, macos-latest ]
        config: [
          # Add new configs here
          '',
          '--enable-all --enable-asn=template',
          '--enable-all --enable-asn=original',
          '--enable-harden-tls',
          '--enable-tls13 --enable-session-ticket --enable-dtls --enable-dtls13
             --enable-opensslextra --enable-sessioncerts
             CPPFLAGS=''-DWOLFSSL_DTLS_NO_HVR_ON_RESUME -DHAVE_EXT_CACHE
             -DWOLFSSL_TICKET_HAVE_ID -DHAVE_EX_DATA -DSESSION_CACHE_DYNAMIC_MEM'' ',
          '--enable-all --enable-secure-renegotiation',
          '--enable-all --enable-haproxy --enable-quic',
          '--enable-dtls --enable-dtls13 --enable-earlydata
             --enable-session-ticket --enable-psk
             CPPFLAGS=''-DWOLFSSL_DTLS13_NO_HRR_ON_RESUME'' ',
          '--enable-experimental --enable-kyber --enable-dtls --enable-dtls13
             --enable-dtls-frag-ch',
          '--enable-all --enable-dtls13 --enable-dtls-frag-ch',
          '--enable-dtls --enable-dtls13 --enable-dtls-frag-ch
           --enable-dtls-mtu',
          '--enable-dtls --enable-dtlscid --enable-dtls13 --enable-secure-renegotiation
            --enable-psk --enable-aesccm --enable-nullcipher CPPFLAGS=-DWOLFSSL_STATIC_RSA',
        ]
    name: make check
    if: github.repository_owner == 'wolfssl'
    runs-on: ${{ matrix.os }}
    # This should be a safe limit for the tests to run.
    timeout-minutes: 14
    steps:
      - name: Build and test wolfSSL
        uses: wolfSSL/actions-build-autotools-project@v1
        with:
          configure: ${{ matrix.config }}
          check: true

  make_user_settings:
    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-22.04, macos-latest ]
        user-settings: [
          # Add new user_settings.h here
          'examples/configs/user_settings_all.h',
        ]
    name: make user_setting.h
    if: github.repository_owner == 'wolfssl'
    runs-on: ${{ matrix.os }}
    # This should be a safe limit for the tests to run.
    timeout-minutes: 14
    steps:
      - name: Build and test wolfSSL
        uses: wolfSSL/actions-build-autotools-project@v1
        with:
          configure: --enable-usersettings
          check: true
          user-settings: ${{ matrix.user-settings }}

  make_user_settings_testwolfcrypt:
    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-22.04, macos-latest ]
        user-settings: [
          # Add new user_settings.h here
          'examples/configs/user_settings_min_ecc.h',
          'examples/configs/user_settings_wolfboot_keytools.h',
          'examples/configs/user_settings_wolftpm.h',
          'examples/configs/user_settings_wolfssh.h',
          'examples/configs/user_settings_tls12.h',
        ]
    name: make user_setting.h (testwolfcrypt only)
    if: github.repository_owner == 'wolfssl'
    runs-on: ${{ matrix.os }}
    # This should be a safe limit for the tests to run.
    timeout-minutes: 14
    steps:
      - name: Build and test wolfSSL
        uses: wolfSSL/actions-build-autotools-project@v1
        with:
          configure: --enable-usersettings --disable-examples
          check: false
          user-settings: ${{ matrix.user-settings }}

      - name: Run wolfcrypt/test/testwolfcrypt
        run: ./wolfcrypt/test/testwolfcrypt

  # Has to be dedicated function due to the sed call
  make_user_all:
    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-22.04, macos-latest ]
    name: make user_setting.h (with sed)
    if: github.repository_owner == 'wolfssl'
    runs-on: ${{ matrix.os }}
    # This should be a safe limit for the tests to run.
    timeout-minutes: 14
    steps:
    - uses: actions/checkout@v4
    - if: ${{ matrix.os == 'macos-latest' }}
      run: brew install automake libtool
    - run: ./autogen.sh
    - name: user_settings_all.h with compatibility layer
      run: |
        cp ./examples/configs/user_settings_all.h user_settings.h
        sed -i -e "s/if 0/if 1/" user_settings.h
        ./configure --enable-usersettings
        make
        make check

  windows_build:
    name: Windows Build Test
    if: github.repository_owner == 'wolfssl'
    runs-on: windows-latest
    strategy:
      fail-fast: false
      matrix:
        arch: [ x64, Win32, ARM64 ]
    # This should be a safe limit for the tests to run.
    timeout-minutes: 6
    env:
      # Path to the solution file relative to the root of the project.
      SOLUTION_FILE_PATH: wolfssl64.sln

      # Configuration type to build.
      # You can convert this to a build matrix if you need coverage of multiple configuration types.
      # https://docs.github.com/actions/learn-github-actions/managing-complex-workflows#using-a-build-matrix
      BUILD_CONFIGURATION: Release
    steps:
    - uses: actions/checkout@v4

    - name: Add MSBuild to PATH
      uses: microsoft/setup-msbuild@v2

    - name: Restore NuGet packages
      working-directory: ${{env.GITHUB_WORKSPACE}}
      run: nuget restore ${{env.SOLUTION_FILE_PATH}}

    - name: Build
      working-directory: ${{env.GITHUB_WORKSPACE}}
      # Add additional options to the MSBuild command line here (like platform or verbosity level).
      # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
      run: msbuild /m /p:PlatformToolset=v142 /p:Platform=${{matrix.arch}} /p:Configuration=${{env.BUILD_CONFIGURATION}} ${{env.SOLUTION_FILE_PATH}}

    - if: ${{ matrix.arch != 'ARM64' }}
      name: Run Test
      working-directory: ${{env.GITHUB_WORKSPACE}}
      run: Release/${{matrix.arch}}/testsuite.exe