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

copy_ql_results(){
	if [[ ${1} = "ql_gf_web_profile_all" || ${1} = "ql_gf_full_profile_all" || "ql_gf_embedded_profile_all" = ${1} ]]; then
		tar -cf ${WORKSPACE}/results/domainArchive.tar.gz ${WORKSPACE}/glassfish6/glassfish/domains
		cp ${WORKSPACE}/glassfish6/glassfish/domains/domain1/logs/server.log* ${WORKSPACE}/results/ || true
		cp -r ${WORKSPACE}/appserver/tests/quicklook/test-output/* ${WORKSPACE}/results/
		cp ${WORKSPACE}/appserver/tests/quicklook/test-output/TESTS-TestSuites.xml ${WORKSPACE}/results/junitreports/test_results_junit.xml
		cp ${WORKSPACE}/appserver/tests/quicklook/quicklook_summary.txt ${WORKSPACE}/results || true
	else
		cp ${WORKSPACE}/nucleus/domains/domain1/logs/server.log* ${WORKSPACE}/results
	fi
	cp ${TEST_RUN_LOG} ${WORKSPACE}/results/
	tar -cf ${WORKSPACE}/${1}-results.tar.gz ${WORKSPACE}/results
	change_junit_report_class_names
}

run_test_id(){
	if [[ ${1} = "ql_gf_full_profile_all" ]]; then
	    
	    # Run quick look full profile tests using the full glassfish distribution (GD) build
	
		unzip_test_resources ${WORKSPACE}/bundles/glassfish.zip
		
		cd ${WORKSPACE}/appserver/tests/quicklook/
		
		mvn -Dglassfish.home=${S1AS_HOME} -Ptest_gd_security,report test | tee ${TEST_RUN_LOG}
	elif [[ ${1} = "ql_gf_nucleus_all" || ${1} = "nucleus_admin_all" ]]; then
	    
	    # Run quick look nucleus tests using the nucleus build
	
		unzip_test_resources ${WORKSPACE}/bundles/nucleus-new.zip
		
		if [[ ${1} = "ql_gf_nucleus_all" ]]; then
			cd ${WORKSPACE}/nucleus/tests/quicklook
		elif [[ ${1} = "nucleus_admin_all"  ]]; then
			cd ${WORKSPACE}/nucleus/tests/admin
		fi
		
		mvn -Dmaven.test.failure.ignore=true -Dnucleus.home=${WORKSPACE}/nucleus clean test | tee ${TEST_RUN_LOG}
		
		if [[ ${1} = "ql_gf_nucleus_all" ]]; then
			merge_junit_xmls ${WORKSPACE}/nucleus/tests/quicklook/target/surefire-reports/junitreports
		elif [[ ${1} = "nucleus_admin_all"  ]]; then
			merge_junit_xmls ${WORKSPACE}/nucleus/tests/admin/target/surefire-reports/junitreports
		fi
	elif [[ ${1} = "ql_gf_web_profile_all" || $1 = "ql_gf_embedded_profile_all" ]]; then
	    
	    # Run quick look EE web profile tests using the web profile glassfish distribution (WD, Web Distribution) build 
	
        unzip_test_resources ${WORKSPACE}/bundles/web.zip
		
		cd ${WORKSPACE}/appserver/tests/quicklook/
		
		if [[ ${1} = "ql_gf_web_profile_all" ]]; then
			mvn -Dglassfish.home=${S1AS_HOME} -Ptest_wd_security,report test | tee ${TEST_RUN_LOG}
		elif [[ ${1} = "ql_gf_embedded_profile_all" ]]; then
			mvn -Dglassfish.home=${S1AS_HOME} -Ptest_em,report test | tee ${TEST_RUN_LOG}
		fi
	else
		echo "Invalid Test Id!"
		exit 1
	fi
}

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 "</testsuites>" >> ${JUD}
}

list_test_ids(){
	echo ql_gf_full_profile_all ql_gf_nucleus_all ql_gf_web_profile_all ql_gf_embedded_profile_all nucleus_admin_all
}

OPT=${1}
TEST_ID=${2}
source `dirname ${0}`/../common_test.sh
mkdir -p ${WORKSPACE}/results/junitreports

case ${OPT} in
	list_test_ids )
		list_test_ids;;
	run_test_id )
    trap "copy_ql_results ${TEST_ID}" EXIT
		run_test_id ${TEST_ID} ;;
esac
