#!/usr/bin/env expect
############################################################################
# Purpose: Run "srun cat" and read srun's stdout SLOWLY, creating
#          stdout back pressure in srun.  (srun used to lose data on stdout
#          in this situation.)
############################################################################
# Copyright (C) 2002-2007 The Regents of the University of California.
# Copyright (C) 2008 Lawrence Livermore National Security.
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
# Written by Chris Morrone <morrone2@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 cycle_count  3
set target_lines 1000
set file_in      "$test_dir/input"
set file_out     "$test_dir/output"
set file_err     "$test_dir/error"

# Execute an srun job to cat input_file.  Read srun's stdout SLOWLY (1k/sec)
# to create back pressure which used to reveal a stdout data-loss bug.
# Write the srun's stdout to a file so that the caller can compare the sizes
# of input_file and output_file.
proc run_cat_backpressure { input_file output_file } {
	global bin_cat srun timeout file_err

	log_debug "Running run_cat_backpressure (This is slow)"
	file delete $file_err $output_file
	set iter 0

	set output [open $output_file w]
	set srun_output [open "| $srun -e $file_err -N1 -t1 $bin_cat $input_file" r]
	while {![eof $srun_output]} {
		puts -nonewline $output [read $srun_output 1]
		incr iter
		if {[expr $iter % 1000] == 0} {
			puts -nonewline "."
			sleep 1
		}
	}

	puts ""
	flush $output
	close $output
}

#
# Create a sizable text file
#
run_command -fail "yes line | head -$target_lines > $file_in"
set stdin_lines [get_line_cnt $file_in]

#
# Run cycle_count jobs to copy job input to job output and compare sizes
#
set timeout $max_job_delay
for {set inx 0} {$inx < $cycle_count} {incr inx} {
	run_cat_backpressure $file_in $file_out
	set stdout_lines [get_line_cnt $file_out]
	if {$stdout_lines != $stdin_lines} {
		if {$stdout_lines == 0} {
			set message "stdout is empty. Is current working directory writable from compute nodes?"
		} else {
			set message "stdout is incomplete ($stdout_lines != $stdin_lines)"
		}
		fail $message
	}
}
