#!/bin/bash -ex
#
# Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v. 2.0, which is available at
# http://www.eclipse.org/legal/epl-2.0.
#
# This Source Code may also be made available under the following Secondary
# Licenses when the conditions for such availability set forth in the
# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
# version 2 with the GNU Classpath Exception, which is available at
# https://www.gnu.org/software/classpath/license.html.
#
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
#

# OS-specific section
if [ `uname | grep -i "sunos" | wc -l | awk '{print $1}'` -eq 1 ] ; then
  GREP="ggrep"
  AWK="gawk"
  SED="gsed"
  BC="gbc"
  export PATH=/gf-hudson-tools/bin:${PATH}
else
  GREP="grep"
  AWK="awk"
  SED="sed"
  BC="bc"
fi
export GREP AWK SED BC

kill_clean(){
  if [ ${#1} -ne 0 ] ; then kill -9 ${1} || true ; fi
}

kill_process(){
  printf "\n%s \n\n" "===== KILL THEM ALL ====="
  kill_clean `jps | grep ASMain | awk '{print $1}'`
  kill_clean `jps | grep DerbyControl | awk '{print $1}'`
  kill_clean `jps | grep DirectoryServer | awk '{print $1}'`
}

test_init(){
  printf "\n%s \n\n" "===== V2 DEVTESTS INIT ====="
  # workaround for OSGI timestamp issue
  find ${S1AS_HOME} -type f | xargs touch > /dev/null
  echo S1AS_HOME is ${S1AS_HOME}
  echo ANT_HOME is ${ANT_HOME}
  echo APS_HOME is ${APS_HOME}
  java -version
  ant -version
  mkdir -p ${WORKSPACE}/results/junitreports
  printf "\n\n"
}

zip_test_results(){
  printf "\n%s \n\n" "===== ZIP THE TESTS RESULTS ====="
  zip -r ${WORKSPACE}/results.zip ${WORKSPACE}/results > /dev/nul
}

unzip_test_resources(){
  printf "\n%s \n\n" "===== UNZIP TEST RESOURCES ====="
  for i in "${@}"; do
    if [[ ${i} == *.zip* ]]; then
      unzip -qq -o ${i}
    else
      tar --overwrite -xf ${i}
    fi
  done
}

copy_test_artifacts(){
  printf "\n%s \n\n" "===== COPY TEST ARTIFACTS ====="
  mkdir -p ${WORKSPACE}/results/junitreports
  tar -cf ${WORKSPACE}/results/domainArchive.tar.gz ${S1AS_HOME}/domains
  cp ${S1AS_HOME}/domains/domain1/logs/server.log* ${WORKSPACE}/results/ || true
  cp ${TEST_RUN_LOG} ${WORKSPACE}/results/
  cp ${APS_HOME}/test_results*.* ${WORKSPACE}/results/ || true
  cp `pwd`/*/*logs.zip ${WORKSPACE}/results/ || true
  cp `pwd`/*/*/*logs.zip ${WORKSPACE}/results/ || true
  tar -cf ${WORKSPACE}/${1}-results.tar.gz ${WORKSPACE}/results
}

generate_junit_report(){
  printf "\n%s \n\n" "===== GENERATE JUNIT REPORT ====="
  TD=${APS_HOME}/test_resultsValid.xml
  JUD=${APS_HOME}/test_results_junit.xml
  TESTSUITE_NAME=${1}

  cat ${TD} | ${AWK} -v suitename=${TESTSUITE_NAME} '
    BEGIN {
      totaltests = 0;
      totalfailures = 0;
      totalerrors = 0;
    }
    function getPropVal(str){
      split(str, a, "=");
      val = a[2];
      # remove quotes
      gsub("\"","",val);
      return val;
    }
     function removeXMLTag(str){
      # remove xml tag quotes
      gsub("</.*>","",str);
      gsub("<.*>","",str);
      gsub(">","",str);
      return str;
    }
    /status value=/ {
      result=getPropVal($0);
      result=removeXMLTag(result);
    }
    /<testsuite>/ {
      getline;
      getline;
      testunit=removeXMLTag($0);
      gsub("\"","",testunit);
    }
    /<testcase>/ {
      getline;
      testname=removeXMLTag($0);
      gsub("\"","",testname);
    }
    /<\/testcase>/{
      classname=testunit
      # printing testcase to out
      out = out sprintf(" <testcase classname=\"%s\" name=\"%s\" time=\"0.0\">\n", classname, testname);
      if (result == "fail") {
       out = out "  <failure message=\"NA\" type=\"NA\"/>\n";
       totalfailures++;
      } else if (result == "did_not_run") {
       out = out "  <error message=\"NA\" type=\"NA\"/>\n";
       totalerrors++;
      }
      out = out " </testcase>\n";

      totaltests++;
      result="";
      testname="";
    }
    END {
      print "<?xml version=\"1.0\" ?>"
      printf "<testsuite tests=\"%d\" failures=\"%d\" errors=\"%d\" name=\"%s\">\n", totaltests, totalfailures, totalerrors, suitename;
      printf "%s", out;
      print "</testsuite>"
    }' > ${JUD}
  cp ${JUD} ${WORKSPACE}/results/junitreports
}

change_junit_report_class_names(){
  ${SED} -i 's/\([a-zA-Z-]\w*\)\./\1-/g' ${WORKSPACE}/results/junitreports/*.xml
  ${SED} -i "s/\bclassname=\"/classname=\"${TEST_ID}./g" ${WORKSPACE}/results/junitreports/*.xml
}

check_successful_run(){
  printf "\n%s \n\n" "===== CHECK SUCCESSFUL RUN ====="
  FILE=${APS_HOME}/test_results.html
  if [ -f ${FILE} ]; then
    echo "File ${FILE} exists.Test build successful"
  else
    echo "File ${FILE} does not exist.There is problem in test build."
    exit 1
  fi
}
