#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm sreport functionality
#          sreport h, n, p, P, t, V options.
############################################################################
# Copyright (C) 2009 Lawrence Livermore National Security.
# Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
# Written by Joseph Donaghy <donaghy1@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

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"
}

################################################################
#
# Proc: sreport_opt
#
# Purpose:  Pass sreport options and test
#
# Returns: Number of matches.
#
# Input: Switch options not requiring arguments
#
################################################################

proc sreport_opt { soption } {
	global number sreport
	set debug       0
	set matches     0
	set not_support 0
	log_debug "$sreport -$soption "

	if { $soption == "-help"|| $soption == "-usage" || $soption == "h" } {

		spawn $sreport -$soption
		expect {
			-re "Slurm accounting storage is disabled" {
				set not_support 1
				exp_continue
			}
			-re "sreport...OPTION.....COMMAND" {
				if {$debug} {log_debug "Match1"}
				incr matches
				exp_continue
			}
			-re "Valid .OPTION. values are" {
				if {$debug} {log_debug "Match2"}
				incr matches
				exp_continue
			}
			-re "Valid .COMMAND. values are" {
				if {$debug} {log_debug "Match3"}
				incr matches
				exp_continue
			}
			timeout {
				fail "sreport not responding"
			}
			eof {
				wait
			}
		}

		if {$not_support == 1} {
			skip "Can not test without accounting enabled"
		}

		subtest {$matches == 3} "Verify sreport -$soption option"
	}

	if { $soption == "-noheader" || $soption == "n" } {

		spawn $sreport -$soption job sizes
		expect {
			-re "Slurm accounting storage is disabled" {
				set not_support 1
				exp_continue
			}
			-re "Cluster|Account|0-49 CPUs|50-249 CPUs|250-499 CPUs|500-999 CPUs|1000 CPUs|of cluster" {
				if {$debug} {log_debug "Match4"}
				incr matches
				exp_continue
			}
			timeout {
				fail "sreport not responding"
			}
			eof {
				wait
			}
		}

		if {$not_support == 1} {
			skip "Can not test without accounting enabled"
		}
		subtest {$matches == 0} "Verify sreport -$soption option"
	}

	if { $soption == "-parsable" || $soption == "p" } {

		spawn $sreport -$soption job sizes
		expect {
			-re "Slurm accounting storage is disabled" {
				set not_support 1
				exp_continue
			}
			-re "Cluster\\|Account\\|0-49 CPUs\\|50-249 CPUs\\|250-499 CPUs\\|" {
				if {$debug} {log_debug "Match5"}
				incr matches
				exp_continue
			}
			-re "500-999 CPUs\\|>= 1000 CPUs\\|Total Count\\|% of cluster\\|" {
				if {$debug} {log_debug "Match6"}
				incr matches
				exp_continue
			}
			timeout {
				fail "sreport not responding"
			}
			eof {
				wait
			}
		}

		if {$not_support != 0} {
			skip "Can not test without accounting enabled"
		}
		subtest {$matches == 2} "Verify sreport -$soption option"
	}

	if { $soption == "-parsable2" || $soption == "P" } {

		spawn $sreport -$soption job sizes
		expect {
			-re "Slurm accounting storage is disabled" {
				set not_support 1
				exp_continue
			}
			-re "Cluster\\|Account\\|0-49 CPUs\\|50-249 CPUs\\|250-499 CPUs\\|" {
				if {$debug} {log_debug "Match7"}
				incr matches
				exp_continue
			}
			-re "500-999 CPUs\\|>= 1000 CPUs\\|Total Count\\|% of cluster" {
				if {$debug} {log_debug "Match8"}
				incr matches
				exp_continue
			}
			timeout {
				fail "sreport not responding"
			}
			eof {
				wait
			}
		}

		if {$not_support == 1} {
			skip "Can not test without accounting enabled"
		}

		subtest {$matches == 2} "Verify sreport -$soption option"
	}

	if { $soption == "-version" || $soption == "V" } {

		spawn $sreport -$soption
		expect {
			-re "Slurm accounting storage is disabled" {
				set not_support 1
				exp_continue
			}
			-re "slurm $number.$number.$number" {
				if {$debug} {log_debug "Match9"}
				incr matches
				exp_continue
			}
			timeout {
				fail "sreport not responding"
			}
			eof {
				wait
			}
		}

		if {$not_support == 1} {
			skip "Can not test without accounting enabled"
		}

		subtest {$matches == 1} "Verify sreport -$soption option"
		return $matches
	}
}

################################################################

sreport_opt h
sreport_opt -help
sreport_opt -usage
sreport_opt n
sreport_opt -noheader
sreport_opt p
sreport_opt -parsable
sreport_opt P
sreport_opt -parsable2
sreport_opt V
sreport_opt -version
