#
# This file and its contents are supplied under the terms of the
# Common Development and Distribution License ("CDDL"), version 1.0.
# You may only use this file in accordance with the terms of version
# 1.0 of the CDDL.
#
# A full copy of the text of the CDDL should have accompanied this
# source.  A copy of the CDDL is also available via the Internet at
# http://www.illumos.org/license/CDDL.
#

#
# Copyright (c) 2012, 2016, Delphix. All rights reserved.
# Copyright (c) 2022 Hewlett Packard Enterprise Development LP.
#

. $STF_SUITE/include/libtest.shlib

typeset -a compress_prop_vals=('off' 'lzjb' 'lz4' 'gzip' 'zle' 'zstd')
typeset -a checksum_prop_vals=('on' 'off' 'fletcher2' 'fletcher4' 'sha256'
    'noparity' 'sha512' 'skein')
if ! is_freebsd; then
	checksum_prop_vals+=('edonr')
fi
typeset -a recsize_prop_vals=('512' '1024' '2048' '4096' '8192' '16384'
    '32768' '65536' '131072' '262144' '524288' '1048576')
typeset -a canmount_prop_vals=('on' 'off' 'noauto')
typeset -a copies_prop_vals=('1' '2' '3')
typeset -a logbias_prop_vals=('latency' 'throughput')
typeset -a primarycache_prop_vals=('all' 'none' 'metadata')
typeset -a redundant_metadata_prop_vals=('all' 'most' 'some' 'none')
typeset -a secondarycache_prop_vals=('all' 'none' 'metadata')
typeset -a snapdir_prop_vals=('hidden' 'visible')
typeset -a sync_prop_vals=('standard' 'always' 'disabled')

typeset -a fs_props=('compress' 'checksum' 'recsize'
    'canmount' 'copies' 'logbias' 'primarycache' 'redundant_metadata'
    'secondarycache' 'snapdir' 'sync')
typeset -a vol_props=('compress' 'checksum' 'copies' 'logbias' 'primarycache'
    'secondarycache' 'redundant_metadata' 'sync')

#
# Given the 'prop' passed in, return 'num_vals' elements of the corresponding
# values array to the user, excluding any elements below 'first.' This allows
# us to exclude 'off' and 'on' which can be either unwanted, or a duplicate of
# another property respectively.
#
function get_rand_prop_vals
{
	typeset prop=$1
	typeset -i num_vals=$2
	typeset -i first=$3

	[[ -z $prop || -z $num_vals || -z $first ]] && \
	    log_fail "get_rand_prop_vals: bad arguments"

	typeset retstr=""

	typeset prop_vals_var=${prop}_prop_vals
	typeset -a prop_vals=($(eval echo \${${prop_vals_var}[@]}))

	[[ -z $prop_vals ]] && \
	    log_fail "get_rand_prop_vals: bad prop $prop"

	typeset -i last=$((${#prop_vals[@]} - 1))
	typeset -i i
	for i in $(range_shuffle $first $last | head -n $num_vals); do
		retstr="${prop_vals[$i]} $retstr"
	done
	echo $retstr
}

function get_rand_checksum
{
	get_rand_prop_vals checksum $1 2
}

function get_rand_checksum_any
{
	get_rand_prop_vals checksum $1 0
}

function get_rand_recsize
{
	get_rand_prop_vals recsize $1 0
}

function get_rand_large_recsize
{
	get_rand_prop_vals recsize $1 9
}

#
# Functions to toggle on/off properties
#
typeset -a binary_props=('atime' 'devices' 'exec' 'readonly' 'setuid' 'xattr')

if is_freebsd; then
	binary_props+=('jailed')
else
	binary_props+=('zoned')
fi

if is_linux; then
	# Only older kernels support non-blocking mandatory locks
	if [[ $(linux_version) -lt $(linux_version "4.4") ]]; then
		binary_props+=('nbmand')
	fi
else
	binary_props+=('nbmand')
fi

function toggle_prop
{
	typeset ds=$1
	typeset prop=$2

	datasetexists $ds || log_fail "$ds does not exist"
	typeset val=$(get_prop $prop $ds)
	typeset newval='off'

	[[ $val = $newval ]] && newval='on'
	log_must zfs set $prop=$newval $ds
}

function toggle_binary_props
{
	typeset ds=$1
	typeset prop

	for prop in "${binary_props[@]}"; do
		toggle_prop $ds $prop
	done
}

function randomize_ds_props
{
	typeset ds=$1
	typeset prop proplist val

	datasetexists $ds || log_fail "$ds does not exist"
	if ds_is_volume $ds; then
		toggle_prop $ds readonly
		proplist="${vol_props[@]}"
	elif ds_is_filesystem $ds; then
		toggle_binary_props $ds
		proplist="${fs_props[@]}"
	else
		log_fail "$ds is neither a volume nor a file system"
	fi

	for prop in $proplist; do
		typeset val=$(get_rand_prop_vals $prop 1 0)
		log_must zfs set $prop=$val $ds
	done
}
