#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test of TotalView operation with sattach
############################################################################
# Copyright (C) 2004-2007 The Regents of the University of California.
# Copyright (C) 2008-2011 Lawrence Livermore National Security.
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
# Written by Morris Jette <jette1@llnl.gov> and Dong Ang <dahn@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.
#
# In addition, as a special exception, the copyright holders give permission
# to link the code of portions of this program with the OpenSSL library under
# certain conditions as described in each individual source file, and
# distribute linked combinations including the two. You must obey the GNU
# General Public License in all respects for all of the code used other than
# OpenSSL. If you modify file(s) with this exception, you may extend this
# exception to your version of the file(s), but you are not obligated to do
# so. If you do not wish to do so, delete this exception statement from your
# version.  If you delete this exception statement from all source files in
# the program, then also delete it here.
#
# 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 job_id        0
set test_prog     "$test_name.prog"
set timeout       $max_job_delay

# Note this appears as a single argv value to totalviewcli
set no_bulk       "dset TV::bulk_launch_enabled false"

#
# Test for existence of mpi compiler and totalview
#
if {[info exists mpicc] == 0} {
	skip "mpicc not defined, can't perform mpi testing"
}
if {[file executable $mpicc] == 0} {
	skip "$mpicc does not exist"
}
if {[info exists totalviewcli] == 0} {
	skip "totalviewcli not defined, can't perform mpi testing"
}
if {[file executable $totalviewcli] == 0} {
	skip "$totalviewcli does not exist"
}

proc cleanup {} {
	global job_id bin_rm test_prog

	cancel_job $job_id
	exec $bin_rm -f $test_prog ${test_prog}.o ${test_prog}.TVD.v3breakpoints
}

#
# Put desired Slurm install directory at head of search path for bulk launch
# command to work (runs "srun" without path)
#
set env(PATH) "$slurm_dir/bin:$env(PATH)"
log_debug "$env(PATH)"

#
# Delete left-over program and rebuild it
#
exec $bin_rm -f $test_prog ${test_prog}.o ${test_prog}.TVD.v3breakpoints
exec $mpicc -o $test_prog ${test_prog}.c

#
# Create a slurm job step
#
spawn $salloc -N1-2 -t1 $srun --input=none -n4 --overcommit ./$test_prog
expect {
	-re "Granted job allocation ($number)" {
		set job_id $expect_out(1,string)
	}
	timeout {
		fail "salloc not responding"
	}
	eof {
		wait
	}
}
if {$job_id == 0} {
	fail "salloc failed to allocate a job"
}

#
# Now run totalviewcli (command line interface to TotalView) and attach to
# the job step using sattach
#
set matches 0
set no_capability 0
set timeout $max_job_delay
log_info "======================================================================"
log_info "=======================  Run without bulk transfer ==================="
log_info "======================================================================"
spawn $totalviewcli -verbosity info -e $no_bulk $srun -a --input=none -n4 -N1-2 -O -t1 $test_prog
expect {
	-re "All licenses are currently in use" {
		log_warn "We can not run this test now"
		incr no_capability
		exp_continue
	}
	-re "d1.<>" {
		if {$matches == 0} {
			incr matches
			send "G\r"
		}
		if {$no_capability != 0} {
			send "quit\r"
		}
		exp_continue
	}
	-re "cannot open shared object" {
		log_warn "Set LD_LIBRARY_PATH environment variable to include this object's directory"
		exp_continue
	}
	-re "Do you want to stop the job now?.*:" {
		incr matches
		send "yes\r"
		exp_continue
	}
	-re "Attached to parallel task ($number)" {
		incr matches
		exp_continue
	}
	-re "Loaded MPI support.*" {
		exec sleep 2
		send "G\r"
		exp_continue
	}
	-re "I just received msg from Rank" {
		incr matches
		exp_continue
	}
	-re "Process 1 has exited.*" {
		incr matches
		exec sleep 2
		send "quit\r"
		exp_continue
	}
	-re "Do you really wish to exit TotalView?" {
		incr matches
		send "yes\r"
		exp_continue
	}
	-re "Could not open breakpoint file" {
		log_debug "NOTE: Breakpoint file error is expected due to known Totalview bug"
		exp_continue
	}
	timeout {
		fail "totalviewcli not responding"
	}
	eof {
		wait
	}
}
if {$no_capability != 0} {
	skip "Unable to run test with present configuration"
}
if {$matches != 12} {
	fail "totalviewcli operation matches $matches of 12. Remove your ~/.totalview directory and try again"
}
