#!/bin/bash

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License. 

# 
# Script to test RPM installer within Docker container.
#
# Please note to replace dashes '-' by underscores '_' in VERSION.
#

# stop execution if any command fails (i.e. exits with status code > 0)
set -e

# trace commands
set -x

RPM_VERSION=$(echo "${project.version}" | tr - _)
NAME="apacheds-${RPM_VERSION}"
DIRNAME="${NAME}"
SERVICE_NAME="${NAME}-default"

wait_for_apacheds() {
    timeout 60  sh -c "while ! nmap -Pn -p 10389 localhost | grep "10389.*open"; do sleep 1; done"
}

# install packages
yum -y -q install openldap-clients nmap procps
command -v java >/dev/null 2>&1 || yum -y -q install java-openjdk-headless

# assert no duplicate files (DIRSERVER-2197)
test $(rpm -qlp /apacheds.rpm | sort | uniq -cd | wc -l) -eq 0

# install ApacheDS
rpm -Uvh apacheds.rpm

# assert installed
rpm -q apacheds | grep apacheds

# assert files and directories exist
test -f /opt/${DIRNAME}/LICENSE
test -f /opt/${DIRNAME}/NOTICE
test -d /var/lib/${DIRNAME}/default

# assert not running: output and exit status
/etc/init.d/${SERVICE_NAME} status | grep "ApacheDS - default is not running"
/etc/init.d/${SERVICE_NAME} status || test $? -ne 0

# start
/etc/init.d/${SERVICE_NAME} start
wait_for_apacheds

# assert running: output and exit status
/etc/init.d/${SERVICE_NAME} status | grep "ApacheDS - default is running"
/etc/init.d/${SERVICE_NAME} status && test $? -eq 0

# search
ldapsearch -h localhost -p 10389 -x -D "uid=admin,ou=system" -w secret -s base -b "dc=example,dc=com"

# repair (stop before and start after)
/etc/init.d/${SERVICE_NAME} stop
/etc/init.d/${SERVICE_NAME} repair
wait_for_apacheds
/etc/init.d/${SERVICE_NAME} status | grep "ApacheDS - default is running"
/etc/init.d/${SERVICE_NAME} status && test $? -eq 0

# restart and search a few times
for i in 1 2 3
do
    /etc/init.d/${SERVICE_NAME} restart
    wait_for_apacheds
    ldapsearch -h localhost -p 10389 -x -D "uid=admin,ou=system" -w secret -s base -b "dc=example,dc=com"
done

# stop
/etc/init.d/${SERVICE_NAME} stop

# assert not running: output and exit status
/etc/init.d/${SERVICE_NAME} status | grep "ApacheDS - default is not running"
/etc/init.d/${SERVICE_NAME} status || test $? -ne 0

# assert password warning in log
grep ".*WARN.*admin password.*security breach.*" /var/lib/${DIRNAME}/default/log/apacheds.log
# assert no error in log
grep ".*ERROR.*" /var/lib/${DIRNAME}/default/log/apacheds.log && false

# uninstall
rpm -e apacheds

# assert files and directory no more exist
test ! -e /opt/${DIRNAME}
 
# SUCCESS
echo "SUCCESS"

