# 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: Integration

on:
  pull_request:
    branches:
      - main
    paths:
      - "adbc.h"
      - "c/**"
      - "ci/**"
      - "go/**"
      - "python/**"
      - ".github/workflows/integration.yml"
  push:
    paths:
      - "adbc.h"
      - "c/**"
      - "ci/**"
      - "go/**"
      - "python/**"
      - ".github/workflows/integration.yml"

concurrency:
  group: ${{ github.repository }}-${{ github.ref }}-${{ github.workflow }}
  cancel-in-progress: true

permissions:
  contents: read

env:
  # Increment this to reset cache manually
  CACHE_NUMBER: "0"

jobs:
  flightsql:
    name: "FlightSQL Integration Tests (Dremio and SQLite)"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
          persist-credentials: false
      - name: Get Date
        id: get-date
        shell: bash
        run: |
          echo "today=$(/bin/date -u '+%Y%m%d')" >> $GITHUB_OUTPUT
      - name: Cache Conda
        uses: actions/cache/restore@v3
        with:
          path: ~/conda_pkgs_dir
          key: conda-${{ runner.os }}-${{ steps.get-date.outputs.today }}-${{ env.CACHE_NUMBER }}-${{ hashFiles('ci/**') }}
      - uses: conda-incubator/setup-miniconda@v2
        with:
          miniforge-variant: Mambaforge
          miniforge-version: latest
          use-only-tar-bz2: false
          use-mamba: true
      - name: Install Dependencies
        shell: bash -l {0}
        run: |
          mamba install -c conda-forge \
            --file ci/conda_env_cpp.txt \
            --file ci/conda_env_python.txt
      - uses: actions/setup-go@v3
        with:
          go-version: 1.18.6
          check-latest: true
          cache: true
          cache-dependency-path: go/adbc/go.sum
      - name: Start SQLite server and Dremio
        shell: bash -l {0}
        run: |
          docker-compose up -d golang-sqlite-flightsql dremio dremio-init

      - name: Build FlightSQL Driver
        shell: bash -l {0}
        env:
          BUILD_ALL: "0"
          BUILD_DRIVER_FLIGHTSQL: "1"
        run: |
          ./ci/scripts/cpp_build.sh "$(pwd)" "$(pwd)/build"
      - name: Test FlightSQL Driver against Dremio and SQLite
        shell: bash -l {0}
        env:
          BUILD_ALL: "0"
          BUILD_DRIVER_FLIGHTSQL: "1"
          ADBC_DREMIO_FLIGHTSQL_URI: "grpc+tcp://localhost:32010"
          ADBC_DREMIO_FLIGHTSQL_USER: "dremio"
          ADBC_DREMIO_FLIGHTSQL_PASS: "dremio123"
          ADBC_SQLITE_FLIGHTSQL_URI: "grpc+tcp://localhost:8080"
        run: |
          ./ci/scripts/cpp_build.sh "$(pwd)" "$(pwd)/build"
          ./ci/scripts/cpp_test.sh "$(pwd)" "$(pwd)/build"
      - name: Build Python Flight SQL driver
        shell: bash -l {0}
        env:
          BUILD_ALL: "0"
          BUILD_DRIVER_FLIGHTSQL: "1"
          BUILD_DRIVER_MANAGER: "1"
        run: |
          ./ci/scripts/python_build.sh "$(pwd)" "$(pwd)/build"
      - name: Test Python Flight SQL driver against Dremio
        shell: bash -l {0}
        env:
          BUILD_ALL: "0"
          BUILD_DRIVER_FLIGHTSQL: "1"
          ADBC_DREMIO_FLIGHTSQL_URI: "grpc+tcp://localhost:32010"
          ADBC_DREMIO_FLIGHTSQL_USER: "dremio"
          ADBC_DREMIO_FLIGHTSQL_PASS: "dremio123"
        run: |
          ./ci/scripts/python_test.sh "$(pwd)" "$(pwd)/build"
      - name: Stop SQLite server and Dremio
        shell: bash -l {0}
        run: |
          docker-compose down

  postgresql:
    name: "PostgreSQL Integration Tests"
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgres
        env:
          POSTGRES_DB: tempdb
          POSTGRES_PASSWORD: password
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 5432:5432
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
          persist-credentials: false
      - name: Get Date
        id: get-date
        shell: bash
        run: |
          echo "today=$(/bin/date -u '+%Y%m%d')" >> $GITHUB_OUTPUT
      - name: Cache Conda
        uses: actions/cache/restore@v3
        with:
          path: ~/conda_pkgs_dir
          key: conda-${{ runner.os }}-${{ steps.get-date.outputs.today }}-${{ env.CACHE_NUMBER }}-${{ hashFiles('ci/**') }}
      - uses: conda-incubator/setup-miniconda@v2
        with:
          miniforge-variant: Mambaforge
          miniforge-version: latest
          use-only-tar-bz2: false
          use-mamba: true
      - name: Install Dependencies
        shell: bash -l {0}
        run: |
          mamba install -c conda-forge \
            --file ci/conda_env_cpp.txt \
            --file ci/conda_env_python.txt
      - name: Build PostgreSQL Driver
        shell: bash -l {0}
        env:
          BUILD_ALL: "0"
          BUILD_DRIVER_POSTGRESQL: "1"
          ADBC_USE_ASAN: "OFF"
          ADBC_USE_UBSAN: "OFF"
        run: |
          ./ci/scripts/cpp_build.sh "$(pwd)" "$(pwd)/build"
      - name: Test PostgreSQL Driver
        shell: bash -l {0}
        env:
          BUILD_ALL: "0"
          BUILD_DRIVER_POSTGRESQL: "1"
          ADBC_POSTGRESQL_TEST_URI: "postgres://localhost:5432/postgres?user=postgres&password=password"
        run: |
          ./ci/scripts/cpp_test.sh "$(pwd)" "$(pwd)/build"

      - name: Build Python PostgreSQL Driver
        shell: bash -l {0}
        env:
          BUILD_ALL: "0"
          BUILD_DRIVER_POSTGRESQL: "1"
        run: |
          ./ci/scripts/python_build.sh "$(pwd)" "$(pwd)/build"
      - name: Test Python PostgreSQL Driver
        shell: bash -l {0}
        env:
          BUILD_ALL: "0"
          BUILD_DRIVER_POSTGRESQL: "1"
          ADBC_POSTGRESQL_TEST_URI: "postgres://localhost:5432/postgres?user=postgres&password=password"
        run: |
          ./ci/scripts/python_test.sh "$(pwd)" "$(pwd)/build"

  snowflake:
    name: "Snowflake Integration Tests"
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
          persist-credentials: false
      - name: Get Date
        id: get-date
        shell: bash
        run: |
          echo "today=$(/bin/date -u '+%Y%m%d')" >> $GITHUB_OUTPUT
      - name: Cache Conda
        uses: actions/cache/restore@v3
        with:
          path: ~/conda_pkgs_dir
          key: conda-${{ runner.os }}-${{ steps.get-date.outputs.today }}-${{ env.CACHE_NUMBER }}-${{ hashFiles('ci/**') }}
      - uses: conda-incubator/setup-miniconda@v2
        with:
          miniforge-variant: Mambaforge
          miniforge-version: latest
          use-only-tar-bz2: false
          use-mamba: true
      - name: Install Dependencies
        shell: bash -l {0}
        run: |
          mamba install -c conda-forge \
            --file ci/conda_env_cpp.txt \
            --file ci/conda_env_python.txt
      - uses: actions/setup-go@v3
        with:
          go-version: 1.18.6
          check-latest: true
          cache: true
          cache-dependency-path: go/adbc/go.sum
      - name: Build and Test Snowflake Driver
        shell: bash -l {0}
        env:
          BUILD_ALL: "0"
          BUILD_DRIVER_SNOWFLAKE: "1"
          ADBC_SNOWFLAKE_URI: ${{ secrets.SNOWFLAKE_URI }}
        run: |
          ./ci/scripts/cpp_build.sh "$(pwd)" "$(pwd)/build"
          ./ci/scripts/cpp_test.sh "$(pwd)" "$(pwd)/build"
      - name: Build and Test Snowflake Driver (Python)
        shell: bash -l {0}
        env:
          BUILD_ALL: "0"
          BUILD_DRIVER_SNOWFLAKE: "1"
          ADBC_SNOWFLAKE_URI: ${{ secrets.SNOWFLAKE_URI }}
        run: |
          ./ci/scripts/python_build.sh "$(pwd)" "$(pwd)/build"
          ./ci/scripts/python_test.sh "$(pwd)" "$(pwd)/build"
