#!/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
#

list_test_ids(){
  echo admingui_all
}

merge_junit_xmls(){
  JUD_DIR=${1}
  JUD=${WORKSPACE}/results/junitreports/test_results_junit.xml
  rm -f ${JUD} || true
  echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" >> ${JUD}
  echo "<testsuites>" >> ${JUD}
  find ${JUD_DIR} -name "*.xml" -type f -exec cat '{}' \; | ${SED} 's/<?xml version=\"1.0\" encoding=\"UTF-8\" ?>//g' >> ${JUD}
  echo -e "\n</testsuites>" >> ${JUD}
}

test_run(){
  export PWD=$(date | md5sum | cut -d' ' -f 1)
  touch ${APS_HOME}/password.txt
  chmod 600 ${APS_HOME}/password.txt
  echo "AS_ADMIN_PASSWORD=" > ${APS_HOME}/password.txt
  echo "AS_ADMIN_NEWPASSWORD=${PWD}" >> ${APS_HOME}/password.txt
  LOCKFILE=${S1AS_HOME}/domains/domain1/imq/instances/imqbroker/lockv
  if [ -f ${LOCKFILE} ];then
    rm ${LOCKFILE}
  fi
  ${S1AS_HOME}/bin/asadmin --user admin --passwordfile ${APS_HOME}/password.txt change-admin-password
  ${S1AS_HOME}/bin/asadmin start-domain
  echo "AS_ADMIN_PASSWORD=${PWD}" > ${APS_HOME}/password.txt
  ${S1AS_HOME}/bin/asadmin --passwordfile ${APS_HOME}/password.txt enable-secure-admin
  ${S1AS_HOME}/bin/asadmin restart-domain
  cd ${APS_HOME}/../../admingui/devtests/
  export DISPLAY=127.0.0.1:1	
  mvn -DsecureAdmin=true -Dpasswordfile=${APS_HOME}/password.txt test | tee ${TEST_RUN_LOG}
  ${S1AS_HOME}/bin/asadmin stop-domain
  rm -rf ${APS_HOME}/password.txt
}

run_test_id(){
  source `dirname ${0}`/../../tests/common_test.sh
  kill_process
  unzip_test_resources ${WORKSPACE}/bundles/glassfish.zip
  cd `dirname ${0}`
  test_init
  test_run
  merge_junit_xmls ${WORKSPACE}/appserver/admingui/devtests/target/surefire-reports
  change_junit_report_class_names
}

post_test_run(){
  cp $TEST_RUN_LOG ${WORKSPACE}/results/ || true
  cp ${WORKSPACE}/glassfish6/glassfish/domains/domain1/logs/server.log* ${WORKSPACE}/results/ || true
  cp ${WORKSPACE}/appserver/admingui/devtests/target/surefire-reports/*.png ${WORKSPACE}/results/ || true
}

OPT=${1}
TEST_ID=$2
case ${OPT} in
  list_test_ids )
    list_test_ids;;
  run_test_id )
    trap post_test_run SIGTERM SIGABRT EXIT
    run_test_id ${TEST_ID} ;;
esac
