#!/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.
##
# Script to run unit tests for xml <-> 1 or more Configuration file verification
# usage: ./verify-xml.sh <mode>
#

# Utility functions
function find_test_output_file() {
  echo "Found test output file(s) at"
  echo ""
  if [ -n "$1" ] && [ -e "$1" ] ; then
    echo "  $1"
  fi
  if [ -n "$2" ] && [ -e "$2" ] ; then
    echo "  $2"
  fi
  if [ -n "$3" ] && [ -e "$3" ] ; then
    echo "  $3"
  fi
  if [ -n "$4" ] && [ -e "$4" ] ; then
    echo "  $4"
  fi
  echo ""
  echo "Examine the file for specific information xml/Configuration mismatches."
  echo ""
}

function print_test_banner() {
  local banner_text=$1
  local banner_length=${#banner_text}
  local banner
  banner=$( printf "%${banner_length}s" ' ' )
  echo ""
  echo "${banner// /=}"
  echo "${banner_text}"
  echo "${banner// /=}"
  echo ""
}

# Wrapper functions for running unit tests
function run_all_xml_test() {
  mvn test -Dtest=TestCommonConfigurationFields,TestHdfsConfigFields,TestMapreduceConfigFields,TestYarnConfigurationFields
  if [ $? -ne 0 ] ; then
    print_test_banner "All Test*ConfigFields FAIL"
  else
    print_test_banner "All Test*ConfigFields SUCCESS"
  fi
}

function run_common_xml_test() {
  mvn test -Dtest=TestCommonConfigFields
  if [ $? -ne 0 ] ; then
    print_test_banner "TestCommonConfigurationFields FAIL"
  else
    print_test_banner "TestCommonConfigurationFields SUCCESS"
  fi
}

function run_hdfs_xml_test() {
  mvn test -Dtest=TestHdfsConfigFields
  if [ $? -ne 0 ] ; then
    print_test_banner "TestHdfsConfigFields FAIL"
  else
    print_test_banner "TestHdfsConfigFields SUCCESS"
  fi
}

function run_mapreduce_xml_test() {
  mvn test -Dtest=TestMapreduceConfigFields
  if [ $? -ne 0 ] ; then
    print_test_banner "TestMapreduceConfigFields FAIL"
  else
    print_test_banner "TestMapreduceConfigFields SUCCESS"
  fi
}

function run_yarn_xml_test() {
  mvn test -Dtest=TestYarnConfigurationFields
  if [ $? -ne 0 ] ; then
    print_test_banner "TestYarnConfigurationFields FAIL"
  else
    print_test_banner "TestYarnConfigurationFields SUCCESS"
  fi
}

# Main body
cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")/.." || exit
dir="$(pwd -P)"

# - Create unit test file names
export commonOutputFile
commonOutputFile="$(find "${dir}" -name org.apache.hadoop.conf.TestCommonConfigurationFields-output.txt)"
export hdfsOutputFile
hdfsOutputFile="$(find "${dir}" -name org.apache.hadoop.tools.TestHdfsConfigFields-output.txt)"
export mrOutputFile
mrOutputFile="$(find "${dir}" -name org.apache.hadoop.mapreduce.TestMapreduceConfigFields-output.txt)"
export yarnOutputFile
yarnOutputFile="$(find "${dir}" -name org.apache.hadoop.yarn.conf.TestYarnConfigurationFields-output.txt)"

# - Determine which tests to run
case "$1" in

  all)
    run_all_xml_test
    find_test_output_file "${commonOutputFile}" "${hdfsOutputFile}" "${mrOutputFile}" "${yarnOutputFile}"
    ;;

  common)
    run_common_xml_test
    find_test_output_file "${commonOutputFile}"
    ;;

  hdfs)
    run_hdfs_xml_test
    find_test_output_file "${hdfsOutputFile}"
    ;;

  mr)
    run_mapreduce_xml_test
    find_test_output_file "${mrOutputFile}"
    ;;

  yarn)
    run_yarn_xml_test
    find_test_output_file "${yarnOutputFile}"
    ;;

  *)
    echo "Usage: $0 <mode>"
    echo "  where <mode> is one of all, common, hdfs, mr, yarn"
    exit 1
    ;;

esac