#!/usr/bin/expect
############################################################################
# Purpose: Test of SLURM functionality
#          Confirm that a job executes with the proper node count
#          (--nodes option).
#
# Output:  "TEST: #.#" followed by "SUCCESS" if test was successful, OR
#          "WARNING: ..." with an explanation of why the test can't be made, OR
#          "FAILURE: ..." otherwise with an explanation of the failure, OR
#          anything else indicates a failure mode that must be investigated.
############################################################################
# Copyright (C) 2002-2006 The Regents of the University of California.
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
# Written by Morris Jette <jette1@llnl.gov>
# UCRL-CODE-217948.
# 
# This file is part of SLURM, a resource management program.
# For details, see <http://www.llnl.gov/linux/slurm/>.
#  
# 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.,
# 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
############################################################################
source ./globals

set test_id     "18.28"
set exit_code   0

print_header $test_id

#
# Submit jobs of various node counts and validate task count
#
for {set inx 1} {$inx <= 4} {set inx [expr $inx * 2]} {
	set job_id      0
	set host_0      ""
	set host_1      ""
	set host_2      ""
	set host_3      ""
	set no_fit      0
	set task_cnt    0
	set timeout $max_job_delay
	spawn $salloc -N1-4 -t1 $slaunch -N$inx -l $bin_printenv SLURM_NODEID
	expect {
		-re "Granted job allocation ($number)" {
			set job_id $expect_out(1,string)
			exp_continue
		}
		-re " Requested node configuration is not available" {
			set no_fit 1
			exp_continue
		}
		-re "($number): ($number)" {
			incr task_cnt
			if {$expect_out(1,string) == 0} {
				set host_0 $expect_out(2,string)
			}
			if {$expect_out(1,string) == 1} {
				set host_1 $expect_out(2,string)
			}
			if {$expect_out(1,string) == 2} {
				set host_2 $expect_out(2,string)
			}
			if {$expect_out(1,string) == 3} {
				set host_3 $expect_out(2,string)
			}
			exp_continue
		}
		timeout {
			send_user "\nFAILURE: salloc not responding\n"
			if {$job_id == 0} {
				kill_salloc
			} else {
				cancel_job $job_id
			}
			exit 1
		}
		eof {
			wait
		}
	}
	if { $no_fit == 0 && $task_cnt != $inx } {
		send_user "\nFAILURE: slaunch failed to launch specified tasks count\n"
		set exit_code   1
	}
	if {$no_fit == 0 && $task_cnt == 2} {
		if {[string compare $host_0 $host_1] == 0} {
			send_user "\nFAILURE: Re-used a node in the allocation\n"
			set exit_code   1
		}
	}
	if {$no_fit == 0 && $task_cnt == 4} {
		set dup_host 0
		if {[string compare $host_0 $host_1] == 0} {
			 set dup_host 1
		}
		if {[string compare $host_0 $host_2] == 0} {
			set dup_host 1
		}
		if {[string compare $host_0 $host_3] == 0} {
			set dup_host 1
		}
		if {[string compare $host_1 $host_2] == 0} {
			set dup_host 1
		}
		if {[string compare $host_1 $host_3] == 0} {
			set dup_host 1
		}
		if {[string compare $host_2 $host_3] == 0} {
			set dup_host 1
		}
		if {$dup_host == 1} {
			send_user "\nFAILURE: Re-used a node in the allocation\n"
			set exit_code   1
		}
	}
}

if {$exit_code == 0} {
	send_user "\nSUCCESS\n"
}
exit $exit_code
