#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Validate scontrol exit, quit, and !! commands.
#
# NOTE: The interaction processing is a bit strange to deal with the
# behavior of readline() in RedHat 9, that keeps printing the prompt
# for each keystroke.
############################################################################
# Copyright (C) 2002 The Regents of the University of California.
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
# Written by Morris Jette <jette1@llnl.gov>
# CODE-OCEC-09-009. All rights reserved.
#
# 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

#
# Report the slurm daemon status and explicitly exit
#
set matches     0
set ping_sent   0
set exit_sent   0
spawn $scontrol
expect {
	 -re "Slurmctld.primary" {
		incr matches
		exp_continue
	}
	-re "scontrol: " {
		if {$matches == 0} {
			if {$ping_sent == 0} {
				send "ping\r"
				set ping_sent 1
			}
		} else {
			if {$exit_sent == 0} {
				send "exit\r"
				set exit_sent 1
			}
		}
		exp_continue
	}
	timeout {
		fail "scontrol not responding"
	}
	eof {
		wait
	}
}
subtest {$matches == 1} "scontrol ping and exit were sent"

#
# Report the slurm daemon status and explicitly quit
#
set matches     0
set ping_sent   0
set quit_sent   0
spawn $scontrol
expect {
	-re "Slurmctld.primary" {
		incr matches
		exp_continue
	}
	-re "scontrol: " {
		if {$matches == 0} {
			if {$ping_sent == 0} {
				send "ping\r"
				set ping_sent 1
			}
		} else {
			if {$quit_sent == 0} {
				send "quit\r"
				set quit_sent 1
			}
		}
		exp_continue
	}
	timeout {
		fail "scontrol not responding"
	}
	eof {
		wait
	}
}
subtest {$matches == 1} "scontrol ping and quit were sent"

#
# Report the slurm daemon status, repeat via !! command and explicitly quit
#
set matches     0
set ping_sent   0
set excl_sent   0
set quit_sent   0
spawn $scontrol
expect {
	-re "Slurmctld.primary" {
		incr matches
		exp_continue
	}
	-re "scontrol: " {
		if {$matches == 0} {
			if {$ping_sent == 0} {
				send "ping\r"
				set ping_sent 1
			}
		}
		if {$matches == 1} {
			if {$excl_sent == 0} {
				send "!!\r"
				set excl_sent 1
			}
		}
		if {$matches > 1} {
			if {$quit_sent == 0} {
				send "quit\r"
				set quit_sent 1
			}
		}
		exp_continue
	}
	timeout {
		fail "scontrol not responding"
	}
	eof {
		wait
	}
}
subtest {$matches == 2} "scontrol ping, !! and quit commands were sent"
