mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-18 10:21:01 +03:00
a2ec738c75
FreeBSD recently replaced the GNU bc and dc in the base system with BSD licensed versions. They are supposed to be compatible with all the features present in the GNU versions, but it turns out they are picky about `if` statements having a corresponding `else`. ZTS uses `echo "if ($x > $y) 1" | bc` in a few places, which causes tests to fail unexpectedly with the new bc. Change the two expressions in ZTS to `if ($x > $y) 1 else 0` for compatibility with the new BSD bc. Reviewed-by: John Kennedy <john.kennedy@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Ryan Moeller <ryan@iXsystems.com> Closes #10551
145 lines
3.4 KiB
Plaintext
145 lines
3.4 KiB
Plaintext
#
|
|
# 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 by Delphix. All rights reserved.
|
|
#
|
|
|
|
#
|
|
# Return 0 if the percentage difference between $a and $b is $percent or
|
|
# greater. Return 1 if the percentage is lower or if we would divide by
|
|
# zero. For use like this:
|
|
#
|
|
# Do $action if the calculated percentage is greater or equal to that passed in:
|
|
# within_percent A B P && $action
|
|
# Do $action if the calculated percentage is less than that passed in:
|
|
# within_percent A B P || $action
|
|
#
|
|
function within_percent
|
|
{
|
|
typeset a=$1
|
|
typeset b=$1
|
|
typeset percent=$3
|
|
|
|
# Set $a or $b to $2 such that a >= b
|
|
[[ '1' = $(echo "if ($2 > $a) 1 else 0" | bc) ]] && a=$2 || b=$2
|
|
|
|
# Prevent division by 0
|
|
[[ $a =~ [1-9] ]] || return 1
|
|
|
|
typeset p=$(echo "scale=2; $b * 100 / $a" | bc)
|
|
log_note "Comparing $a and $b given $percent% (calculated: $p%)"
|
|
[[ '1' = $(echo "scale=2; if ($p >= $percent) 1 else 0" | bc) ]] && \
|
|
return 0
|
|
|
|
return 1
|
|
}
|
|
|
|
#
|
|
# Return 0 if value is within +/-tolerance of target.
|
|
# Return 1 if value exceeds our tolerance.
|
|
# For use like this:
|
|
#
|
|
# Do $action if value is within the tolerance from target passed in:
|
|
# within_tolerance VAL TAR TOL && $action
|
|
# Do $action if value surpasses the tolerance from target passed in:
|
|
# within_tolerance VAL TAR TOL || $action
|
|
#
|
|
function within_tolerance #value #target #tolerance
|
|
{
|
|
typeset val=$1
|
|
typeset target=$2
|
|
typeset tol=$3
|
|
|
|
typeset diff=$((abs(val - target)))
|
|
log_note "Checking if $val is within +/-$tol of $target (diff: $diff)"
|
|
((diff <= tol)) && return 0
|
|
|
|
return 1
|
|
}
|
|
|
|
#
|
|
# Return 0 if the human readable string of the form <value>[suffix] can
|
|
# be converted to bytes. Allow suffixes are shown in the table below.
|
|
#
|
|
function to_bytes
|
|
{
|
|
typeset size=$1
|
|
typeset value=$(echo "$size" | grep -o '[0-9]\+')
|
|
|
|
case $size in
|
|
*PB|*pb|*P|*p) factor='1024^5' ;;
|
|
*TB|*tb|*T|*t) factor='1024^4' ;;
|
|
*GB|*gb|*G|*g) factor='1024^3' ;;
|
|
*MB|*mb|*M|*m) factor='1024^2' ;;
|
|
*KB|*kb|*K|*k) factor='1024^1' ;;
|
|
*B|*b) factor='1024^0' ;;
|
|
*[!0-9.]*) return 1 ;;
|
|
*) factor='1024^0' ;;
|
|
esac
|
|
|
|
echo "$value * ($factor)" | bc
|
|
|
|
return 0
|
|
}
|
|
|
|
#
|
|
# Verify $a is equal to $b, otherwise raise an error specifying
|
|
# the $type of values being compared
|
|
#
|
|
function verify_eq # <a> <b> <type>
|
|
{
|
|
typeset a=$1
|
|
typeset b=$2
|
|
typeset type=$3
|
|
|
|
if [[ $a -ne $b ]]; then
|
|
log_fail "Compared $type should be equal: $a != $b"
|
|
fi
|
|
}
|
|
|
|
#
|
|
# Verify $a is not equal to $b, otherwise raise an error specifying
|
|
# the $type of values being compared
|
|
#
|
|
function verify_ne # <a> <b> <type>
|
|
{
|
|
typeset a=$1
|
|
typeset b=$2
|
|
typeset type=$3
|
|
|
|
if [[ $a -eq $b ]]; then
|
|
log_fail "Compared $type should be not equal: $a == $b"
|
|
fi
|
|
}
|
|
|
|
# A simple function to get a random number between two bounds (inclusive)
|
|
#
|
|
# Probably not the most efficient for large ranges, but it's okay.
|
|
#
|
|
# Note since we're using $RANDOM, 32767 is the largest number we
|
|
# can accept as the upper bound.
|
|
#
|
|
# $1 lower bound
|
|
# $2 upper bound
|
|
function random_int_between
|
|
{
|
|
typeset -i min=$1
|
|
typeset -i max=$2
|
|
typeset -i rand=0
|
|
|
|
while [[ $rand -lt $min ]] ; do
|
|
rand=$(( $RANDOM % $max + 1))
|
|
done
|
|
|
|
echo $rand
|
|
}
|