#!/usr/bin/env expect
############################################################################
# Purpose: Test for proper handling of different rank end times
############################################################################
# Copyright (C) SchedMD LLC.
#
# 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 file_in	"$test_dir/input"
set timeout	60
set het_job_id  0

proc cleanup {} {
	global het_job_id scancel

	if {$het_job_id > 0} {
		exec $scancel $het_job_id
	}
}

if {[get_config_param "SchedulerType"] ne "sched/backfill"} {
	skip "This test requires SchedulerType = sched/backfill"
}

set nb_nodes [get_partition_param [default_partition] "TotalNodes"]
if {$nb_nodes < 3} {
	skip "Need 3 or more nodes in default partition"
}

set component(0) 0
set matches 0
set index 0
set timeout $max_job_delay
spawn $salloc -t1 -N1 : -N1 : -N1 $bin_bash
expect {
	-re "job ($number) has been allocated resources" {
		set het_job_id $expect_out(1,string)
		reset_bash_prompt
		exp_continue
	}
	-re "$test_prompt" {
		#log_debug "Job initiated"
	}
	timeout {
		fail "salloc: allocation not granted in $timeout seconds"
	}
	eof {
		wait
	}
}
if {$het_job_id == 0} {
	fail "salloc failure"
}

make_bash_script $file_in "
#!/usr/bin/env bash
sleep_time=`expr 3 - \$SLURM_PROCID`
sleep \$sleep_time
env | grep SLURMD_NODENAME
"

set matches 0
send "$srun --label --mpi=none --het-group=0-2 $file_in\r"
expect {
	-re "($number): SLURMD_NODENAME" {
		incr matches
		exp_continue
	}
	-re "$test_prompt" {
		#break
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$matches != 3} {
	fail "srun output failure ($matches != 3)"
}

make_bash_script $file_in "
#!/usr/bin/env bash
sleep_time=`expr \$SLURM_PROCID`
sleep \$sleep_time
env | grep SLURMD_NODENAME
"

set matches 0
send "$srun --label --mpi=none --het-group=0-2 $file_in\r"
expect {
	-re "($number): SLURMD_NODENAME" {
		incr matches
		exp_continue
	}
	-re "$test_prompt" {
		#break
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$matches != 3} {
	fail "srun output failure ($matches != 3)"
}

send "exit\r"
expect {
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
