# Copyright 2021-2024 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License").  You may not use
# this file except in compliance with the License.  You can obtain a copy
# in the file LICENSE in the source distribution or at
# https://www.openssl.org/source/license.html

name: Windows GitHub CI

on: [pull_request, push]

permissions:
  contents: read

jobs:
  shared:
    # Run a job for each of the specified target architectures:
    strategy:
      matrix:
        platform:
          - arch: win64
            os: windows-2019
            config: enable-fips
          - arch: win64
            os: windows-2022
            config: enable-fips no-thread-pool no-quic
          - arch: win32
            os: windows-2022
            config: --strict-warnings no-fips
    runs-on: ${{ matrix.platform.os }}
    steps:
    - uses: actions/checkout@v4
    - name: checkout fuzz/corpora submodule
      run: git submodule update --init --depth 1 fuzz/corpora
    - uses: ilammy/msvc-dev-cmd@v1
      with:
        arch: ${{ matrix.platform.arch }}
    - uses: ilammy/setup-nasm@v1
      with:
        platform: ${{ matrix.platform.arch }}
    - name: prepare the build directory
      run: mkdir _build
    - name: config
      working-directory: _build
      run: |
        perl ..\Configure --banner=Configured no-makedepend -DOSSL_WINCTX=openssl ${{ matrix.platform.config }}
        perl configdata.pm --dump
    - name: build
      working-directory: _build
      run: nmake /S
    - name: download coreinfo
      uses: suisei-cn/actions-download-file@v1.6.0
      with:
        url: "https://download.sysinternals.com/files/Coreinfo.zip"
        target: _build/coreinfo/
    - name: Gather openssl version info
      working-directory: _build
      run: |
        apps/openssl.exe version -v
        apps/openssl.exe version -v | %{($_ -split '\s+')[1]} 
        apps/openssl.exe version -v | %{($_ -split '\s+')[1] -replace '([0-9]+\.[0-9]+)(\..*)','$1'} 
        echo "OSSL_VERSION=$(apps/openssl.exe version -v | %{($_ -split '\s+')[1] -replace '([0-9]+\.[0-9]+)(\..*)','$1'})" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
    - name: Set registry keys
      working-directory: _build
      run: |
        echo ${Env:OSSL_VERSION}
        reg.exe add HKLM\SOFTWARE\OpenSSL-${Env:OSSL_VERSION}-openssl /v OPENSSLDIR /t REG_EXPAND_SZ /d TESTOPENSSLDIR /reg:32
        reg.exe add HKLM\SOFTWARE\OpenSSL-${Env:OSSL_VERSION}-openssl /v ENGINESDIR /t REG_EXPAND_SZ /d TESTOPENSSLDIR /reg:32
        reg.exe add HKLM\SOFTWARE\OpenSSL-${Env:OSSL_VERSION}-openssl /v MODULESDIR /t REG_EXPAND_SZ /d TESTOPENSSLDIR /reg:32
        reg.exe query HKLM\SOFTWARE\OpenSSL-${Env:OSSL_VERSION}-openssl /v OPENSSLDIR /reg:32
    - name: get cpu info
      working-directory: _build
      continue-on-error: true
      run: |
        7z.exe x coreinfo/Coreinfo.zip
        ./Coreinfo64.exe -accepteula -f
        ./apps/openssl.exe version -c
    - name: Check platform symbol usage
      working-directory: _build
      run: perl ../util/checkplatformsyms.pl ../util/platform_symbols/windows-symbols.txt libcrypto-3-x64.dll ./libssl-3-x64.dll
    - name: test
      working-directory: _build
      run: nmake test VERBOSE_FAILURE=yes TESTS=-test_fuzz* HARNESS_JOBS=4
    - name: install
      # Run on 64 bit only as 32 bit is slow enough already
      if: ${{ matrix.platform.arch == 'win64' }}
      run: |
        mkdir _dest
        nmake install DESTDIR=_dest
      working-directory: _build
  plain:
    strategy:
      matrix:
        os:
