# Copyright 2017 Google Inc.
#
# 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.
####################################################################################

#!/bin/bash

# Fail on any error.
set -e

# Display commands to stderr.
set -x

# Verify required environment variables.

# Required for building Java binaries.
if [[ -z "${ANDROID_HOME}" ]]; then
  echo "The ANDROID_HOME environment variable must be set."
  exit 4
fi

if [[ -z "${TMP}" ]]; then
  echo "The TMP environment variable must be set."
  exit 4
fi

readonly PLATFORM="$(uname | tr '[:upper:]' '[:lower:]')"

declare -a DISABLE_SANDBOX_ARGS
DISABLE_SANDBOX_ARGS=(
  --strategy=GenRule=standalone
  --strategy=Turbine=standalone
  --strategy=CppCompile=standalone
  --strategy=ProtoCompile=standalone
  --strategy=GenProto=standalone
  --strategy=GenProtoDescriptorSet=standalone
  --sandbox_tmpfs_path=${TMP}
)
readonly DISABLE_SANDBOX_ARGS

# Only in Kokoro environments.
if [[ -n "${KOKORO_ROOT}" ]]; then
  # TODO(b/73748835): Workaround on Kokoro.
  rm -f ~/.bazelrc

  # Install the latest version of Bazel.
  use_bazel.sh latest

  if [[ "${PLATFORM}" == 'darwin' ]]; then
    export DEVELOPER_DIR="/Applications/Xcode_${XCODE_VERSION}.app/Contents/Developer"
    export ANDROID_HOME="/Users/kbuilder/Library/Android/sdk"

    # TODO(b/120214184): Workaround for broken macos_external time sync.
    sudo ntpdate -u time.apple.com
  fi
fi

echo "using bazel binary: $(which bazel)"
bazel version

echo "using java binary: $(which java)"
java -version

echo "using go: $(which go)"
go version

run_linux_tests() {
  time bazel fetch ...

  # Build all targets, except objc.
  time bazel build "${DISABLE_SANDBOX_ARGS[@]}" \
  -- //... \
  -//objc/... || ( ls -l ; df -h / ; exit 1 )

  # Run all tests, except manual and objc tests.
  time bazel test \
  --strategy=TestRunner=standalone --test_output=all \
  -- //... \
  -//objc/... || ( ls -l ; df -h / ; exit 1 )
}

run_macos_tests() {
  # Default values for iOS SDK and Xcode. Can be overriden by another script.
  : "${IOS_SDK_VERSION:=11.2}"
  : "${XCODE_VERSION:=9.2}"

  time bazel fetch ...

  # Build all the iOS targets.
  time bazel build "${DISABLE_SANDBOX_ARGS[@]}" \
  --compilation_mode=dbg \
  --dynamic_mode=off \
  --cpu=ios_x86_64 \
  --ios_cpu=x86_64 \
  --experimental_enable_objc_cc_deps \
  --ios_sdk_version="${IOS_SDK_VERSION}" \
  --xcode_version="${XCODE_VERSION}" \
  --verbose_failures \
  --test_output=all \
  //objc/... || ( ls -l ; df -h / ; exit 1 )

  # Run the iOS tests.
  time bazel test "${DISABLE_SANDBOX_ARGS[@]}" \
  --compilation_mode=dbg \
  --dynamic_mode=off \
  --cpu=ios_x86_64 \
  --ios_cpu=x86_64 \
  --experimental_enable_objc_cc_deps \
  --ios_sdk_version="${IOS_SDK_VERSION}" \
  --xcode_version="${XCODE_VERSION}" \
  --verbose_failures \
  --test_output=all \
  //objc:TinkTests || ( ls -l ; df -h / ; exit 1 )
}

run_linux_tests

if [[ "${PLATFORM}" == 'darwin' ]]; then
  run_macos_tests
fi

