#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Verify environment variables controlling sbatch are processed:
#          SBATCH_ACCOUNT, SBATCH_DEBUG and SBATCH_TIMELIMIT
############################################################################
# Copyright (C) 2002-2006 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_id           0
set timeout          $max_job_delay
set account          "dummy_acct"

proc cleanup {} {
	global job_id

	cancel_job $job_id
}

if [param_contains [get_config_param "AccountingStorageEnforce"] "associations"] {
	log_warn "Using user's default account instead of $account since associations are enforced"
	set account [get_default_acct 0]
}

#
# Set target environment variables
#
global env
set env(SBATCH_ACCOUNT)      $account
set env(SBATCH_DEBUG)        4
set env(SBATCH_TIMELIMIT)    3

#
# Build input script file
#
make_bash_script $file_in "$bin_id"

#
# Spawn a job via sbatch using these environment variables
#
set matches 0
spawn $sbatch -N1 --output=none $file_in
expect {
	-re "account *: $account" {
		incr matches
		exp_continue
	}
	-re "time *: 00:03:00" {
		incr matches
		exp_continue
	}
	-re "verbose *: 4" {
		incr matches
		exp_continue
	}
	-re "Submitted batch job ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		fail "sbatch not responding"
	}
	eof {
		wait
	}
}

if {$job_id == 0} {
	fail "Did not get job_id"
}
if {$matches != 3} {
	fail "Processed $matches of 3 environment variables"
}
