#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test of pack/nopack task distribution.
############################################################################
# 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

# find out if we have enough nodes to test functionality
set node_count [get_partition_param [default_partition] "TotalNodes"]
if { $node_count < 2 } {
	skip "Insufficient nodes in default partition ($node_count < 2)"
}

#
# Test CPU count for sufficient number (test requires 3+ CPUs per node
#
set timeout $max_job_delay
set min_cpu_cnt 4
spawn $srun -O -N2 -n4 --exclusive -l -t1 $bin_printenv SLURM_CPUS_ON_NODE
expect {
	-re "($number): ($number)" {
		if {$expect_out(2,string) < $min_cpu_cnt} {
			set min_cpu_cnt $expect_out(2,string)
		}
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}
if {$min_cpu_cnt < 3} {
	skip "Too few CPUs per node to test srun task distribution"
}

#
# Submit a two node job with "pack" distribution
#
set expected_layout [list 0 0 0 1]
set tested_layout [list -1 -1 -1 -1]
spawn $srun -O -N2 -n4 --exclusive -l --distribution=pack -t1 $bin_printenv SLURM_NODEID
expect {
	-re "srun: error" {
		skip "Can't test srun task distribution"
	}
	-re "($number): ($number)" {
		set index $expect_out(1,string)
		set value $expect_out(2,string)
		lset tested_layout $index $value
		exp_continue
	}
	-re "($number)\\.($number):($re_word_str)" {
		set index $expect_out(1,string)
		set index2 $expect_out(2,string)
		if { $index == 0 } {
			set value 0
		} else {
			set value 1
		}
		lset tested_layout $index $value
		lset tested_layout $index2 $value
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}

#
# Verify "pack" distribution of tasks
#
log_debug "Optimal task layout was: $expected_layout"
log_debug "Actual task layout was : $tested_layout"
subtest {$tested_layout eq $expected_layout} "Tasks distributed in pack fashion" "$tested_layout != $expected_layout"

#
# Submit a two node job with "nopack" distribution
#
set expected_layout [list 0 0 1 1]
set tested_layout [list -1 -1 -1 -1]
set timeout $max_job_delay
spawn $srun -O -N2 -n4 --exclusive -l --distribution=nopack -t1 $bin_printenv SLURM_NODEID
expect {
	-re "More processors requested than permitted" {
		skip "Can't test srun task distribution"
	}
	-re "Node count specification invalid" {
		skip "Can't test srun task distribution"
	}
	-re "($number): ($number)" {
		set index $expect_out(1,string)
		set value $expect_out(2,string)
		lset tested_layout $index $value
		exp_continue
	}
	-re "($number)\\.($number):($re_word_str)" {
		set index $expect_out(1,string)
		set index2 $expect_out(2,string)
		if { $index == 0 } {
			set value 0
		} else {
			set value 1
		}
		lset tested_layout $index $value
		lset tested_layout $index2 $value
		exp_continue
	}
	timeout {
		fail "srun not responding"
	}
	eof {
		wait
	}
}

#
# Verify "nopack" distribution of tasks
#
log_debug "Optimal task layout was: $expected_layout"
log_debug "Actual task layout was : $tested_layout"
subtest {$tested_layout eq $expected_layout} "Tasks distributed in nopack fashion" "$tested_layout != $expected_layout"