# Reducing CI footprint  - windows-2019
          - windows-2022
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v4
    - name: checkout fuzz/corpora submodule
      run: git submodule update --init --depth 1 fuzz/corpora
    - uses: ilammy/msvc-dev-cmd@v1
    - name: prepare the build directory
      run: mkdir _build
    - name: config
      working-directory: _build
      run: |
        perl ..\Configure --banner=Configured enable-demos no-makedepend no-shared no-fips enable-md2 enable-rc5 enable-ssl3 enable-ssl3-method enable-weak-ssl-ciphers enable-trace enable-crypto-mdebug -DOSSL_WINCTX=openssl VC-WIN64A-masm
        perl configdata.pm --dump
    - name: build
      working-directory: _build
      run: nmake /S
    - name: download coreinfo
      uses: suisei-cn/actions-download-file@v1.6.0
      with:
        url: "https://download.sysinternals.com/files/Coreinfo.zip"
        target: _build/coreinfo/
    - name: get cpu info
      working-directory: _build
      continue-on-error: true
      run: |
        7z.exe x coreinfo/Coreinfo.zip
        ./Coreinfo64.exe -accepteula -f
        ./apps/openssl.exe version -c
    - name: test
      working-directory: _build
      run: nmake test VERBOSE_FAILURE=yes HARNESS_JOBS=4
  minimal:
    strategy:
      matrix:
        os:
          - windows-2019
# Reducing CI footprint  - windows-2022
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v4
    - name: checkout fuzz/corpora submodule
      run: git submodule update --init --depth 1 fuzz/corpora
    - uses: ilammy/msvc-dev-cmd@v1
    - name: prepare the build directory
      run: mkdir _build
    - name: config
      working-directory: _build
      run: |
        perl ..\Configure --banner=Configured enable-demos no-makedepend no-bulk no-deprecated no-fips no-asm no-threads -DOPENSSL_SMALL_FOOTPRINT -DOSSL_WINCTX=openssl
        perl configdata.pm --dump
    - name: build
      working-directory: _build
      run: nmake # verbose, so no /S here
    - name: download coreinfo
      uses: suisei-cn/actions-download-file@v1.6.0
      with:
        url: "https://download.sysinternals.com/files/Coreinfo.zip"
        target: _build/coreinfo/
    - name: get cpu info
      working-directory: _build
      continue-on-error: true
      run: |
        7z.exe x coreinfo/Coreinfo.zip
        ./Coreinfo64.exe -accepteula -f
        ./apps/openssl.exe version -c
    - name: test
      working-directory: _build
      run: nmake test VERBOSE_FAILURE=yes TESTS=-test_fuzz* HARNESS_JOBS=4
  cygwin:
    # Run a job for each of the specified target architectures:
    strategy:
      matrix:
        os:
          - windows-2019
# really worth while running, too? cygwin should mask this
#          - windows-2022
        platform:
          - arch: win64
            config: -DCMAKE_C_COMPILER=gcc --strict-warnings enable-demos no-fips
# are we really learning sth new from win32? So let's save some CO2 for now disabling this
#          - arch: win32
#            config: -DCMAKE_C_COMPILER=gcc --strict-warnings no-fips
    runs-on: ${{ matrix.os }}
    env:
      CYGWIN_NOWINPATH: 1
      SHELLOPTS: igncr
# Don't overwhelm github CI VMs:
      MAKE_PARAMS: -j 4
    steps:
# Checkout before cygwin can mess with PATH...
    - uses: actions/checkout@v4
    - uses: cygwin/cygwin-install-action@master
      with:
         packages: perl git make gcc-core
    - name: Check repo
      run: cygcheck -V
    - name: Full cygcheck status
      run: cygcheck -s -v -r -h
# Activate this if checkout action fails:
#    - name: Clone repo
#      run: bash -c "pwd && git clone --branch ${{ github.ref_name }} --depth 1 https://github.com/${{ github.repository }}.git"
    - name: Full build
      run: bash -c "gcc --version && ./config ${{ matrix.platform.config }} && make $MAKE_PARAMS"
# Disable testing for now. TBD: Need local cygwin installation to debug .
#    - name: Run openssl tests
#      run: bash -c "cd openssl && make V=1 test"
