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

# Test GrpSubmit
proc inc21_30_4 {} {

	global salloc sbatch srun acct bin_rm bin_sleep jobmatch
	global job_id1 job_id2 job_id3 number exit_code grsub_num

	log_info "Starting GrpSubmit limit test (Within: inc21.30.4)"
	set check_num $grsub_num
	set file_in "in21.30.4_script"
	set tmp_job_id 0

	make_bash_script $file_in "sleep 5"

	set jobmatch 0
	for {set inx 0} {$inx <= $check_num} {incr inx} {
		spawn $salloc --account=$acct -t1 -n1 $srun $bin_sleep 60
		expect {
			-re "Granted job allocation ($number)" {
				set job_id($inx) $expect_out(1,string)
				if {$inx < $check_num} {
					log_debug "Job $inx $job_id($inx) was submitted. (Within: inc21.30.4)"
					incr jobmatch
				} else {
					log_error "Job $inx $job_id($inx) wasn't suppose to work but it did, limit was $check_num? (Within: inc21.30.4)"
					set exit_code 1
				}
			}
			-re "error" {
				if {$inx >= $check_num} {
					log_debug "Job $inx didn't get submitted. This is expected (Within: inc21.30.4)"
					incr jobmatch
				} else {
					log_error "Job $inx $job_id($inx) was suppose to work but it didn't, limit was $check_num? (Within: inc21.30.4)"
					set exit_code 1
				}
			}
			timeout {
				log_error "salloc is not responding. (Within: inc21.30.4)"
				set exit_code 1
			}
			eof {
				wait
			}
		}
	}

	set target_jobs [expr $check_num + 1]
	if {$jobmatch != $target_jobs} {
		log_error "Not all jobs were not submitted ($jobmatch != $target_jobs). (Within: inc21.30.4)"
		set exit_code 1
	}

	for {set inx 0} {$inx <= $check_num} {incr inx} {
		if [info exists job_id($inx)] {
			# Cancels the jobs
			cancel_job $job_id($inx)
		}
	}

	set upper_lim [expr $check_num - 1]
	# Test limit with job array
	spawn $sbatch --account=$acct -t1 -a0-$upper_lim -o/dev/null $file_in
	expect {
		-re "Submitted batch job ($number)" {
			set tmp_job_id $expect_out(1,string)
			exp_continue
		}
		timeout {
			log_error "sbatch is not responding"
			set exit_code 1
		}
		eof {
			wait
		}
	}
	if {$tmp_job_id == 0} {
		log_error "Job was not submitted when it should have"
		set exit_code 1
	}

	# Add one more job, and check for error message
	set match 0
	spawn $sbatch --account=$acct -t1 -a0-$upper_lim -o/dev/null $file_in
	expect {
		-re "Job violates accounting/QOS policy" {
			set match 1
			exp_continue
		}
		timeout {
			log_error "sbatch is not responding"
			set exit_code 1
		}
		eof {
			wait
		}
	}
	if {$match == 0} {
		log_error "Job should not have been submitted"
		set exit_code 1
	}

	exec $bin_rm -f $file_in
	cancel_job $tmp_job_id
}
