#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Validate scontrol update command for jobs.
############################################################################
# Copyright (C) 2002-2007 The Regents of the University of California.
# Copyright (C) 2008 Lawrence Livermore National Security.
# 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 authorized    1
set script_name   "job_script"
set file_in       "$test_dir/$script_name"
set job_id        0
set new_prio      1
set read_priority -1
set my_uid        [get_my_uid]

proc cleanup {} {
	global job_id

	cancel_job $job_id
}

proc get_wrong_uid {} {
	global bin_id re_word_str number my_uid

	set wrong_uid 1
	set slurm_uid 1
	regexp "(${re_word_str})\\(($number)\\)" [get_config_param "SlurmUser"] - slurm_user slurm_uid
	set max_uid [expr min($my_uid, $slurm_uid)]
	while {$wrong_uid < $max_uid} {
		if {![run_command_status -nolog -none "$bin_id $wrong_uid"]} {
			return $wrong_uid
		}
		incr wrong_uid
	}

	fail "Unable to find an usable wrong UID"
}

#
# Build input script file
#
make_bash_script $file_in "$srun $bin_sleep 60"

#
# Submit a job so we have something to work with
#
set job_id [submit_job -fail "--output=/dev/null --error=/dev/null -t1 --hold $file_in"]

#
# Record that job's state
#
subtest {[get_job_param $job_id "Priority"] == 0} "Verify job's original hold priority"

#
# Change that job's priority
#
set output [run_command_output "$scontrol release $job_id"]
if {[regexp "slurm_update error: Access.*denied" $output]} {
	skip "User not authorized to modify jobs"
}

#
# Test modification of job with bad JobName/UserID specification
#
log_info "Test 1"
set wrong_uid [get_wrong_uid]
set output [run_command_output -xfail "$scontrol update JobName=$script_name UserID=$wrong_uid Priority=$new_prio"]
subtest {[regexp "No jobs with" $output]} "Verify bad JobName/UserID error"

#
# Change that job's priority
#
log_info "Test 2"
set no_jobs 0
set output [run_command_output -none "$scontrol update JobName=$script_name UserID=$my_uid Priority=$new_prio"]
subtest {![regexp "No jobs with" $output]} "Verify absence of bad JobName/UserID error"

#
# Validate that job's new priority
#
subtest {[get_job_param $job_id "Priority"] != 0} "Validate the job's new priority"
