#!/usr/bin/env expect
############################################################################
# Purpose: Stress test of stdin broadcast
#
# Note:    This script generates and then deletes files in the working directory
#          named test9.1.input and test9.1.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_in     "$test_dir/input"
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-6

set other_opts  "-O"

# Execute an srun job to cat input_file to output_file, wait for completion
# Returns 0 on successful completion, returns 1 otherwise
proc run_cat_job { input_file output_file } {
	global bin_cat bin_rm job_name srun node_cnt other_opts task_cnt timeout
	exec $bin_rm -f $output_file

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

	wait_for_file -fail $output_file
}

#
# Create a sizable text file
#
exec $bin_cat /etc/hosts   >$file_in
exec $bin_cat /etc/passwd >>$file_in
set stdin_lines [get_line_cnt $file_in]
set stdout_target [expr $stdin_lines * $task_cnt]

#
# Run cycle_count jobs to copy job input to job output and compare sizes
#
set success_cnt 0
set timeout $max_job_delay
for {set inx 0} {$inx < $cycle_count} {incr inx} {
	run_cat_job $file_in $file_out
	set stdout_lines [get_line_cnt $file_out]
	if {$stdout_lines != $stdout_target} {
		exec $bin_sleep 1
		set stdout_lines [get_line_cnt $file_out]
	}
	if {$stdout_lines != $stdout_target} {
		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
	}
}
