#!/usr/bin/env bash
# ============LICENSE_START=======================================================
#  Copyright (C) 2018-2019 Nordix Foundation.
# ================================================================================
# 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.
#
# SPDX-License-Identifier: Apache-2.0
# ============LICENSE_END=========================================================
set -o nounset
set -o errexit
set -o pipefail
#set -o xtrace

GEODE_NATIVE_DIR="${WORKSPACE}/geode-native"
SOURCE_DIR="/geode-native"

CTEST_TIMEOUT=2000
CTEST_JOBS=$(( $(nproc) / 4 ))
CTEST_ARGS="--output-on-failure --repeat until-pass:4 --schedule-random"

DOCKER_ARGS="--rm --volume=${GEODE_NATIVE_DIR}:${SOURCE_DIR}\
  -e LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libSegFault.so"
COMMAND="echo -e '\n*** Build ***\n' && mkdir build && cd build &&\
  cmake ${SOURCE_DIR} -DCMAKE_CXX_FLAGS=-stdlib=libc++ -DCMAKE_CXX_CLANG_TIDY=clang-tidy &&\
  cmake --build . -- -j${JOBS} && echo -e '\n*** Old Integration Tests ***\n' &&\
  cd /build/cppcache/integration-test &&\
  ctest -L STABLE -C Release -j${CTEST_JOBS} --timeout ${CTEST_TIMEOUT} ${CTEST_ARGS}"

docker run ${DOCKER_ARGS} "${GEODE_NATIVE_DOCKER_IMAGE}" bash -c "${COMMAND}"
