#! /usr/bin/env bash

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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_dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
at_home=$( cd "$( dirname "$bin_dir" )" && pwd )
at_version=2.0.0-SNAPSHOT

function print_usage() {
  cat <<EOF

Usage: performance-test <command> (<argument>)

Possible commands:
  run <output dir> [filter]        Runs performance tests.
  compare <result 1> <result 2>    Compares results of two test.
  csv {files}                      Converts results to CSV
EOF
}


function build_shade_jar() {
  at_shaded_jar="$at_home/core/target/accumulo-testing-core-$at_version-shaded.jar"
  if [ ! -f "$at_shaded_jar" ]; then
    echo "Building $at_shaded_jar"
    cd "$at_home" || exit 1
    mvn clean package -P create-shade-jar -D skipTests -D accumulo.version=$(get_version "ACCUMULO") -D hadoop.version=$(get_version "HADOOP") -D zookeeper.version=$(get_version "ZOOKEEPER")
  fi
}

log4j_config="$at_home/conf/log4j.properties"
if [ ! -f "$log4j_config" ]; then
  log4j_config="$at_home/conf/log4j.properties.example"
  if [ ! -f "$log4j_config" ]; then
    echo "Could not find logj4.properties or log4j.properties.example in $at_home/conf"
    exit 1
  fi
fi


if [ ! -f "$at_home/conf/cluster-control.sh" ]; then
  echo "Could not find cluster-control.sh"
  exit 1
fi

. $at_home/conf/cluster-control.sh
build_shade_jar
CP="$at_home/core/target/accumulo-testing-core-$at_version-shaded.jar"
perf_pkg="org.apache.accumulo.testing.core.performance.impl"
case "$1" in
  run)
    if [ -z "$2" ]; then
      echo "ERROR: <output dir> needs to be set"
      print_usage
      exit 1
    fi
    mkdir -p "$2"
    start_cluster
    CLASSPATH="$CP" java -Dlog4j.configuration="file:$log4j_config" ${perf_pkg}.ListTests | while read test_class; do
      if [[ -z $3 || $test_class == *$3* ]]; then
        echo "Running test $test_class"
        pt_tmp=$(mktemp -d -t accumulo_pt_XXXXXXX)
        setup_accumulo
        get_config_file accumulo.properties "$pt_tmp"
        CLASSPATH="$CP" java -Dlog4j.configuration="file:$log4j_config"  ${perf_pkg}.MergeSiteConfig "$test_class" "$pt_tmp"
        put_config_file "$pt_tmp/accumulo.properties"
        put_server_code "$at_home/core/target/accumulo-testing-core-$at_version.jar"
        start_accumulo
        get_config_file accumulo-client.properties "$pt_tmp"
        CLASSPATH="$CP" java -Dlog4j.configuration="file:$log4j_config"  ${perf_pkg}.PerfTestRunner "$pt_tmp/accumulo-client.properties" "$test_class" "$(get_version 'ACCUMULO')" "$2"
      fi
    done
    stop_cluster
    ;;
  compare)
    CLASSPATH="$CP" java -Dlog4j.configuration="file:$log4j_config"  ${perf_pkg}.Compare "$2" "$3"
    ;;
  csv)
    CLASSPATH="$CP" java -Dlog4j.configuration="file:$log4j_config"  ${perf_pkg}.Csv "${@:2}"
    ;;
  *)
    echo "Unknown command : $1"
    print_usage
    exit 1
esac

