#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          to be called from test21.30
#          Tests if the MaxJobs limit is enforced
############################################################################
# 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.
############################################################################

# Test MaxJobs limit
proc inc21_30_7 { wait_reason } {
	global srun acct bin_sleep maxjobs_num

	log_info "Starting $wait_reason test"
	set check_num $maxjobs_num
	set job_ids [list]

	# Raise an error to abort the catch block
	set exception_code [catch {

		for {set inx 0} {$inx < $check_num} {incr inx} {
			lappend job_ids [submit_job -fail "--account=$acct -t1 -n1 -o none --wrap '$srun $bin_sleep 300'"]
		}

		foreach job_id $job_ids {
			subtest {![wait_for_job $job_id "RUNNING"]} "Job should run $wait_reason"
		}

		lappend job_ids [submit_job -fail "--account=$acct -t1 -n1 -o none --wrap '$srun $bin_sleep 300'"]
		subtest {![wait_job_reason [lindex $job_ids end] "PENDING" $wait_reason]} "Job should have pending reason $wait_reason"

	} message] ; # Store the error message in $message

	# Perform local cleanup
	cancel_job $job_ids

	# Convert any errors into failures (after cleaning up)
	if {$exception_code == 1} { ; # errors only
		fail "Failure testing $wait_reason: $message"
	}
}
