# 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.

name: Test
on:
  push:
    branches:
      - '**'
      - '!dependabot/**'
    tags:
      - '*'
  pull_request:
concurrency:
  group: ${{ github.repository }}-${{ github.head_ref || github.sha }}-${{ github.workflow }}
  cancel-in-progress: true
permissions:
  contents: read
jobs:
  docker:
    name: ${{ matrix.arch-label }} Debian 12 Go ${{ matrix.go }}
    runs-on: ${{ matrix.runs-on }}
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        include:
          - arch-label: AMD64
            arch: amd64
            go: 1.24
            runs-on: ubuntu-latest
          - arch-label: ARM64
            arch: arm64v8
            go: 1.24
            runs-on: ubuntu-24.04-arm
          - arch-label: AMD64
            arch: amd64
            go: 1.25
            runs-on: ubuntu-latest
          - arch-label: ARM64
            arch: arm64v8
            go: 1.25
            runs-on: ubuntu-24.04-arm
    env:
      ARCH: ${{ matrix.arch }}
      GO: ${{ matrix.go }}
    steps:
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          submodules: recursive
      - name: Login to GitHub Container registry
        uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 # v3.4.0
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Pull
        run: |
          docker compose pull debian || :
      - name: Test
        run: |
          docker compose run debian
      - name: Push
        if: >-
          success() && github.event_name == 'push' && github.repository == 'apache/arrow-go' && github.ref_name == 'main'
        continue-on-error: true
        run: |
          docker compose push debian
  docker-cgo:
    name: AMD64 Debian 12 Go ${{ matrix.go }} - CGO
    runs-on: ubuntu-latest
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        go:
          - '1.24'
          - '1.25'
    env:
      GO: ${{ matrix.go }}
    steps:
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          submodules: recursive
      - name: Login to GitHub Container registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Pull
        run: |
          docker compose pull debian || :
          docker compose pull debian-cgo || :
      - name: Build
        run: |
          docker compose build debian
          docker compose build debian-cgo
      - name: Test
        run: |
          docker compose run debian-cgo
      - name: Push
        if: >-
          success() && github.event_name == 'push' && github.repository == 'apache/arrow-go' && github.ref_name == 'main'
        continue-on-error: true
        run: |
          docker compose push debian-cgo
  docker-cgo-python:
    name: AMD64 Debian 12 Go ${{ matrix.go }} - CGO Python
    runs-on: ubuntu-latest
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        go:
          - '1.24'
          - '1.25'
    env:
      GO: ${{ matrix.go }}
    steps:
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          submodules: recursive
      - name: Login to GitHub Container registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Pull
        run: |
          docker compose pull debian || :
          docker compose pull debian-cgo-python || :
      - name: Build
        run: |
          docker compose build debian
          docker compose build debian-cgo-python
      - name: Test
        run: |
          docker compose run debian-cgo-python
      - name: Push
        if: >-
          success() && github.event_name == 'push' && github.repository == 'apache/arrow-go' && github.ref_name == 'main'
        continue-on-error: true
        run: |
          docker compose push debian-cgo-python
  macos:
    name: AMD64 macOS 14 Go ${{ matrix.go }}
    runs-on: macos-14
    timeout-minutes: 20
    strategy:
      fail-fast: false
      matrix:
        go:
          - '1.24'
          - '1.25'
    steps:
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          submodules: recursive
      - name: Setup Go
        uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
        with:
          go-version: ${{ matrix.go }}
          cache: true
          cache-dependency-path: go.sum
      - name: Build
        run: |
          ci/scripts/build.sh $(pwd)
      - name: Test
        run: |
          ci/scripts/test.sh $(pwd)
  macos-cgo:
    name: AMD64 macOS 14 Go ${{ matrix.go }} - CGO
    runs-on: macos-14
    timeout-minutes: 25
    strategy:
      fail-fast: false
      matrix:
        go:
          - '1.24'
          - '1.25'
    env:
      ARROW_GO_TESTCGO: "1"
    steps:
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          submodules: recursive
      - name: Setup Go
        uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
        with:
          go-version: ${{ matrix.go }}
          cache: true
          cache-dependency-path: go.sum
      - name: Brew Install Arrow
        run: brew install apache-arrow
      - name: Setup PKG_CONFIG_PATH
        run: |
          echo "PKG_CONFIG_PATH=$(brew --prefix openssl@3)/lib/pkgconfig:$(brew --prefix)/lib/pkgconfig:$PKG_CONFIG_PATH" >> $GITHUB_ENV
      - name: Build
        run: |
          ci/scripts/build.sh $(pwd)
      - name: Test
        run: |
          ci/scripts/test.sh $(pwd)
  windows:
    name: AMD64 Windows 2022 Go ${{ matrix.go }}
    runs-on: windows-2022
    timeout-minutes: 20
    strategy:
      fail-fast: false
      matrix:
        go:
          - '1.24'
          - '1.25'
    steps:
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          submodules: recursive
      - name: Setup Go
        uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
        with:
          go-version: ${{ matrix.go }}
          cache: true
          cache-dependency-path: go.sum
      - name: Build
        shell: bash
        run: ci/scripts/build.sh $(pwd)
      - name: Test
        shell: bash
        run: ci/scripts/test.sh $(pwd)
  windows-mingw:
    name: AMD64 Windows MinGW ${{ matrix.mingw-n-bits }} CGO
    runs-on: windows-2022
    timeout-minutes: 20
    strategy:
      fail-fast: false
      matrix:
        mingw-n-bits:
          #- 32 runtime handling for CGO needs 64-bit currently
          - 64
    env:
      ARROW_GO_TESTCGO: "1"
      MINGW_LINT: "1"
    steps:
      - name: Disable Crash Dialogs
        run: |
          reg add `
            "HKCU\SOFTWARE\Microsoft\Windows\Windows Error Reporting" `
            /v DontShowUI `
            /t REG_DWORD `
            /d 1 `
            /f
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          submodules: recursive
      - uses: msys2/setup-msys2@v2
        with:
          msystem: MINGW${{ matrix.mingw-n-bits }}
          update: true
      - name: Setup MSYS2
        shell: msys2 {0}
        run: |
          ci/scripts/msys2_setup.sh
      - name: Get required Go version
        run: "(. .env && echo \"GO_VERSION=${GO}\") >> $GITHUB_ENV"
      - name: Update CGO Env vars
        shell: msys2 {0}
        run: |
          echo "CGO_CPPFLAGS=-I$(cygpath --windows ${MINGW_PREFIX}/include)" >> $GITHUB_ENV
          echo "CGO_LDFLAGS=-g -O2 -L$(cygpath --windows ${MINGW_PREFIX}/lib) -L$(cygpath --windows ${MINGW_PREFIX}/bin)" >> $GITHUB_ENV
          echo "MINGW_PREFIX=$(cygpath --windows ${MINGW_PREFIX})" >> $GITHUB_ENV
      - name: Setup Go
        uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
        with:
          go-version: "${{ env.GO_VERSION }}"
          cache: true
          cache-dependency-path: go.sum
      - name: Build
        shell: bash
        run: ci/scripts/build.sh $(pwd)
      - name: Test
        shell: bash
        run: ci/scripts/test.sh $(pwd)
  build-test-386:
    name: Cross-build and test for 386
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          submodules: recursive
      - name: Get required Go version
        run: |
          (. .env && echo "GO_VERSION=${GO}") >> $GITHUB_ENV
      - name: Setup Go
        uses: actions/setup-go@4dc6199c7b1a012772edbd06daecab0f50c9053c # v6.1.0
        with:
          go-version: "${{ env.GO_VERSION }}"
          cache: true
          cache-dependency-path: go.sum
      - name: Build
        run: GOARCH=386 go build ./...
      - name: Test
        # WIP refactor, only tests in the specified dirs have been fixed
        run: GOARCH=386 go test ./parquet/file/...
  tinygo:
    name: TinyGo
    runs-on: ubuntu-latest
    env:
      TINYGO_VERSION: 0.38.0
    timeout-minutes: 20
    steps:
      - name: Checkout
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          submodules: recursive
      - name: Build and Run Example
        run: |
          docker run \
            --rm \
            -v $(pwd):/src \
            -v $(pwd)/ci/scripts:/ci-scripts \
            "tinygo/tinygo:$TINYGO_VERSION" \
            /ci-scripts/tinygo_example.sh
  integration:
    name: AMD64 Conda Integration
    runs-on: ubuntu-latest
    timeout-minutes: 60
    steps:
      - name: Checkout Arrow
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          fetch-depth: 0
          repository: apache/arrow
          submodules: recursive
      - name: Checkout Arrow Rust
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          repository: apache/arrow-rs
          path: rust
      - name: Checkout Arrow nanoarrow
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          repository: apache/arrow-nanoarrow
          path: nanoarrow
      - name: Checkout Arrow Go
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          path: go
      - name: Checkout Arrow Java
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          repository: apache/arrow-java
          path: java
      - name: Checkout Arrow JavaScript
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          repository: apache/arrow-js
          path: js
      - name: Checkout Arrow .NET
        uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v5.0.1
        with:
          repository: apache/arrow-dotnet
          path: dotnet
      - name: Free up disk space
        run: |
          ci/scripts/util_free_space.sh
      - name: Cache Docker Volumes
        uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
        with:
          path: .docker
          key: integration-conda-${{ hashFiles('cpp/**') }}
          restore-keys: conda-
      - name: Setup Python
        uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
        with:
          python-version: 3.12
      - name: Setup Archery
        run: pip install -e dev/archery[docker]
      - name: Execute Docker Build
        run: |
          source ci/scripts/util_enable_core_dumps.sh
          archery docker run \
            -e ARCHERY_DEFAULT_BRANCH=${{ github.event.repository.default_branch }} \
            -e ARCHERY_INTEGRATION_TARGET_IMPLEMENTATIONS=go \
            -e ARCHERY_INTEGRATION_WITH_DOTNET=1 \
            -e ARCHERY_INTEGRATION_WITH_GO=1 \
            -e ARCHERY_INTEGRATION_WITH_JAVA=1 \
            -e ARCHERY_INTEGRATION_WITH_JS=1 \
            -e ARCHERY_INTEGRATION_WITH_NANOARROW=1 \
            -e ARCHERY_INTEGRATION_WITH_RUST=1 \
            conda-integration
