#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test of job account(--account option).
############################################################################
# Copyright (C) 2004-2007 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 job_acct    "TEST_ACCT"
set job_acct_lc "test_acct"

proc cleanup {} {
	global job_id1 job_id2

	cancel_job [list $job_id1 $job_id2]
}

if [param_contains [get_config_param "AccountingStorageEnforce"] "associations"] {
	skip "This test will not work when associations are enforced"
}
if {[get_config_param "AccountingStorageType"] eq "accounting_storage/slurmdbd"} {
	skip "This test will not work when invalid account names are subject to change"
}

global env
set env(SALLOC_ACCOUNT) $job_acct

#
# Build input script file
#
make_bash_script $file_in "$bin_sleep 10"

#
# Spawn a srun batch job that just sleeps for a while
#
set timeout $max_job_delay
set job_id1 [submit_job -fail "--output=/dev/null --error=/dev/null --account=$job_acct -t1 $file_in"]

#
# Submit a second job that gets account from SALLOC_ACCOUNT environment variable
#
set match_acct  0
spawn $salloc --dependency=afterany:$job_id1 $srun $scontrol show job $job_id1
expect {
	-re "Granted job allocation ($number)" {
		set job_id2 $expect_out(1,string)
		exp_continue
	}
	-re "Account=$job_acct_lc" {
		set match_acct 1
		exp_continue
	}
	timeout {
		fail "salloc not responding"
	}
	eof {
		wait
	}
}
subtest {$match_acct != 0} "Confirm via the salloc output that the job gets the account from the SALLOC_ACCOUNT environment variable"

#
# Confirm second job's as account name
#
set match_acct 0
spawn $scontrol show job $job_id2
expect {
	-re "Account=$job_acct_lc" {
		set match_acct 1
		exp_continue
	}
	timeout {
		fail "scontrol not responding"
	}
	eof {
		wait
	}
}
subtest {$match_acct != 0} "Confirm via scontrol show job that the job gets the account from the SALLOC_ACCOUNT environment variable"
