#!/usr/bin/env expect
############################################################################
# Purpose: Test of Slurm functionality
#          Verify that an sbcast credential is properly validated.
############################################################################
# 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

set bcast_file  "/tmp/${test_name}_sbcast_"
append bcast_file [expr int(rand() * 1000 + 1000 )]
set job_id      0

if {![check_run_as_user $testsuite_user]} {
	skip "This test needs testsuite_user configured in globals.local"
}

proc cleanup {} {
	global job_id sacctmgr testsuite_user test_name

	cancel_job $job_id
	run_command -none "$sacctmgr -vi delete user name=$testsuite_user"
	run_command -none "$sacctmgr -vi delete account name=$test_name"
}

if { [get_config_param -dbd "AllowNoDefAcct"] eq "yes" } {
	set def_acct " defaultaccount=$test_name"
} else {
	set def_acct ""
}

# Setup the test user
run_command -fail "$sacctmgr -vi add account name=$test_name"
run_command -fail "$sacctmgr -vi add user name=$testsuite_user account=$test_name$def_acct"
run_command -fail "$sacctmgr -vi update user $testsuite_user set adminlevel=None"

#
# Test that testsuite_user can sbcast to own jobs
#
log_info "Test that a user can sbcast to its own jobs"

# Spawn an salloc job and obtain the job id
set salloc_output [run_command_output -fail -user $testsuite_user "$salloc -v -N1 -t2 --no-shell"]
if {![regexp {Granted job allocation (\d+)} $salloc_output - job_id]} {
	fail "Allocation not granted ($output)"
}

# Clear out the broadcast file
run_command -fail -user $testsuite_user "$srun --jobid $job_id $bin_rm -f $bcast_file"

# Attempt to broadcast the file
set sbcast_output [run_command_output -user $testsuite_user -subtest "$sbcast --jobid $job_id $sbcast $bcast_file"]
subtest {![regexp -line {error:.*Invalid} $sbcast_output]} "sbcast should NOT generate an error"

# Verify the file was broadcasted
set ls_output [run_command_output -user $testsuite_user -subtest "$srun --jobid $job_id ls $bcast_file"]
subtest [regexp $bcast_file $ls_output] "The file should have been broadcasted"

# Clear out the broadcast file
run_command -fail -user $testsuite_user "$srun --jobid $job_id $bin_rm -f $bcast_file"
run_command -fail -user $testsuite_user "$scancel $job_id"

#
# Test that testsuite_user cannot sbcast to jobs from other users
#
log_info "Test that unauthorized users cannot sbcast to a job"

# Spawn an salloc job and obtain the job id
set salloc_output [run_command_output -fail "$salloc -v -N1 -t2 --no-shell"]
if {![regexp {Granted job allocation (\d+)} $salloc_output - job_id]} {
    fail "Allocation not granted ($output)"
}

# Clear out the broadcast file
run_command -fail "$srun --jobid $job_id $bin_rm -f $bcast_file"

# Attempt to broadcast the file as a different (and unauthorized) user
set sbcast_output [run_command_output -user $testsuite_user -subtest -xfail "$sbcast --jobid $job_id $sbcast $bcast_file"]
subtest [regexp -line {error:.*Invalid} $sbcast_output] "sbcast should generate an error"

# Verify the file was not broadcast
set ls_output [run_command_output -subtest -xfail "$srun --jobid $job_id ls $bcast_file"]
subtest [regexp -line {ls.* (?:No such file|does not exist|not found)} $ls_output] "The file should not have been broadcast"
