#!/bin/bash
#
# Copyright (c) 2017, 2018 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
#

test_run(){

	#cp -f ${APS_HOME}/devtests/security/ldap/opends/X500Signer.jar ${OPENDS_HOME}/lib

	# Configure and start OpenDS using the default ports
	${OPENDS_HOME}/setup \
    -i \
    -v \
    -n \
    -p 1389 \
    --adminConnectorPort 4444 \
    -x 1689 \
    -w dmanager \
    -b "dc=sfbay,dc=sun,dc=com" \
    -Z 1636 \
    --useJavaKeystore ${S1AS_HOME}/domains/domain1/config/keystore.jks \
    -W changeit \
    -N s1as

	${S1AS_HOME}/bin/asadmin start-database
	${S1AS_HOME}/bin/asadmin start-domain
	cd ${APS_HOME}/devtests/security

	ant ${TARGET} | tee ${TEST_RUN_LOG}

	${S1AS_HOME}/bin/asadmin stop-domain
	${S1AS_HOME}/bin/asadmin stop-database
	${OPENDS_HOME}/bin/stop-ds \
    -p 4444 \
    -D "cn=Directory Manager" \
    -w dmanager \
    -P ${OPENDS_HOME}/config/admin-truststore \
    -U ${OPENDS_HOME}/config/admin-keystore.pin

	#egrep 'FAILED= *0' ${TEST_RUN_LOG}
	#egrep 'DID NOT RUN= *0' ${TEST_RUN_LOG}
	cd -
}

get_test_target(){
	case $1 in
		security_all )
			TARGET=all
			export TARGET;;
	esac
}

merge_result_files(){
	cat ${APS_HOME}/test_resultsValid.xml ${APS_HOME}/security-gtest-results.xml > ${APS_HOME}/temp.xml
	mv ${APS_HOME}/temp.xml ${APS_HOME}/test_resultsValid.xml
}

run_test_id(){
  # setup opendj (fork of opends)
  curl -L -k https://github.com/OpenIdentityPlatform/OpenDJ/releases/download/4.1.10/opendj-4.1.10.zip > opendj-4.1.10.zip
  unzip -o opendj-4.1.10.zip
  export OPENDS_HOME=${PWD}/opendj

	unzip_test_resources ${WORKSPACE}/bundles/glassfish.zip
	cd `dirname ${0}`
	test_init
	get_test_target ${1}
	test_run
	merge_result_files
	check_successful_run
  generate_junit_report ${1}
  change_junit_report_class_names
}

list_test_ids(){
	echo security_all
}

OPT=${1}
TEST_ID=${2}
source `dirname ${0}`/../../../common_test.sh

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