#!/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}/glassfish7/glassfish/domains
        cp ${WORKSPACE}/glassfish7/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 -czf ${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
