#!/usr/bin/env expect
############################################################################
# Purpose: Stress test of stdout with stdin closed
#
# Note:    This script generates and then deletes files in the working directory
#          named test9.2.output
############################################################################
# Copyright (C) 2002-2007 The Regents of the University of California.
# Copyright (C) 2008-2010 Lawrence Livermore National Security.
# 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_out     "$test_dir/output"
set job_name     $test_name

set cycle_count [get_cycle_count]
set task_cnt    $max_stress_tasks
set node_cnt	1-4
set other_opts   "-O"

# Execute an srun job to print hostname to output_file with task_cnt tasks per node,
# wait for completion
# Returns 0 on successful completion, returns 1 otherwise
proc run_hostname_job { output_file } {
	global bin_printenv bin_rm job_name number srun node_cnt other_opts
	global task_cnt timeout
	exec $bin_rm -f $output_file

	spawn $srun --job-name=$job_name --input=/dev/null --output=$output_file --error=/dev/null -n$task_cnt -N$node_cnt $other_opts -t1 $bin_printenv SLURMD_NODENAME
	expect {
		-re "Unable to contact" {
			fail "Slurm appears to be down"
		}
		timeout {
			fail "srun not responding"
		}
		eof {
			wait
		}
	}

	wait_for_file -fail $output_file
}

#
# Run cycle_count jobs to run "hostname" and check output file size
#
set success_cnt 0
set timeout $max_job_delay
for {set inx 0} {$inx < $cycle_count} {incr inx} {
	run_hostname_job $file_out
	set stdout_lines [get_line_cnt $file_out]
	if {$stdout_lines != $task_cnt} {
		exec $bin_sleep 1
		set stdout_lines [get_line_cnt $file_out]
	}
	if {$stdout_lines != $task_cnt} {
		if {$stdout_lines == 0} {
			fail "stdout is empty. Is current working directory writable from compute nodes?"
		} else {
			fail "stdout is incomplete"
		}
	} else {
		incr success_cnt
	}
}
