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