# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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
#
#   http://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.

{% import 'macros.jinja' as macros with context %}

{{ macros.github_header() }}

jobs:
  test:
    name: |
      Docker Test {{ flags|default("") }} {{ image }} {{ command|default("") }}
    runs-on: ubuntu-latest
{{ macros.github_set_env(env) }}
    timeout-minutes: {{ timeout|default(60) }}
    steps:
      {{ macros.github_checkout_arrow(fetch_depth=fetch_depth|default(1))|indent }}
      {{ macros.github_free_space()|indent }}
      {{ macros.github_install_archery()|indent }}

      - name: Execute Docker Build
        shell: bash
        env:
        {{ macros.github_set_sccache_envvars()|indent(8) }}
        run: |
          # GH-40558: reduce ASLR to avoid TSAN crashing
          sudo sysctl -w vm.mmap_rnd_bits=28
          source arrow/ci/scripts/util_enable_core_dumps.sh
          archery docker run \
            -e SETUPTOOLS_SCM_PRETEND_VERSION="{{ arrow.no_rc_version }}" \
            {{ flags|default("") }} \
            {{ image }} \
            {{ command|default("") }}

      - name: Dump R install logs
        if: always()
        run: |
          log=arrow/r/check/arrow.Rcheck/00install.out
          if [ -f ${log} ]; then
            cat ${log}
          fi
      - name: Dump R test logs
        if: always()
        run: |
          for log in arrow/r/check/arrow.Rcheck/tests/testthat.Rout*; do
            if [ -f ${log} ]; then
              echo ${log}
              cat ${log}
            fi
          done
      - name: Save the R test output
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: test-output
          path: |
            arrow/r/tests/
            arrow/r/arrow.Rcheck/
            !arrow/r/arrow.Rcheck/00_pkg_src/
            !arrow/r/arrow.Rcheck/arrow/
          if-no-files-found: ignore

    {% if arrow.is_default_branch() %}
      {{ macros.github_login_dockerhub()|indent }}
      - name: Push Docker Image
        if: {{ push|default("true") }}
        shell: bash
        run: archery docker push {{ image }}
    {% endif %}
