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

# tests for arrow crate
name: arrow

concurrency:
  group: ${{ github.repository }}-${{ github.head_ref || github.sha }}-${{ github.workflow }}
  cancel-in-progress: true

on:
  # always trigger
  push:
    branches:
      - main
  pull_request:
    paths:
      - .github/**
      - rust-toolchain.toml
      - arrow-arith/**
      - arrow-array/**
      - arrow-buffer/**
      - arrow-cast/**
      - arrow-csv/**
      - arrow-data/**
      - arrow-integration-test/**
      - arrow-ipc/**
      - arrow-json/**
      - arrow-avro/**
      - arrow-ord/**
      - arrow-row/**
      - arrow-schema/**
      - arrow-select/**
      - arrow-string/**
      - arrow/**

jobs:

  # test the crate
  linux-test:
    name: Test
    runs-on: ubuntu-latest
    container:
      image: amd64/rust
    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # v7.0.0
        with:
          submodules: true
      - name: Setup Rust toolchain
        uses: ./.github/actions/setup-builder
      - name: Test arrow-buffer
        run: cargo test -p arrow-buffer --all-features
      - name: Test arrow-data
        run: cargo test -p arrow-data --all-features
      - name: Test arrow-schema
        run: cargo test -p arrow-schema --all-features
      - name: Test arrow-array
        run: |
          cargo test -p arrow-array --all-features
          # Disable feature `force_validate`
          cargo test -p arrow-array --features=ffi
      - name: Test arrow-select
        run: cargo test -p arrow-select --all-features
      - name: Test arrow-cast
        run: cargo test -p arrow-cast --all-features
      - name: Test arrow-ipc
        run: cargo test -p arrow-ipc --all-features
      - name: Test arrow-csv
        run: cargo test -p arrow-csv --all-features
      - name: Test arrow-json
        run: cargo test -p arrow-json --all-features
      - name: Test arrow-avro
        run: cargo test -p arrow-avro --all-features
      - name: Test arrow-string
        run: cargo test -p arrow-string --all-features
      - name: Test arrow-ord
        run: cargo test -p arrow-ord --all-features
      - name: Test arrow-arith
        run: cargo test -p arrow-arith --all-features
      - name: Test arrow-row
        run: cargo test -p arrow-row --all-features
      - name: Test arrow-integration-test
        run: cargo test -p arrow-integration-test --all-features
      - name: Test arrow with default features
        run: cargo test -p arrow
      - name: Test arrow except pyarrow
        run: cargo test -p arrow --features=force_validate,prettyprint,ipc_compression,ffi,chrono-tz
      - name: Run examples
        run: |
          # Test arrow examples
          cargo run --example builders
          cargo run --example dynamic_types
          cargo run --example read_csv
          cargo run --example read_csv_infer_schema
      - name: Run non-archery based integration-tests
        run: cargo test -p arrow-integration-testing

  # test the crate in release mode (in Rust overflows panic in debug mode but
  # not release mode)
  linux-release-test:
    name: Test Release Mode
    runs-on: ubuntu-latest
    container:
      image: amd64/rust
    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # v7.0.0
        with:
          submodules: true
      - name: Setup Rust toolchain
        uses: ./.github/actions/setup-builder
      # Note only run the low level crates in release mode
      # which are the most likely to have overflow tests
      - name: Test arrow-buffer
        run: cargo test --lib --tests --release -p arrow-buffer
      - name: Test arrow-data
        run: cargo test --lib --tests --release -p arrow-data
      - name: Test arrow-schema
        run: cargo test --lib --tests --release -p arrow-schema
      - name: Test arrow-array
        run: cargo test --lib --tests --release -p arrow-array
      - name: Test arrow-select
        run: cargo test --lib --tests --release -p arrow-select
      - name: Test arrow-cast
        run: cargo test --lib --tests --release -p arrow-cast
      - name: Test arrow-ipc
        run: cargo test --lib --tests --release -p arrow-ipc
      - name: Test arrow-ord
        run: cargo test --lib --tests --release -p arrow-ord
      - name: Test arrow-arith
        run: cargo test --lib --tests --release -p arrow-arith
      - name: Test arrow-row
        run: cargo test --lib --tests --release -p arrow-row


  # test compilation features
  linux-features:
    name: Check Compilation
    runs-on: ubuntu-latest
    container:
      image: amd64/rust
    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # v7.0.0
        with:
          submodules: true
      - name: Setup Rust toolchain
        uses: ./.github/actions/setup-builder
      - name: Check compilation
        run: cargo check -p arrow
      - name: Check compilation --no-default-features
        run: cargo check -p arrow --no-default-features
      - name: Check compilation --all-targets
        run: cargo check -p arrow --all-targets
      - name: Check compilation --no-default-features --all-targets
        run: cargo check -p arrow --no-default-features --all-targets
      - name: Check compilation --no-default-features --all-targets --features test_utils
        run: cargo check -p arrow --no-default-features --all-targets --features test_utils
      - name: Check compilation --no-default-features --all-targets --features ffi
        run: cargo check -p arrow --no-default-features --all-targets --features ffi
      - name: Check compilation --no-default-features --all-targets --features chrono-tz
        run: cargo check -p arrow --no-default-features --all-targets --features chrono-tz


  # test the arrow crate builds against wasm32 in nightly rust
  wasm32-build:
    name: Build wasm32
    runs-on: ubuntu-latest
    container:
      image: amd64/rust
    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # v7.0.0
        with:
          submodules: true
      - name: Setup Rust toolchain
        uses: ./.github/actions/setup-builder
      - name: Install wasm32 targets
        run: |
          rustup target add wasm32-unknown-unknown
          rustup target add wasm32-wasip1
      - name: Build wasm32-unknown-unknown
        run: cargo build -p arrow --no-default-features --features=json,csv,ipc,ffi --target wasm32-unknown-unknown
      - name: Build wasm32-wasip1
        run: cargo build -p arrow --no-default-features --features=json,csv,ipc,ffi --target wasm32-wasip1

  clippy:
    name: Clippy
    runs-on: ubuntu-latest
    container:
      image: amd64/rust
    steps:
      - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0  # v7.0.0
      - name: Setup Rust toolchain
        uses: ./.github/actions/setup-builder
      - name: Setup Clippy
        run: rustup component add clippy
      - name: Clippy arrow-buffer
        run: |
          mod=arrow-buffer
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-data
        run: |
          mod=arrow-data
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-schema
        run: |
          mod=arrow-schema
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-array
        run: |
          mod=arrow-array
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-select
        run: |
          mod=arrow-select
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-cast
        run: |
          mod=arrow-cast
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-ipc
        run: |
          mod=arrow-ipc
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-csv
        run: |
          mod=arrow-csv
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-json
        run: |
          mod=arrow-json
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-avro
        run: |
          mod=arrow-avro
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-string
        run: |
          mod=arrow-string
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-ord
        run: |
          mod=arrow-ord
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-arith
        run: |
          mod=arrow-arith
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-row
        run: |
          mod=arrow-row
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow
        run: |
          mod=arrow
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-integration-test
        run: |
          mod=arrow-integration-test
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
      - name: Clippy arrow-integration-testing
        run: |
          mod=arrow-integration-testing
          cargo clippy -p "$mod" --all-targets --all-features -- -D warnings
          # Dependency checks excluding tests & benches.
          cargo clippy -p "$mod" -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --all-features -- -D unused_crate_dependencies
          cargo clippy -p "$mod" --no-default-features -- -D unused_crate_dependencies
