# Copyright 2020 Google LLC
#
# 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
#
#      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: firestore

on:
  pull_request:
    paths:
    # Firestore sources
    - 'Firestore/**'

    # Interop headers
    - 'Interop/Auth/Public/*.h'

    # FirebaseCore header change
    - 'FirebaseCore/Sources/Private'
    - 'FirebaseCore/Sources/Public'

    # Podspec
    - 'FirebaseFirestore.podspec'

    # CMake
    - 'CMakeLists.txt'
    - 'cmake/**'

    # Build scripts to which Firestore is sensitive
    #
    # Note that this doesn't include check scripts because changing those will
    # already trigger the check workflow.
    - 'scripts/binary_to_array.py'
    - 'scripts/build.sh'
    - 'scripts/install_prereqs.sh'
    - 'scripts/localize_podfile.swift'
    - 'scripts/pod_lib_lint.rb'
    - 'scripts/run_firestore_emulator.sh'
    - 'scripts/setup_*'
    - 'scripts/sync_project.rb'
    - 'scripts/test_quickstart.sh'
    - 'scripts/xcresult_logs.py'

    # This workflow
    - '.github/workflows/firestore.yml'

    # Rebuild on Ruby infrastructure changes.
    - 'Gemfile*'

  schedule:
    # Run every day at 2am (PST) - cron uses UTC times
    - cron:  '0 10 * * *'

jobs:
  check:
    # Don't run on private repo unless it is a PR.
    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
    runs-on: macos-latest
    steps:
    - uses: actions/checkout@v2

    - uses: actions/setup-python@v2
      with:
        python-version: 3.6

    - name: Setup check
      run:  scripts/setup_check.sh

    - name: Run check
      run:  scripts/check.sh --test-only


  cmake:
    # Don't run on private repo unless it is a PR.
    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
    needs: check

    strategy:
      matrix:
        os: [macos-latest, ubuntu-latest]

    env:
      MINT_PATH: ${{ github.workspace }}/mint

    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v2

    - name: Prepare ccache
      uses: actions/cache@v1
      with:
        path: ~/.ccache
        key: firestore-ccache-${{ runner.os }}-${{ github.sha }}
        restore-keys: |
          firestore-ccache-${{ runner.os }}-

    - name: Cache Mint packages
      uses: actions/cache@v1
      with:
        path: ${{ env.MINT_PATH }}
        key: ${{ runner.os }}-mint-${{ hashFiles('**/Mintfile') }}
        restore-keys: ${{ runner.os }}-mint-

    - name: Setup build
      run:  scripts/install_prereqs.sh Firestore ${{ runner.os }} cmake

    - name: Build and test
      run:  scripts/third_party/travis/retry.sh scripts/build.sh Firestore ${{ runner.os }} cmake


  sanitizers:
    # Don't run on private repo unless it is a PR.
    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
    runs-on: macos-latest
    needs: check

    strategy:
      matrix:
        sanitizer: [asan, tsan]

    env:
      SANITIZERS: ${{ matrix.sanitizer }}

    steps:
    - uses: actions/checkout@v2

    - name: Prepare ccache
      uses: actions/cache@v1
      with:
        path: ~/.ccache
        key: firestore-ccache-${{ runner.os }}-${{ matrix.sanitizer }}-${{ github.sha }}
        restore-keys: |
          firestore-ccache-${{ runner.os }}-${{ matrix.sanitizer }}-

    - name: Setup build
      run:  scripts/install_prereqs.sh Firestore ${{ runner.os }} cmake

    - name: Build and test
      run:  scripts/third_party/travis/retry.sh scripts/build.sh Firestore ${{ runner.os }} cmake


  xcodebuild:
    # Don't run on private repo unless it is a PR.
    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
    runs-on: macos-latest
    needs: check

    strategy:
      matrix:
        target: [iOS, tvOS, macOS]

    steps:
    - uses: actions/checkout@v2

    - name: Setup build
      run:  scripts/install_prereqs.sh Firestore ${{ matrix.target }} xcodebuild

    - name: Build and test
      run:  scripts/third_party/travis/retry.sh scripts/build.sh Firestore ${{ matrix.target }} xcodebuild


  pod-lib-lint:
    # Don't run on private repo unless it is a PR.
    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
    runs-on: macos-latest
    needs: check
    strategy:
      matrix:
        flags: [
          '--use-static-frameworks',
          '',
        ]

    steps:
    - uses: actions/checkout@v2

    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh

    - name: Pod lib lint
      run: |
        scripts/third_party/travis/retry.sh scripts/pod_lib_lint.rb FirebaseFirestore.podspec \
            ${{ matrix.flags }} \
            --platforms=ios \
            --allow-warnings

  spm:
    # Don't run on private repo unless it is a PR.
    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
    runs-on: macOS-latest
    needs: check
    steps:
    - uses: actions/checkout@v2
    - name: Initialize xcodebuild
      run: scripts/setup_spm_tests.sh
    - name: iOS Build Test
      run: scripts/third_party/travis/retry.sh ./scripts/build.sh FirebaseFirestore iOS spmbuildonly
    - name: Swift Build
      run: scripts/third_party/travis/retry.sh ./scripts/build.sh FirebaseFirestoreSwift-Beta iOS spmbuildonly

  spm-cron:
    # Don't run on private repo.
    if: github.event_name == 'schedule' && github.repository == 'Firebase/firebase-ios-sdk'
    runs-on: macOS-latest
    strategy:
      matrix:
        target: [tvOS, macOS, catalyst]
    steps:
    - uses: actions/checkout@v2
    - name: Initialize xcodebuild
      run: scripts/setup_spm_tests.sh
    - name: Build Test
      run: scripts/third_party/travis/retry.sh ./scripts/build.sh FirebaseFirestore ${{ matrix.target }} spmbuildonly
    - name: Swift Build
      run: scripts/third_party/travis/retry.sh ./scripts/build.sh FirebaseFirestoreSwift-Beta ${{ matrix.target }} spmbuildonly

# Restore when FirebaseUI works with Firebase 7 (#6646)
  quickstart:
    # Don't run on private repo unless it is a PR.
    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
    env:
      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
    runs-on: macOS-latest
    needs: check

    steps:
    - uses: actions/checkout@v2
    - name: Setup quickstart
      run: scripts/setup_quickstart.sh firestore
    - name: Install Secret GoogleService-Info.plist
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-firestore.plist.gpg \
          quickstart-ios/firestore/GoogleService-Info.plist "$plist_secret"
    - name: Install Secret FIREGSignInInfo.h
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/FIREGSignInInfo.h.gpg \
          quickstart-ios/TestUtils/FIREGSignInInfo.h "$signin_secret"
    - name: Test swift quickstart
      run: ([ -z $plist_secret ] ||
            scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Firestore)

  podspec-presubmit:
    # Don't run on private repo unless it is a PR.
    if: github.repository == 'Firebase/firebase-ios-sdk' && github.event.pull_request.merged != true && github.event.action != 'closed'
    runs-on: macOS-latest
    steps:
    - uses: actions/checkout@v2
    - name: Setup Bundler
      run: scripts/setup_bundler.sh
    - name: Build and test
      run: scripts/third_party/travis/retry.sh pod spec lint FirebaseFirestore.podspec --skip-tests --allow-warnings --platforms=ios --sources='https://github.com/firebase/SpecsTesting','https://github.com/firebase/SpecsDev.git','https://github.com/firebase/SpecsStaging.git','https://cdn.cocoapods.org/'
