#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Check squeue formatting options (--noheader, --format and --step
#          options and SQUEUE_FORMAT environment variable).
############################################################################
# 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

set file_in      "$test_dir/input"
set job_id1      0
set job_id2      0
set step_id      0

proc cleanup {} {
	global job_id1 job_id2

	cancel_job [list $job_id1 $job_id2]
}

#
# Delete left-over input script
# Build input script file
#
make_bash_script $file_in "$srun $bin_sleep 90"

#
# Submit a couple of job so we have something to look at
#
set job_id1 [submit_job -fail "--output=/dev/null --error=/dev/null -t1 $file_in"]
set job_id2 [submit_job -fail "--output=/dev/null --error=/dev/null --hold -t1 $file_in"]

wait_for_job -fail $job_id1 RUNNING

#
# Check the squeue noheader output
#

set have_header 0
spawn $squeue --noheader
expect {
	-re "PARTITION" {
		set have_header 1
		exp_continue
	}
	timeout {
		cancel_job $job_id2
		fail "squeue not responding"
	}
	eof {
		wait
	}
}

subtest {$have_header <= 0} "Check the squeue noheader output"

#
# Check the squeue format output via command line option
#

# For some reason, quoting the format value breaks expect,
#  but this passes the entire format in a single argv entry
set format "--format=jid=%i uid=%U"
set have_job_ids 0
spawn $squeue $format
expect {
	-re "($eol)jid=($number) uid=($number)" {
		if {$expect_out(2,string) == $job_id1} {
			incr have_job_ids
		}
		if {$expect_out(2,string) == $job_id2} {
			incr have_job_ids
		}
		exp_continue
	}
	timeout {
		fail "squeue not responding"
	}
	eof {
		wait
	}
}

subtest {$have_job_ids == 2} "Check the squeue format output via command line option" "squeue found only $have_job_ids of 2 jobs"

#
# Check the squeue format output via SQUEUE_FORMAT environment
# variable
#

set env(SQUEUE_FORMAT) "JID=%i UID=%U"
set have_job_ids 0
spawn $squeue
expect {
	-re "($eol)JID=($number) UID=($number)" {
		if {$expect_out(2,string) == $job_id1} {
			incr have_job_ids
		}
		if {$expect_out(2,string) == $job_id2} {
			incr have_job_ids
		}
		exp_continue
	}
	timeout {
		fail "squeue not responding"
	}
	eof {
		wait
	}
}
unset env(SQUEUE_FORMAT)

subtest {$have_job_ids == 2} "Check the squeue format output via SQUEUE_FORMAT environment variable" "squeue found only $have_job_ids of 2 jobs"

#
# Wait for the job step to appear
#

if {[param_contains [get_config_param "SlurmctldParameters"] "enable_stepmgr"]} {
	subskip "squeue --steps doesn't work with stepmgr enabled jobs"
} else {
	spawn $squeue --iterate=5 --steps -j $job_id1
	set iteration  0
	set step_found 0
	expect {
		-re "($eol) *($job_id1\\.$step_id) " {
			set step_found 1
			set squeue_pid [exp_pid]
			exec $bin_kill -TERM $squeue_pid
			exp_continue
		}
		-re "PARTITION" {
			incr iteration
			if {$iteration >= 3} {
				set squeue_pid [exp_pid]
				exec $bin_kill -TERM $squeue_pid
			}
			exp_continue
		}
		timeout {
			fail "squeue not responding"
		}
		eof {
			wait
		}
	}
	subtest {$step_found != 0} "Wait for the job step to appear" "squeue step format error"
}
