#!/usr/bin/env expect
############################################################################
# Purpose: Test of sacct functionality for heterogeneous jobs.
#          sacct options j
############################################################################
# Copyright (C) SchedMD LLC.
# 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 task_num	2
set timeout	60

#
# Check accounting config and bail if not found.
#
if {[get_config_param "AccountingStorageType"] ne "accounting_storage/slurmdbd"} {
	skip "This test can't be run without a usable AccountStorageType"
}

if {[get_config_param "SchedulerType"] ne "sched/backfill"} {
	skip "This test requires SchedulerType = sched/backfill"
}

set nb_nodes [get_partition_param [default_partition] "TotalNodes"]
if {$nb_nodes < 3} {
	skip "Need 3 or more nodes in default partition"
}

proc cleanup {} {
	global het_job_id scancel

	if {$het_job_id > 0} {
		exec $scancel $het_job_id
	}
}

set het_job_id 0
set matches 0
set index 0
set sid 0
set timeout $max_job_delay
spawn $salloc -t1 -N1 : -N1 : -N1 $bin_bash
expect {
	-re "job ($number) has been allocated resources" {
		set het_job_id $expect_out(1,string)
		reset_bash_prompt
		exp_continue
	}
	-re "$test_prompt" {
		#log_debug "Job initiated"
	}
	timeout {
		fail "salloc: allocation not granted in $timeout seconds"
	}
	eof {
		wait
	}
}
if {$het_job_id == 0} {
	fail "salloc failure"
}

expect *

log_info "Test Sending Sacct To Various Components"

# Wait for accounting records to reach slurmdbd
sleep 5
set timeout 3
set matches 0
set expected_matches 3
set has_prolog_flags 0

# If PrologFlags=contain is in slurm.conf, then an "extern" step will be
# launched on each node, so we need to check for 6 matches instead of 3.
spawn $scontrol show config
expect {
	-re "PrologFlags\\s*=\\s*\[A-z/,\]*Contain" {
		set expected_matches 6
		set has_prolog_flags 1
	}
	timeout {
		fail "scontrol show config not responding"
	}
	eof {
		wait
	}
}

# Now test sacct
spawn $sacct -j $het_job_id
expect {
	-re "$het_job_id\\+\[0-2\]" {
		incr matches
		exp_continue
	}
	timeout {
		fail "sacct not responding"
	}
	eof {
		wait
	}
}
if {$matches != $expected_matches} {
	fail "sacct failure ($matches != $expected_matches)"
}

set expected_matches 1
if {$has_prolog_flags} {
	set expected_matches 2
}

for {set inx 0} {$inx < 3} {incr inx} {
	set bad_matches 0
	set matches 0
	spawn $sacct -j $het_job_id+$inx
	expect {
		-re "$het_job_id\\+($number)" {
			if {$expect_out(1,string) == $inx} {
				incr matches
			} else {
				incr bad_matches
			}
			exp_continue
		}
		timeout {
			fail "sacct not responding"
		}
		eof {
			wait
		}
	}
	if {$matches != $expected_matches || $bad_matches != 0} {
		fail "sacct failure ($matches != 1 || $bad_matches != 0)"
	}
}
