#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Test for seff
############################################################################
# Copyright (C) SchedMD LLC.
#
# 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

if {[file executable $seff] == 0} {
	skip "seff was not found"
}

set out [run_command_output -fail -xfail "$seff -h"]
subtest {[regexp "Usage:" $out]} "seff -h should return Usage:"

set job_id [submit_job -fail "-H --wrap=\"sleep 10\" -o /dev/null -e /dev/null"]
wait_for_command_match "$sacct -n -j $job_id" "PENDING"
set out [run_command_output -fail "$seff $job_id" ]
subtest {[regexp "State: PENDING" $out]} "Job should be returned as in PENDING state by seff"
subtest {[regexp "Cores: 1" $out]} "Job should be reported as 1 core"
subtest {[regexp "Efficiency not available for jobs in the PENDING state." $out]} "Job should be reported as efficiency not available for PENDING state"

run_command -fail "$scontrol release $job_id"
wait_for_command_match "$sacct -X -n -j $job_id" "RUNNING"

set out [run_command_output -fail "$seff $job_id"]
subtest {[regexp "State: RUNNING" $out]} "Job should be reported as RUNNING by seff"
subtest {[regexp "WARNING: Efficiency statistics can only be obtained after the job has ended as seff tool is based on the accounting database data." $out]} "seff output should contain warning about statistics for RUNNING job"

wait_for_command_match "$sacct -X -n -j $job_id" "COMPLETED"
set out [run_command_output -fail "$seff $job_id"]
subtest {[regexp "State: COMPLETED" $out]} "Job should be reported as COMPLETED by seff"
subtest {[regexp "Cores: \(\\d+\)" $out {} cores] || \
         [regexp "Cores per node: \(\\d+\)" $out {} cores]} "seff should report the number of cores (per node) based on the configuration"

regexp "Job Wall-clock time: 00:00:\(\\d+\)" $out {} wall_clock_time
subtest {[tolerance 10 $wall_clock_time +7]} "Wall time should be close to 10s" "${wall_clock_time}s not in tolerance range of 10s"
set cpu_s [expr $cores * $wall_clock_time]
set cpu_d [expr int(floor($cpu_s / (24*60))) ]
set cpu_s [expr $cpu_s - ($cpu_d*24*60) ]
set cpu_h [expr int(floor($cpu_s / 60)) ]
set cpu_s [expr $cpu_s - ($cpu_h*60) ]
set cpu_time_str [format "%02d:%02d:%02d" $cpu_d $cpu_h $cpu_s]
subtest {[regexp -line "CPU Efficiency: 0.00% of $cpu_time_str core-walltime" $out]} "Job efficiency should be 0.00% of core-walltime" "$cpu_time_str|$out"
