#!/usr/bin/env expect
############################################################################
# Purpose: Stress test of per-task output files
#
# Note:    This script generates and then deletes files in the working directory
#          named test9.6.input and test9.6.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 node_cnt	1-4
set task_cnt    $max_stress_tasks
set other_opts   "-O"

# Execute an srun job to cat input_file to output_file with task_cnt tasks
# per node, 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 number srun node_cnt other_opts task_cnt timeout
	exec $bin_rm -f $output_file

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

	return [wait_for_file $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
	}
}
