#!/usr/bin/expect
############################################################################
# Purpose: Test of SLURM functionality
#          Verify that user environment variables are propagated to the job
#
# Output:  "TEST: #.#" followed by "SUCCESS" if test was successful, OR
#          "FAILURE: ..." otherwise with an explanation of the failure, OR
#          anything else indicates a failure mode that must be investigated.
############################################################################
# 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>
# UCRL-CODE-226842.
# 
# This file is part of SLURM, a resource management program.
# For details, see <http://www.llnl.gov/linux/slurm/>.
#  
# 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.,
# 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
############################################################################
source ./globals

set test_id          "17.14"
set test_env_name    "TEST_ENV_$test_id"
set test_env_val     123
set exit_code        0
set file_in         "test$test_id.input"
set file_out        "test$test_id.output"
set job_id           0
set matches          0

global env
set env($test_env_name) $test_env_val

print_header $test_id

#
# Delete left-over input script
# Build input script file
#
exec $bin_rm -f $file_in $file_out
make_bash_script $file_in "
  $bin_env
"

#
# Spawn a job via sbatch to print environment variables
#
set env($test_env_name) $test_env_val
spawn $sbatch -N1 -t1 --output=$file_out $file_in
expect {
	-re "Submitted batch job ($number)" {
		set job_id $expect_out(1,string)
		exp_continue
	}
	timeout {
		send_user "\nFAILURE: sbatch not responding\n"
		set exit_code 1
		exp_continue
	}
	eof {
		wait
	}
}
if { $job_id == 0 } {
	send_user "\nFAILURE: failed to submit job\n"
	exit 1
}

#
# Wait for job to complete
#
if {[wait_for_job $job_id "DONE"] != 0} {
	send_user "\nFAILURE: waiting for job to complete\n"
	cancel_job $job_id
	set exit_code 1
}

#
# Check for desired output
#
if {[wait_for_file $file_out] != 0} {
	send_user "\nFAILURE: Output file $file_out is missing\n"
	exit 1
}
spawn $bin_cat $file_out
expect {
	-re "$test_env_name=($number)" {
		if {$expect_out(1,string) == $test_env_val} {
			incr matches
		}
		exp_continue
	}
	eof {
		wait
	}
}

if {$matches != 1} {
	send_user "\nFAILURE: Environment variables not propagated\n"
	set exit_code 1
}

if {$exit_code == 0} {
	exec $bin_rm -f $file_in $file_out
	send_user "\nSUCCESS\n"
}
exit $exit_code
