#!/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 binary installer within Docker container.
#

NAME="apacheds-${project.version}"
DIRNAME="${NAME}"
SERVICE_NAME="${NAME}-default"

wait_for_apacheds() {
    timeout 60  sh -c "while ! nc -z localhost 10389; do sleep 1; done"
}

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

# trace commands
set -x

# install
chmod +x /apacheds.bin
# skip license text
#export MORE="-10000"
# agree to license terms and accept default install options
./apacheds.bin << END_OF_RESPONSES
yes






END_OF_RESPONSES

# 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
service ${SERVICE_NAME} status | grep "ApacheDS - default is not running"
service ${SERVICE_NAME} status || test $? -ne 0

# install ldapsearch and tools
apt-get -qq update
apt-get -qq -y install ldap-utils netcat

# set wrapper java path
echo "" >> /var/lib/${DIRNAME}/default/conf/wrapper-instance.conf
echo "wrapper.java.command=$JAVA_HOME/bin/java" >> /var/lib/${DIRNAME}/default/conf/wrapper-instance.conf

# start
service ${SERVICE_NAME} start
wait_for_apacheds

# assert running: output and exit status
service ${SERVICE_NAME} status | grep "ApacheDS - default is running"
service ${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, should be started afterwards)
service ${SERVICE_NAME} stop
service ${SERVICE_NAME} repair
wait_for_apacheds
service ${SERVICE_NAME} status | grep "ApacheDS - default is running"
service ${SERVICE_NAME} status && test $? -eq 0

# restart and search a few times
for i in 1 2 3
do
    service ${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
service ${SERVICE_NAME} stop

# assert not running: output and exit status
service ${SERVICE_NAME} status | grep "ApacheDS - default is not running"
service ${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

# SUCCESS
echo "SUCCESS"

