#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Verify that user environment variables are propagated to the job.
############################################################################
# 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 file_in          "$test_dir/input"
set test_env_name    "TEST_ENV_$test_id"
set test_env_val     123
set matches          0

make_bash_script $file_in "env | grep TEST; exit 0"

#
# Spawn a job via srun to print environment variables
#
set timeout $max_job_delay
spawn $srun -N1 --export=$test_env_name=$test_env_val -t1 $file_in
expect {
	-re "$test_env_name=($number)" {
		if {$expect_out(1,string) == $test_env_val} {
			incr matches
		}
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$matches != 1} {
	fail "Environment variables not propagated ($matches != 1)"
}

#
# Spawn a job via srun to print environment variables
#
global env
set env($test_env_name) $test_env_val
set matches 0
spawn $srun -N1 -t1 $file_in
expect {
	-re "$test_env_name=($number)" {
		if {$expect_out(1,string) == $test_env_val} {
			incr matches
		}
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$matches != 1} {
	fail "Environment variables not propagated ($matches != 1)"
}

#
# Spawn a job via srun to print environment variables with --export=ALL
#
set matches 0
spawn $srun -N1 -t1 --export=ALL $file_in
expect {
	-re "$test_env_name=($number)" {
		if {$expect_out(1,string) == $test_env_val} {
			incr matches
		}
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$matches != 1} {
	fail "Environment variables not propagated ($matches != 1)"
}

#
# Spawn a job via srun to print environment variables with --export=NONE
#
set matches 0
spawn $srun -N1 -t1 --export=NONE $file_in
expect {
	-re "$test_env_name=($number)" {
		if {$expect_out(1,string) == $test_env_val} {
			incr matches
		}
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$matches != 0} {
	fail "Environment variables were propagated ($matches != 0)"
}
