# Copyright (C) 2016-2017 Internet Systems Consortium, Inc. ("ISC")
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

# Path to the temporary configuration file.
CFG_FILE=@abs_top_builddir@/src/bin/agent/tests/test_config.json
# Path to the Control Agent log file.
LOG_FILE=@abs_top_builddir@/src/bin/agent/tests/test.log
# Expected version
EXPECTED_VERSION="@PACKAGE_VERSION@"

# Control Agent configuration to be stored in the configuration file.
# todo: use actual configuration once we support it.
CONFIG="{
    \"Control-agent\":
    {
        \"http-host\": \"127.0.0.1\"
    },
    \"Logging\":
    {
        \"loggers\": [
        {
            \"name\": \"kea-ctrl-agent\",
            \"output_options\": [
                {
                    \"output\": \"$LOG_FILE\"
                }
            ],
            \"severity\": \"DEBUG\"
        }
        ]
    }
}"

# Invalid configuration (syntax error) to check that Kea can check syntax.
CONFIG_BAD_SYNTAX="{
    \"Control-agent\":
    {
        \"http-port\": BOGUS
    }
}"

# Invalid configuration (out of range port) to check that Kea can check syntax.
CONFIG_BAD_VALUE="{
    \"Control-agent\":
    {
        \"http-port\": 80000
    }
}"

bin="kea-ctrl-agent"
bin_path=@abs_top_builddir@/src/bin/agent

# Import common test library.
. @abs_top_builddir@/src/lib/testutils/dhcp_test_lib.sh

# This test verifies that syntax checking works properly. This function
# requires 3 parameters:
# testname
# config - string with a content of the config (will be written to a file)
# exp_code - expected exit code returned by kea (0 - success, 1 - failure)
syntax_check_test() {
    local TESTNAME="${1}"
    local CONFIG="${2}"
    local EXP_CODE="${3}"

    # Log the start of the test and print test name.
    test_start $TESTNAME
    # Remove dangling Kea instances and remove log files.
    cleanup
    # Create correct configuration file.
    create_config "${CONFIG}"
    # Check it
    printf "Running command %s.\n" "\"${bin_path}/${bin} -t ${CFG_FILE}\""
    ${bin_path}/${bin} -t ${CFG_FILE}
    exit_code=$?
    if [ ${exit_code} -ne $EXP_CODE ]; then
        printf "ERROR: expected exit code ${EXP_CODE}, got ${exit_code}\n"
        clean_exit 1
    fi
    test_finish 0
}

# This test verifies that Control Agent is shut down gracefully when it
# receives a SIGINT or SIGTERM signal.
shutdown_test() {
    test_name=${1}  # Test name
    signum=${2}      # Signal number
    # Log the start of the test and print test name.
    test_start ${test_name}
    # Remove dangling D2 instances and remove log files.
    cleanup
    # Create new configuration file.
    create_config "${CONFIG}"
    # Instruct Control Agent to log to the specific file.
    set_logger
    # Start Control Agent.
    start_kea ${bin_path}/${bin}
    # Wait up to 20s for Control Agent to start.
    wait_for_kea 20
    if [ ${_WAIT_FOR_KEA} -eq 0 ]; then
        printf "ERROR: timeout waiting for Control Agent to start.\n"
        clean_exit 1
    fi

    # Check if it is still running. It could have terminated (e.g. as a result
    # of configuration failure).
    get_pid ${bin}
    if [ ${_GET_PIDS_NUM} -ne 1 ]; then
        printf "ERROR: expected one Control Agent process to be started. Found %d processes\
 started.\n" ${_GET_PIDS_NUM}
        clean_exit 1
    fi

    # Check in the log file, how many times server has been configured.
    # It should be just once on startup.
    get_reconfigs
    if [ ${_GET_RECONFIGS} -ne 1 ]; then
        printf "ERROR: server been configured ${_GET_RECONFIGS} time(s), but exactly 1 was expected.\n"
        clean_exit 1
    else
        printf "Server successfully configured.\n"
    fi

    # Send signal to Control Agent (SIGTERM, SIGINT etc.)
    send_signal ${signum} ${bin}

    # Now wait for process to log that it is exiting.
    wait_for_message 10 "DCTL_SHUTDOWN" 1
    if [ ${_WAIT_FOR_MESSAGE} -eq 0 ]; then
        printf "ERROR: Control Agent did not log shutdown.\n"
        clean_exit 1
    fi

    # Make sure the server is down.
    wait_for_server_down 5 ${bin}
    assert_eq 1 ${_WAIT_FOR_SERVER_DOWN} \
        "Expected wait_for_server_down return %d, returned %d"

    test_finish 0
}

server_pid_file_test "${CONFIG}" DCTL_ALREADY_RUNNING
shutdown_test "ctrl-agent.sigterm_test" 15
shutdown_test "ctrl-agent.sigint_test" 2
syntax_check_test "ctrl-agent.syntax_check_success" "${CONFIG}" 0
syntax_check_test "ctrl-agent.syntax_check_bad_syntax" "${CONFIG_BAD_SYNTAX}" 1
syntax_check_test "ctrl-agent.syntax_check_bad_values" "${CONFIG_BAD_VALUE}" 1
