#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test of batch job and job name options (--batch and --job-name
#          options).
#
# Note:    This script generates and then deletes files in the working directory
#          named test1.11.input, test1.11.output, and test1.11.error
############################################################################
# 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 name_read            ""
set complete_flag        0
set name_flag            0
set login_grp_info       ""
set job_grp_info         ""
set job_id               0
set got_job_grps         0
set got_login_grps       0

#
# Spawn a srun job with a really long name and confirm it is accepted or truncated
#
set job_name      "AAAAABBBBBCCCCCDDDDDEEEEEFFFFFGGGGGHHHHHIIIIIJJJJJKKKKKLLLLLMMMMM"
set timeout        $max_job_delay
spawn $srun --verbose --job-name=$job_name -t1 $bin_id
expect {
	# needed for cray systems
	-re "Granted job allocation ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	-re "jobid ($number):" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}

if {$job_id == 0} {
	fail "Job submit failure"
}

#
# Get recorded job name
#
spawn $scontrol show job $job_id
expect {
	-re "Name=($re_word_str) " {
		set name_read $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "scontrol not responding"
	}
	eof {
		wait
	}
}

#
# Compare job names
#
set size1  [ string length $job_name ]
set size2  [ string length $name_read ]
# Convert to zero origin
incr size2  -1
if {$size2 == 0} {
	fail "Job name read failure"
}
set short1 [ string range $job_name  0 $size2 ]
set short2 [ string range $name_read 0 $size2 ]
subtest {$short1 eq $short2 } "Requested and actual job names should match" "Strings are:$short1:$short2:$size2"
