name: QA Scripts

on:
  push:
    branches:
      - master
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  create-install-dir-test:
    name: create_install_path.sh
    runs-on: github-ubuntu-latest-s
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis

      - name: Existing
        shell: bash
        env:
          INSTALL_PATH: '.sonar'
        run: |
          echo "- Create dir"
          mkdir -p "${INSTALL_PATH}"

          echo "- Test script behavior"
          ./scripts/create_install_path.sh > output
          grep -v "::error::" output

      - name: Non-existing nested in current dir
        shell: bash
        env:
          INSTALL_PATH: '.sonar'
        run: |
          ./scripts/create_install_path.sh > output
          grep -v "::error::" output
          test -d "${INSTALL_PATH}"

      - name: Nonexisting nested in home
        shell: bash
        env:
          INSTALL_PATH: '~/third_party/.sonar'
        run: |
          ./scripts/create_install_path.sh > output
          grep -v "::error::" output
          test -d "${INSTALL_PATH}"

      - name: Empty install dir specified
        shell: bash
        env:
          INSTALL_PATH: ''
        run: |
          (./scripts/create_install_path.sh || echo "=== Script failed ===") > output
          grep "::error::Empty installation path specified" output
          grep "=== Script failed ===" output

      - name: No permission to create directory
        shell: bash
        env:
          INSTALL_PATH: '/non_creatable'
        run: |
          (./scripts/create_install_path.sh || echo "=== Script failed ===") > output
          grep "::error::Failed to create non-existing installation path '/non_creatable'" output
          grep "=== Script failed ===" output

      - name: Existing but not directory
        shell: bash
        env:
          INSTALL_PATH: 'not_directory'
        run: |
          echo "- Create normal file"
          echo "content" > "${INSTALL_PATH}"

          echo "- Test script behavior"
          (./scripts/create_install_path.sh || echo "=== Script failed ===") > output
          grep "::error::Installation path 'not_directory' is not a directory" output
          grep "=== Script failed ===" output


      - name: Existing but not readable
        shell: bash
        env:
          INSTALL_PATH: 'not_readable'
        run: |
          echo "- Create dir and make it not readable"
          mkdir -p "${INSTALL_PATH}"
          chmod -r "${INSTALL_PATH}"

          echo "- Test script behavior"
          (./scripts/create_install_path.sh || echo "=== Script failed ===") > output
          grep "::error::Installation path 'not_readable' is not readable" output
          grep "=== Script failed ===" output

      - name: Existing but not writeable
        shell: bash
        env:
          INSTALL_PATH: 'not_writeable'
        run: |
          echo "- Create dir and make it not writeable"
          mkdir -p "${INSTALL_PATH}"
          chmod -w "${INSTALL_PATH}"

          echo "- Test script behavior"
          (./scripts/create_install_path.sh || echo "=== Script failed ===") > output
          grep "::error::Installation path 'not_writeable' is not writeable" output
          grep "=== Script failed ===" output
  setup-script-test:
    name: configure_paths.sh
    runs-on: github-ubuntu-latest-s
    env:
      INSTALL_PATH: 'install-directory'
      SONAR_HOST_URL: 'http://sonar-host.com'
      SONAR_SCANNER_VERSION: 'vX.Y.Z.MMMM'
      SONAR_SCANNER_URL_WINDOWS_X64: 'https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-vX.Y.Z.MMMM-windows-x64.zip'
      SONAR_SCANNER_SHA_WINDOWS_X64: 'DOWNLOAD-SHA-WINDOWS-X64'
      SONAR_SCANNER_URL_LINUX_X64: 'https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-vX.Y.Z.MMMM-linux-x64.zip'
      SONAR_SCANNER_SHA_LINUX_X64: 'DOWNLOAD-SHA-LINUX-X64'
      SONAR_SCANNER_URL_LINUX_AARCH64: 'https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-vX.Y.Z.MMMM-linux-aarch64.zip'
      SONAR_SCANNER_SHA_LINUX_AARCH64: 'DOWNLOAD-SHA-LINUX-AARCH64'
      SONAR_SCANNER_URL_MACOSX_X64: 'https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-vX.Y.Z.MMMM-macosx-x64.zip'
      SONAR_SCANNER_SHA_MACOSX_X64: 'DOWNLOAD-SHA-MACOSX-X64'
      SONAR_SCANNER_URL_MACOSX_AARCH64: 'https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-vX.Y.Z.MMMM-macosx-aarch64.zip'
      SONAR_SCANNER_SHA_MACOSX_AARCH64: 'DOWNLOAD-SHA-MACOSX-AARCH64'
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis

      - name: Windows
        shell: bash
        env:
          OS: 'Windows'
          ARCH: 'X64'
        run: |
          ./scripts/configure_paths.sh > output
          grep -v "::error::" output

          echo "- Check sonar-scanner:"
          grep "sonar-scanner-url=https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-vX.Y.Z.MMMM-windows-x64.zip" output
          grep "sonar-scanner-sha=DOWNLOAD-SHA-WINDOWS-X64" output
          grep "sonar-scanner-dir=install-directory/sonar-scanner-vX.Y.Z.MMMM-windows-x64" output
          grep "sonar-scanner-bin=install-directory/sonar-scanner-vX.Y.Z.MMMM-windows-x64/bin/sonar-scanner.bat" output

          echo "- Check build-wrapper:"
          grep "build-wrapper-url=http://sonar-host.com/static/cpp/build-wrapper-win-x86.zip" output
          grep "build-wrapper-dir=install-directory/build-wrapper-win-x86" output
          grep "build-wrapper-bin=install-directory/build-wrapper-win-x86/build-wrapper-win-x86-64.exe" output

      - name: Linux X64
        shell: bash
        env:
          OS: 'Linux'
          ARCH: 'X64'
        run: |
          ./scripts/configure_paths.sh > output
          grep -v "::error::" output

          echo "- Check sonar-scanner:"
          grep "sonar-scanner-url=https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-vX.Y.Z.MMMM-linux-x64.zip" output
          grep "sonar-scanner-sha=DOWNLOAD-SHA-LINUX-X64" output
          grep "sonar-scanner-dir=install-directory/sonar-scanner-vX.Y.Z.MMMM-linux-x64" output
          grep "sonar-scanner-bin=install-directory/sonar-scanner-vX.Y.Z.MMMM-linux-x64/bin/sonar-scanner" output

          echo "- Check build-wrapper:"
          grep "build-wrapper-url=http://sonar-host.com/static/cpp/build-wrapper-linux-x86.zip" output
          grep "build-wrapper-dir=install-directory/build-wrapper-linux-x86" output
          grep "build-wrapper-bin=install-directory/build-wrapper-linux-x86/build-wrapper-linux-x86-64" output

      - name: Linux ARM64
        shell: bash
        env:
          OS: 'Linux'
          ARCH: 'ARM64'
        run: |
          ./scripts/configure_paths.sh > output
          grep -v "::error::" output
          echo "- Check sonar-scanner:"
          grep "sonar-scanner-url=https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-vX.Y.Z.MMMM-linux-aarch64.zip" output
          grep "sonar-scanner-sha=DOWNLOAD-SHA-LINUX-AARCH64" output
          grep "sonar-scanner-dir=install-directory/sonar-scanner-vX.Y.Z.MMMM-linux-aarch64" output
          grep "sonar-scanner-bin=install-directory/sonar-scanner-vX.Y.Z.MMMM-linux-aarch64/bin/sonar-scanner" output
          echo "- Check build-wrapper:"
          grep "build-wrapper-url=http://sonar-host.com/static/cpp/build-wrapper-linux-aarch64.zip" output
          grep "build-wrapper-dir=install-directory/build-wrapper-linux-aarch64" output
          grep "build-wrapper-bin=install-directory/build-wrapper-linux-aarch64/build-wrapper-linux-aarch64" output

      - name: macOSX_X64
        shell: bash
        env:
          OS: 'macOS'
          ARCH: 'X64'
        run: |
          ./scripts/configure_paths.sh > output
          grep -v "::error::" output

          echo "- Check sonar-scanner:"
          grep "sonar-scanner-url=https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-vX.Y.Z.MMMM-macosx-x64.zip" output
          grep "sonar-scanner-sha=DOWNLOAD-SHA-MACOSX-X64" output
          grep "sonar-scanner-dir=install-directory/sonar-scanner-vX.Y.Z.MMMM-macosx-x64" output
          grep "sonar-scanner-bin=install-directory/sonar-scanner-vX.Y.Z.MMMM-macosx-x64/bin/sonar-scanner" output

          echo "- Check build-wrapper:"
          grep "build-wrapper-url=http://sonar-host.com/static/cpp/build-wrapper-macosx-x86.zip" output
          grep "build-wrapper-dir=install-directory/build-wrapper-macosx-x86" output
          grep "build-wrapper-bin=install-directory/build-wrapper-macosx-x86/build-wrapper-macosx-x86" output

      - name: macOSX_ARM64
        shell: bash
        env:
          OS: 'macOS'
          ARCH: 'ARM64'
        run: |
          ./scripts/configure_paths.sh > output
          grep -v "::error::" output

          echo "- Check sonar-scanner:"
          grep "sonar-scanner-url=https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-vX.Y.Z.MMMM-macosx-aarch64.zip" output
          grep "sonar-scanner-sha=DOWNLOAD-SHA-MACOSX-AARCH64" output
          grep "sonar-scanner-dir=install-directory/sonar-scanner-vX.Y.Z.MMMM-macosx-aarch64" output
          grep "sonar-scanner-bin=install-directory/sonar-scanner-vX.Y.Z.MMMM-macosx-aarch64/bin/sonar-scanner" output

          echo "- Check build-wrapper:"
          grep "build-wrapper-url=http://sonar-host.com/static/cpp/build-wrapper-macosx-x86.zip" output
          grep "build-wrapper-dir=install-directory/build-wrapper-macosx-x86" output
          grep "build-wrapper-bin=install-directory/build-wrapper-macosx-x86/build-wrapper-macosx-x86" output

      - name: Unsupported OS
        shell: bash
        env:
          OS: 'unsupportedOS'
          ARCH: 'X64'
        run: |
          (./scripts/configure_paths.sh  || echo "=== Script failed ===") > output

          echo "- Check errors:"
          grep "::error::Unsupported runner OS 'unsupportedOS'" output
          grep "=== Script failed ===" output

      - name: Unsupported architecture
        shell: bash
        env:
          OS: 'Linux'
          ARCH: 'X86'
        run: |
          (./scripts/configure_paths.sh  || echo "=== Script failed ===") > output

          echo "- Check errors:"
          grep "::error::Architecture 'X86' is unsupported by build-wrapper" output
          grep "=== Script failed ===" output
  download-script-test:
    name: download.sh
    runs-on: github-ubuntu-latest-s
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis

      - name: Download test without validation
        shell: bash
        env:
          INSTALL_PATH: 'install-directory-no-sha-validation'
          DOWNLOAD_URL: 'https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip'
          EXPECTED_SHA: 'incorrect-sha-not-validated'
          TMP_ZIP_PATH: ${{ runner.temp }}/sonar-scanner.zip
        run: |
          ./scripts/download.sh > output
          test -f "$TMP_ZIP_PATH"
          grep -v "::error::" output
      - name: Download test with validation
        shell: bash
        env:
          INSTALL_PATH: 'install-directory-sha-validation'
          DOWNLOAD_URL: 'https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip'
          EXPECTED_SHA: '9411331814c1d002bd65d37758b872918b7602e7cf3ca5b83a3e19a729b2be05'
          TMP_ZIP_PATH: ${{ runner.temp }}/sonar-scanner.zip
        run: |
          ./scripts/download.sh -v > output
          test -f "$TMP_ZIP_PATH"
          grep -v "::error::" output
      - name: Incorrect install dir
        shell: bash
        env:
          INSTALL_PATH: ''
        run: |
          (./scripts/download.sh || echo "=== Script failed ===") > output
          grep "::error::Failed to create" output
          grep "=== Script failed ===" output
      - name: Incorrect download url
        shell: bash
        env:
          INSTALL_PATH: 'install-directory-incorrect-url'
          DOWNLOAD_URL: 'incorrect-url'
        run: |
          (./scripts/download.sh || echo "=== Script failed ===") > output
          grep "::error::Failed to download 'incorrect-url'" output
          grep "=== Script failed ===" output
      - name: Incorrect SHA256
        shell: bash
        env:
          INSTALL_PATH: 'install-directory-incorrect-sha'
          DOWNLOAD_URL: 'https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip'
          EXPECTED_SHA: 'incorrect-sha256'
          TMP_ZIP_PATH: ${{ runner.temp }}/sonar-scanner.zip
        run: |
          (./scripts/download.sh -v || echo "=== Script failed ===") > output
          grep "::error::Checking sha256 failed" output
          grep "=== Script failed ===" output
      - name: Mismatching SHA256
        shell: bash
        env:
          INSTALL_PATH: 'install-directory-mismtaching-sha'
          DOWNLOAD_URL: 'https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.6.2.2472-linux.zip'
          EXPECTED_SHA: '3e121d85a4adb1f30b917d5f3eb897966b59e02c3d6d313a78dcd964193dc963'
          TMP_ZIP_PATH: ${{ runner.temp }}/sonar-scanner.zip
        run: |
          (./scripts/download.sh -v || echo "=== Script failed ===") > output
          grep "::error::Checking sha256 failed" output
          grep "=== Script failed ===" output
  fetch-latest-version-test:
    name: fetch_latest_version.sh
    runs-on: github-ubuntu-latest-s
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
      - name: Test script
        shell: bash
        run: |
          ./scripts/fetch_latest_version.sh > output
         
          echo "- Check sonar-scanner version:"
          grep  "sonar-scanner-version=" output
          SONAR_SCANNER_VERSION=$(cat output | cut -d= -f 2)
          test ! -z "${SONAR_SCANNER_VERSION}"

          echo "- Check windows sonar-scanner URLs:"
          grep "sonar-scanner-url-windows-x64=https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-windows-x64.zip" output
          grep -e "^sonar-scanner-sha-windows-x64=[0-9A-Fa-f]\+$" output

          echo "- Check linux sonar-scanner URLs:"
          grep "sonar-scanner-url-linux-x64=https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux-x64.zip" output
          grep -e "^sonar-scanner-sha-linux-x64=[0-9A-Fa-f]\+$" output
          grep "sonar-scanner-url-linux-aarch64=https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux-aarch64.zip" output
          grep -e "^sonar-scanner-sha-linux-aarch64=[0-9A-Fa-f]\+$" output

          echo "- Check macosx sonar-scanner URLs:"
          grep "sonar-scanner-url-linux-x64=https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux-x64.zip" output
          grep -e "^sonar-scanner-sha-linux-x64=[0-9A-Fa-f]\+$" output
          grep "sonar-scanner-url-linux-aarch64=https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-${SONAR_SCANNER_VERSION}-linux-aarch64.zip" output
          grep -e "^sonar-scanner-sha-linux-aarch64=[0-9A-Fa-f]\+$" output
