os: osx
osx_image: xcode11
language: objective-c
cache:
  bundler: true
  cocoapods: true
  directories:
    # Built-in support for ccache doesn't seem to pick this up
    - $HOME/.ccache

stages:
  - test

jobs:
  include:
    # The order of builds matters (even though they are run in parallel):
    # Travis will schedule them in the same order they are listed here.

    - stage: test
      env:
        - PROJECT=Core METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseCoreDiagnostics.podspec --platforms=ios
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseCoreDiagnostics.podspec --platforms=tvos
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseCoreDiagnostics.podspec --platforms=macos

    - stage: test
      env:
        - PROJECT=Core METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseCore.podspec --skip-tests --platforms=ios
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseCoreDiagnostics.podspec --platforms=ios

    - stage: test
      if: type = cron
      env:
        - PROJECT=CoreCron METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/pod_lib_lint.rb FirebaseCoreDiagnostics.podspec --platforms=ios --use-libraries
        - travis_retry ./scripts/pod_lib_lint.rb FirebaseCoreDiagnostics.podspec --platforms=tvos --use-libraries
        - travis_retry ./scripts/pod_lib_lint.rb FirebaseCoreDiagnostics.podspec --platforms=macos --use-libraries
        - travis_retry ./scripts/pod_lib_lint.rb FirebaseCoreDiagnostics.podspec --platforms=ios --use-modular-headers
        - travis_retry ./scripts/pod_lib_lint.rb FirebaseCoreDiagnostics.podspec --platforms=tvos --use-modular-headers
        - travis_retry ./scripts/pod_lib_lint.rb FirebaseCoreDiagnostics.podspec --platforms=macos --use-modular-headers

    - stage: test
      env:
        - PROJECT=ABTesting METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseABTesting.podspec --platforms=ios

    - stage: test
      env:
        - PROJECT=Auth PLATFORM=iOS METHOD=xcodebuild
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseAuth.podspec --platforms=ios

    - stage: test
      env:
        - PROJECT=InstanceID METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseInstanceID.podspec --platforms=ios

    - stage: test
      env:
        - PROJECT=Database PLATFORM=all METHOD=xcodebuild
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseDatabase.podspec --skip-tests --platforms=ios

    - stage: test
      env:
        - PROJECT=DynamicLinks METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseDynamicLinks.podspec

    - stage: test
      env:
        - PROJECT=Messaging METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseMessaging.podspec --platforms=ios

    - stage: test
      env:
        - PROJECT=RemoteConfig METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseRemoteConfig.podspec --platforms=ios --skip-tests

    - stage: test
      env:
        - PROJECT=Storage PLATFORM=all METHOD=xcodebuild
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseStorage.podspec --skip-tests --platforms=ios

    - stage: test
      env:
        - PROJECT=Functions METHOD=pod-lib-lint
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh # Start integration test server
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseFunctions.podspec

    - stage: test
      env:
        - PROJECT=Crashlytics METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseCrashlytics.podspec --platforms=ios

    - stage: test
      env:
        - PROJECT=InAppMessaging PLATFORM=iOS METHOD=xcodebuild
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM

    - stage: test
      if: type = cron
      env:
        - PROJECT=InAppMessaging PLATFORM=iPad METHOD=xcodebuild
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM

    - stage: test
      env:
        - PROJECT=Firestore PLATFORM=iOS METHOD=xcodebuild
      before_install:
        - ./scripts/if_changed.sh ./scripts/install_prereqs.sh
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/build.sh $PROJECT $PLATFORM $METHOD

    - stage: test
      env:
        - PROJECT=GoogleUtilitiesComponents METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb GoogleUtilitiesComponents.podspec

    - stage: test
      if: type = cron
      env:
        - PROJECT=GoogleUtilitiesComponentsCron METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/pod_lib_lint.rb GoogleUtilitiesComponents.podspec --use-libraries
        - travis_retry ./scripts/pod_lib_lint.rb GoogleUtilitiesComponents.podspec --use-modular-headers

    - stage: test
      env:
        - PROJECT=Firebase METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseInAppMessaging.podspec
        - travis_retry ./scripts/if_changed.sh ./scripts/pod_lib_lint.rb FirebaseInAppMessaging.podspec --use-static-frameworks

    # pod lib lint to check build and warnings for static library build - only on cron jobs
    - stage: test
      if: type = cron
      env:
        - PROJECT=InAppMessagingCron METHOD=pod-lib-lint
      script:
        - travis_retry ./scripts/pod_lib_lint.rb FirebaseInAppMessaging.podspec --use-libraries
        - travis_retry ./scripts/pod_lib_lint.rb FirebaseInAppMessaging.podspec --use-modular-headers

    # Validate Cocoapods configurations
    # This may take long time, so we would like to run it only once all other tests pass
    - stage: test
      if: type = cron
      env:
        - POD_CONFIG_DIR=Cocoapods_multiprojects_frameworks
      script:
        - travis_retry ./CocoapodsIntegrationTest/scripts/build_with_environment.sh --gemfile=./CocoapodsIntegrationTest/TestEnvironments/${POD_CONFIG_DIR}/Gemfile --podfile=./CocoapodsIntegrationTest/TestEnvironments/${POD_CONFIG_DIR}/Podfile

    - stage: test
      if: type = cron
      env:
        - POD_CONFIG_DIR=Cocoapods_multiprojects_staticLibs
      script:
        - travis_retry ./CocoapodsIntegrationTest/scripts/build_with_environment.sh --gemfile=./CocoapodsIntegrationTest/TestEnvironments/${POD_CONFIG_DIR}/Gemfile --podfile=./CocoapodsIntegrationTest/TestEnvironments/${POD_CONFIG_DIR}/Podfile

  allow_failures:
    # Run fuzz tests only on cron jobs.
    - stage: test
#      if: type = cron
      env:
        - PROJECT=Firestore PLATFORM=iOS METHOD=fuzz
      before_install:
        - ./scripts/install_prereqs.sh
      script:
        # The travis_wait is necessary because fuzzing runs for 40 minutes.
        - travis_wait 45 ./scripts/fuzzing_ci.sh

branches:
  only:
    - master
