#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Validate scontrol requeuehold State=SpecialExit.
############################################################################
# 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 script             "$test_dir/job_script"
set job_id             0

regexp "($number)" [get_config_param "MinJobAge"] {} min_age
if {$min_age < 10} {
	skip "MinJobAge too low for this test ($min_age < 10)"
}

proc cleanup {} {
	global job_id

	cancel_job $job_id
}

make_bash_script $script "$bin_sleep 20"

proc check_release { job } {
	global scontrol number

	set priority 0
	spawn $scontrol show job $job
	expect {
		-re "Priority=($number)" {
			set priority $expect_out(1,string)
			exp_continue
		}
		timeout {
			fail "scontrol is not responding"
		}
		eof {
			wait
		}
	}

	subtest {$priority != 0} "Priority should be set to a non-zero value after it was released"
}

spawn $sbatch -N1 -t1 -o /dev/null -e /dev/null $script
expect {
	-re "Submitted batch job ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "sbatch is not responding"
	}
	eof {
		wait
	}
}

if { $job_id == 0 } {
	fail "sbatch did not submit job"
}

wait_for_job -fail $job_id "DONE"

spawn $scontrol requeuehold State=SpecialExit $job_id
expect {
	timeout {
		fail "scontrol is not responding"
	}
	eof {
		wait
	}
}

subtest [check_job_state $job_id SPECIAL_EXIT] "Job state should be SPECIAL_EXIT"

spawn $scontrol release $job_id
expect {
	timeout {
		fail "scontrol is not responding"
	}
	eof {
		wait
	}
}

check_release $job_id
