#!/bin/bash

# Copyright (C) 2019 The Android Open Source Project.
#
# 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.

# launcher script for mts-tradefed harness
# can be used from an Android build environment, or a standalone mts zip

checkFile() {
    if [ ! -f "$1" ]; then
        echo "Unable to locate $1"
        exit
    fi;
}

checkPath() {
    if ! type -P $1 &> /dev/null; then
        echo "Unable to find $1 in path."
        exit
    fi;
}

checkPath adb
checkPath java

# check java version
JAVA_VERSION=$(java -version 2>&1 | head -n 1 | grep 'version [ "]\(1\.8\|9\).*[ "]')
if [ "${JAVA_VERSION}" == "" ]; then
    echo "Wrong java version. 1.8 or 9 is required."
    exit
fi

# check debug flag and set up remote debugging
if [ -n "${TF_DEBUG}" ]; then
  if [ -z "${TF_DEBUG_PORT}" ]; then
    TF_DEBUG_PORT=10088
  fi
  RDBG_FLAG=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=${TF_DEBUG_PORT}
fi

# get OS
HOST=`uname`
if [ "$HOST" == "Linux" ]; then
    OS="linux-x86"
elif [ "$HOST" == "Darwin" ]; then
    OS="darwin-x86"
else
    echo "Unrecognized OS"
    exit
fi

# check if in Android build env
if [ ! -z "${ANDROID_BUILD_TOP}" ]; then
    if [ ! -z "${ANDROID_HOST_OUT}" ]; then
      MTS_ROOT=${ANDROID_HOST_OUT}/mts
    else
      MTS_ROOT=${ANDROID_BUILD_TOP}/${OUT_DIR:-out}/host/${OS}/mts
    fi
    if [ ! -d ${MTS_ROOT} ]; then
        echo "Could not find $MTS_ROOT in Android build environment. Try 'make mts'"
        exit
    fi;
fi;

if [ -z ${MTS_ROOT} ]; then
    # assume we're in an extracted mts install
    MTS_ROOT="$(dirname $0)/../.."
fi;

JAR_DIR=${MTS_ROOT}/android-mts/tools

TRADEFED_JAR="tradefed"

JARS="tradefed
  loganalysis
  hosttestlib
  compatibility-host-util
  mts-tradefed
  mts-tradefed-tests"

for JAR in $JARS; do
    checkFile ${JAR_DIR}/${JAR}.jar
    JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}.jar
done

OPTIONAL_JARS="
  google-tradefed
  google-tradefed-tests
  google-tf-prod-tests"

for JAR in $OPTIONAL_JARS; do
    if [ -f "$JAR.jar" ]; then
        JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}.jar
    fi;
done

# load any shared libraries for host-side executables
LIB_DIR=${MTS_ROOT}/android-mts/lib
if [ "$HOST" == "Linux" ]; then
    LD_LIBRARY_PATH=${LIB_DIR}:${LIB_DIR}64:${LD_LIBRARY_PATH}
    export LD_LIBRARY_PATH
elif [ "$HOST" == "Darwin" ]; then
    DYLD_LIBRARY_PATH=${LIB_DIR}:${LIB_DIR}64:${DYLD_LIBRARY_PATH}
    export DYLD_LIBRARY_PATH
fi

# include any host-side test jars
for j in ${MTS_ROOT}/android-mts/testcases/*.jar; do
    JAR_PATH=${JAR_PATH}:$j
done

java $RDBG_FLAG -cp ${JAR_PATH} -DMTS_ROOT=${MTS_ROOT} com.android.compatibility.common.tradefed.command.CompatibilityConsole "$@"


