#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test sbcast file overwrite (--force option).
############################################################################
# Copyright (C) 2006 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 file_out    "$test_dir/output"
set file_err    "$test_dir/error"
set job_id      0

if {[get_config_param "SlurmdUser"] ne "root(0)"} {
	skip "This test is incompatible with SlurmdUser != root"
}

proc cleanup {} {
	global job_id

	cancel_job $job_id
}

#
# Build input script file that broadcasts a file
# NOTE: we broadcast the file "sbcast", just for convenience
#
set pid         [pid]
set file1       "/tmp/$test_name.$pid.1"
set file2       "/tmp/$test_name.$pid.2"
make_bash_script $file_in "
  echo '+++ Test 1 +++'
  $srun rm -f $file1
  $srun $bin_cp $sbatch $file1
  $sbcast $sbcast $file1
  $srun $bin_cmp $sbcast $file1
  $srun $bin_rm -f $file1

  echo '+++ Test 2 +++'
  $srun rm -f $file2
  $srun $bin_cp $sbatch $file2
  $sbcast $sbcast --force $file2
  $srun $bin_cmp $sbcast $file2
  $srun $bin_rm -f $file2
"

#
# Spawn an sbatch job that uses stdout/err and confirm their contents
# With multiple_slurmd we can face race conditions, so we limit the test
# to a single node, and we mark the test as partially skipped.
#
set timeout $max_job_delay
if {[get_config_param "MULTIPLE_SLURMD"] eq "yes"} {
	subskip "This test is partially compatible with multiple slurmd systems"
	set job_id [submit_job -fail "-N1 --output=$file_out --error=$file_err -t1 $file_in"]
} else {
	set job_id [submit_job -fail "-N1-4 --output=$file_out --error=$file_err -t1 $file_in"]
}

#
# Wait for job to complete and check output file
#
wait_for_job -fail $job_id "DONE"
wait_for_file -fail $file_out

set output [run_command_output -fail "$bin_cat $file_out"]
subtest {[regexp "$file1 differ" $output]} "Verify that sbcast doesn't overwrite file without --force option"
subtest {![regexp "$file2 differ" $output]} "Verify that sbcast overwrites file with --force option"
