# Copyright 2026 The Abseil Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: CMake Tests

on:
  workflow_call:
    inputs:
      os:
        description: "GitHub Actions runner OS (e.g. ubuntu-24.04, macos-latest, windows-2022)"
        required: true
        type: string
      container_image:
        description: "Docker container image to run in (empty string for host execution)"
        required: false
        default: ""
        type: string
      build_types:
        description: "JSON array of CMAKE_BUILD_TYPE values to test"
        required: false
        default: '["Debug", "Release"]'
        type: string
      link_modes:
        description: "JSON array of link modes to test (static, shared, monolithic-shared)"
        required: false
        default: '["static", "shared", "monolithic-shared"]'
        type: string
      install_test:
        description: "Whether to run the CMake installation integration test"
        required: false
        default: false
        type: boolean

permissions:
  contents: read

jobs:
  test:
    runs-on: ${{ inputs.os }}
    name: (${{ matrix.build_type }}, ${{ matrix.link_mode }})
    container:
      image: ${{ inputs.container_image }}
      # core=1 skips kernel pipe core_pattern handlers (e.g. apport) on death tests.
      options: --cap-add=SYS_PTRACE --ulimit core=1
      credentials:
        # TODO(b/573304451): Switch to Workload Identity Federation to avoid the need for secrets.
        username: _json_key
        password: ${{ secrets.GAR_SERVICE_ACCOUNT }}
    strategy:
      fail-fast: false  # Don't cancel all jobs if one fails.
      matrix:
        build_type: ${{ fromJSON(inputs.build_types) }}
        link_mode: ${{ fromJSON(inputs.link_modes) }}
    defaults:
      run:
        shell: bash
    env:
      CC: ${{ startsWith(inputs.os, 'ubuntu') && 'gcc' || '' }}
      CFLAGS: ${{ !inputs.install_test && startsWith(inputs.os, 'ubuntu') && '-Werror' || '' }}
      CXX: ${{ startsWith(inputs.os, 'ubuntu') && 'g++' || '' }}
      CXXFLAGS: ${{ !inputs.install_test && (startsWith(inputs.os, 'ubuntu') && '-Werror' || startsWith(inputs.os, 'windows') && '-WX') || '' }}
      CMAKE_BUILD_PARALLEL_LEVEL: ${{ startsWith(inputs.os, 'ubuntu') && 50 || 16 }}
      CMAKE_C_COMPILER_LAUNCHER: ${{ startsWith(inputs.os, 'ubuntu') && 'rewrapper' || 'sccache' }}
      CMAKE_CXX_COMPILER_LAUNCHER: ${{ startsWith(inputs.os, 'ubuntu') && 'rewrapper' || 'sccache' }}
      CMAKE_TEST_LAUNCHER: ${{ startsWith(inputs.os, 'ubuntu') && 'rbe_test_launcher' || '' }}
      CMAKE_GENERATOR: Ninja
      CTEST_OUTPUT_ON_FAILURE: 1
      CTEST_PARALLEL_LEVEL: ${{ startsWith(inputs.os, 'ubuntu') && 50 || 16 }}
      TZDIR: ${{ github.workspace }}/absl/time/internal/cctz/testdata/zoneinfo
      RBE_service: us-east1-remotebuildexecution.googleapis.com:443
      RBE_instance: projects/google.com:absl-177019/instances/absl-ci-east
      RBE_use_application_default_credentials: true
      RBE_exec_strategy: remote
      RBE_exec_root: ${{ github.workspace }}
      RBE_platform: OSArch=amd64,cache-silo-key=n2-highcpu-2-2026-10-14,container-image=docker://${{ inputs.container_image }},dockerRunAsRoot=true
      SCCACHE_GCS_BUCKET: absl-cmake-sccache
      SCCACHE_GCS_RW_MODE: READ_WRITE
      SCCACHE_IDLE_TIMEOUT: 0
      SCCACHE_IGNORE_SERVER_IO_ERROR: 1
    steps:
      - name: Checkout
        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # 7.0.0

      - name: Set up MSVC
        if: ${{ runner.os == 'Windows' }}
        uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0
        with:
          arch: x64
          vsversion: "2022"

      - name: Authenticate to Google Cloud
        id: auth
        uses: google-github-actions/auth@7c6bc770dae815cd3e89ee6cdf493a5fab2cc093 # v3.0.0
        with:
          credentials_json: ${{ secrets.GAR_SERVICE_ACCOUNT }}

      - name: Set up sccache
        if: ${{ runner.os != 'Linux' }}
        uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10

      - name: Start sccache
        if: ${{ runner.os != 'Linux' }}
        env:
          SCCACHE_GCS_KEY_PATH: ${{ steps.auth.outputs.credentials_file_path }}
        run: sccache --start-server

      - name: Start reclient (RBE)
        if: ${{ runner.os == 'Linux' }}
        run: |
          # CMake passes absolute source/include paths (${GITHUB_WORKSPACE}/...) to
          # the compiler, so mount the remote input root at that same container path.
          echo "RBE_platform=${RBE_platform},InputRootAbsolutePath=${GITHUB_WORKSPACE}" >> "$GITHUB_ENV"
          bootstrap

      - name: Run installation test
        if: ${{ inputs.install_test }}
        env:
          LINK_TYPE: ${{ matrix.link_mode == 'shared' && 'DYNAMIC' || 'STATIC' }}
        run: >
          source ci/cmake_common.sh &&
          export ABSL_GOOGLETEST_VERSION ABSL_GOOGLETEST_DOWNLOAD_URL &&
          CMake/install_test_project/test.sh

      - name: Configure
        if: ${{ !inputs.install_test }}
        run: >
          source ci/cmake_common.sh &&
          cmake -B build
          -DABSL_BUILD_TESTING=ON
          -DABSL_GOOGLETEST_DOWNLOAD_URL=${ABSL_GOOGLETEST_DOWNLOAD_URL}
          -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
          -DCMAKE_C_FLAGS_DEBUG="${{ runner.os == 'Windows' && '-O1 -Ob1 -Zc:inline' || '-Og' }}"
          -DCMAKE_CXX_FLAGS_DEBUG="${{ runner.os == 'Windows' && '-O1 -Ob1 -Zc:inline' || '-Og' }}"
          -DCMAKE_EXE_LINKER_FLAGS_DEBUG=""
          -DCMAKE_SHARED_LINKER_FLAGS_DEBUG=""
          -DCMAKE_CXX_STANDARD=17
          -DBUILD_SHARED_LIBS=${{ matrix.link_mode != 'static' }}
          -DABSL_BUILD_MONOLITHIC_SHARED_LIBS=${{ matrix.link_mode == 'monolithic-shared' }}
          -DCMAKE_POLICY_DEFAULT_CMP0141=NEW
          -DCMAKE_MSVC_DEBUG_INFORMATION_FORMAT=""
          -DCMAKE_JOB_POOLS="link=$(nproc 2>/dev/null || sysctl -n hw.logicalcpu)"
          -DCMAKE_JOB_POOL_LINK=link

      - name: Build
        if: ${{ !inputs.install_test }}
        run: cmake --build build

      - name: Run tests
        if: ${{ !inputs.install_test }}
        run: >
          ctest --test-dir build
          --repeat until-pass:3
          ${{ runner.os == 'Windows' && '-E "absl_lifetime_test|absl_symbolize_test"' || '' }}

      - name: Stop reclient (RBE)
        if: ${{ always() && runner.os == 'Linux' }}
        run: bootstrap --shutdown
