#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Checks that scontrol write config creates a slurm.conf
#          with the correct values
#
#
# Output:  "TEST: #.#" followed by "SUCCESS" if test was successful, OR
#          "FAILURE: ..." otherwise with an explanation of the failure, OR
#          anything else indicates a failure mode that must be investigated.
############################################################################
# Copyright (C) 2014 SchedMD LLC
# Written by Nathan Yee <nyee32@schedmd.com>
#
# This file is part of Slurm, a resource management program.
# For details, see <https://slurm.schedmd.com/>.
# Please also read the included file: DISCLAIMER.
#
# Slurm is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation; either version 2 of the License, or (at your option)
# any later version.
#
# Slurm is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along
# with Slurm; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA.
############################################################################
source ./globals

set test_id       2.24
set option        ""
set value         ""
array set conf_val {}
set new_conf      ""
set opt_cnt       0
set exit_code     0

print_header $test_id

if {[is_super_user] == 0} {
	send_user "\nWARNING: this test requires that the user be root or "
	send_user "the SlurmUser\n"
}

#
# User scontrol show config to get some values to check
# against the new created file
#
log_user 0
set val ""
set option ""
spawn $scontrol show config
expect {
	-re "^$" {
		# break here since other config files are listed here
		# scontrol write config only prints out the normal slurm.conf
	}
	-re "($alpha_numeric_under) *= ($format_time)" {
		set option $expect_out(1,string)
		set val $expect_out(2,string)
		set conf_val($option) $val
		incr opt_cnt
		exp_continue
	}
	-re "($alpha_numeric_under) *= ($alpha_numeric_under)" {
		set option $expect_out(1,string)
		set val $expect_out(2,string)

		# Exclude ENV variable that appear in scontrol show config
		# Also "SuspendTime=NONE" gets written as "SuspendTime=0"
		if {$option != "BOOT_TIME" &&
		    $option != "HASH_VAL"  &&
		    $option != "MULTIPLE_SLURMD" &&
		    $option != "NEXT_JOB_ID" &&
		    $option != "SLURM_CONF" &&
		    $option != "SLURM_VERSION"} {
			set conf_val($option) $val
			incr opt_cnt
		}
		exp_continue
	}
	timeout {
		send_user "\nFAILURE: scontrol is not responding\n"
		set exit_code 1
	}
	eof {
		wait
	}
}
log_user 1

#
# Execute scontrol write config and get the path and filename of the
# created file
#
spawn $scontrol write config
expect {
	-re "(/.*)/*($alpha_numeric_under)*\r\n" {
		set new_conf $expect_out(1,string)
		exp_continue
	}
	timeout {
		send_user "\nFAILURE: scontrol is not responding\n";
		set exit_code 1
	}
	eof {
		wait
	}
}

#
# Loop through the hash and check that the parameters exist within
# the new conf file
#
set tot_match 0
foreach opt [array names conf_val] {

	log_user 0
	set match 0

	spawn $bin_cat $new_conf
	expect {
		-re "$opt=$conf_val($opt)" {
			set match 1
			exp_continue
		}
		-re "#$opt=" {
			set match 1
			exp_continue
		}
		timeout {
			send_user "\nFAILURE: scontrol is not responding\n"
			set exit_code 1
		}
		eof {
			wait
		}
	}
	log_user 1

	if {$match != 1} {
		send_user "\nFAILURE: $opt = $conf_val($opt)"
		send_user " Was not found in new config file\n"
		set exit_code 1
	} else {
		incr tot_match
	}
}
if {$tot_match != $opt_cnt} {
	send_user "FAILURE: not all the values in the new config "
	send_user "file were found ($tot_match != $opt_cnt)\n"
	set exit_code 1
}

if {$exit_code == 0} {
	exec $bin_rm -f $new_conf
	send_user "\nSUCCESS\n"
}

exit $exit_code
