1b871f899SRobert Mustacchi#!/bin/ksh 2b871f899SRobert Mustacchi# 3b871f899SRobert Mustacchi# This file and its contents are supplied under the terms of the 4b871f899SRobert Mustacchi# Common Development and Distribution License ("CDDL"), version 1.0. 5b871f899SRobert Mustacchi# You may only use this file in accordance with the terms of version 6b871f899SRobert Mustacchi# 1.0 of the CDDL. 7b871f899SRobert Mustacchi# 8b871f899SRobert Mustacchi# A full copy of the text of the CDDL should have accompanied this 9b871f899SRobert Mustacchi# source. A copy of the CDDL is also available via the Internet at 10b871f899SRobert Mustacchi# http://www.illumos.org/license/CDDL. 11b871f899SRobert Mustacchi# 12b871f899SRobert Mustacchi 13b871f899SRobert Mustacchi# 14b871f899SRobert Mustacchi# Copyright 2019 Robert Mustacchi 15*c3f3f381SJohn Levon# Copyright 2020 Joyent, Inc. 16b871f899SRobert Mustacchi# 17b871f899SRobert Mustacchi 18b871f899SRobert Mustacchi# 19b871f899SRobert Mustacchi# Basic tests of sleep(1). sleep is a little hard to test, especially 20b871f899SRobert Mustacchi# for longer running cases. Therefore to test it, we basically take 21b871f899SRobert Mustacchi# advantage of our knowledge of how it is implemented. We see that it 22b871f899SRobert Mustacchi# properly is sleeping for the right amount of time by looking at the 23b871f899SRobert Mustacchi# call to nanosleep in libc and make sure that the structures time is 24b871f899SRobert Mustacchi# what we expect. 25b871f899SRobert Mustacchi# 26b871f899SRobert Mustacchi 27b871f899SRobert Mustacchiunalias -a 28b871f899SRobert Mustacchiset -o pipefail 29b871f899SRobert Mustacchi 30b871f899SRobert Mustacchi# 31b871f899SRobert Mustacchi# Set the locale for the start of the test to be C.UTF-8 to make sure 32b871f899SRobert Mustacchi# that we have a good starting point and correct fractional 33b871f899SRobert Mustacchi# interpretation. 34b871f899SRobert Mustacchi# 35b871f899SRobert Mustacchiexport LC_ALL=C.UTF-8 36b871f899SRobert Mustacchi 37b871f899SRobert Mustacchisleep_arg0="$(basename $0)" 38b871f899SRobert Mustacchisleep_prog=/usr/bin/sleep 39b871f899SRobert Mustacchisleep_dir="$(dirname $0)" 40b871f899SRobert Mustacchisleep_dscript=$sleep_dir/sleep.d 41b871f899SRobert Mustacchisleep_awk=$sleep_dir/sleep.awk 42b871f899SRobert Mustacchisleep_exit=0 43b871f899SRobert Mustacchi 44b871f899SRobert Mustacchi# 45b871f899SRobert Mustacchi# This is the factor by which we're going to basically say that the slp 46b871f899SRobert Mustacchi# microstate has to complete within. Because the system will usually 47b871f899SRobert Mustacchi# have a bit of additional latency, we will usually be greater than that 48b871f899SRobert Mustacchi# as well. This determines how much we should actually do that by. 49b871f899SRobert Mustacchi# 50b871f899SRobert Mustacchisleep_factor=1.5 51b871f899SRobert Mustacchi 52b871f899SRobert Mustacchiwarn() 53b871f899SRobert Mustacchi{ 54b871f899SRobert Mustacchi typeset msg="$*" 55b871f899SRobert Mustacchi [[ -z "$msg" ]] && msg="failed" 56b871f899SRobert Mustacchi echo "TEST FAILED: $sleep_arg0: $msg" >&2 57b871f899SRobert Mustacchi} 58b871f899SRobert Mustacchi 59b871f899SRobert Mustacchisleep_bound() 60b871f899SRobert Mustacchi{ 61b871f899SRobert Mustacchi typeset min=$1 62b871f899SRobert Mustacchi typeset test="sleep $min: bounding" 63b871f899SRobert Mustacchi 64b871f899SRobert Mustacchi ptime -m $sleep_prog $min 2>&1 | nawk -f $sleep_awk min=$min \ 65b871f899SRobert Mustacchi factor=$sleep_factor 66b871f899SRobert Mustacchi if [[ $? -ne 42 ]]; then 67b871f899SRobert Mustacchi warn "$test" 68b871f899SRobert Mustacchi sleep_exit=1 69b871f899SRobert Mustacchi else 70b871f899SRobert Mustacchi printf "TEST PASSED: %s\n" "$test" 71b871f899SRobert Mustacchi fi 72b871f899SRobert Mustacchi} 73b871f899SRobert Mustacchi 74b871f899SRobert Mustacchisleep_one() 75b871f899SRobert Mustacchi{ 76b871f899SRobert Mustacchi typeset arg=$1 77b871f899SRobert Mustacchi typeset secs=$2 78b871f899SRobert Mustacchi typeset nsecs=$3 79b871f899SRobert Mustacchi typeset test="sleep $arg: $secs secs $nsecs ns" 80b871f899SRobert Mustacchi 81b871f899SRobert Mustacchi if ! dtrace -qws $sleep_dscript -c "$sleep_prog $arg" $secs $nsecs; then 82b871f899SRobert Mustacchi warn "$test" 83b871f899SRobert Mustacchi sleep_exit=1 84b871f899SRobert Mustacchi else 85b871f899SRobert Mustacchi printf "TEST PASSED: %s\n" "$test" 86b871f899SRobert Mustacchi fi 87b871f899SRobert Mustacchi} 88b871f899SRobert Mustacchi 89b871f899SRobert Mustacchisleep_err() 90b871f899SRobert Mustacchi{ 91b871f899SRobert Mustacchi typeset test="negative test: sleep $*" 92b871f899SRobert Mustacchi 93b871f899SRobert Mustacchi if $sleep_prog $* 2>/dev/null; then 94b871f899SRobert Mustacchi warn "$test" 95b871f899SRobert Mustacchi sleep_exit=1 96b871f899SRobert Mustacchi else 97b871f899SRobert Mustacchi printf "TEST PASSED: %s\n" "$test" 98b871f899SRobert Mustacchi fi 99b871f899SRobert Mustacchi} 100b871f899SRobert Mustacchi 101b871f899SRobert Mustacchiif [[ -n $SLEEP ]]; then 102b871f899SRobert Mustacchi sleep_prog=$SLEEP 103b871f899SRobert Mustacchifi 104b871f899SRobert Mustacchi 105b871f899SRobert Mustacchi# 106b871f899SRobert Mustacchi# First test basic integer values. Both in base 10 and hex. 107b871f899SRobert Mustacchi# 108b871f899SRobert Mustacchisleep_one 1 1 0 109b871f899SRobert Mustacchisleep_one 23 23 0 110b871f899SRobert Mustacchisleep_one 0xff 0xff 0 111b871f899SRobert Mustacchisleep_one 123456789 123456789 0 112b871f899SRobert Mustacchisleep_one 1e8 100000000 0 113b871f899SRobert Mustacchi 114b871f899SRobert Mustacchi# 115b871f899SRobert Mustacchi# Fractional values. 116b871f899SRobert Mustacchi# 117b871f899SRobert Mustacchisleep_one 2.5 2 500000000 118b871f899SRobert Mustacchisleep_one 0.9 0 900000000 119b871f899SRobert Mustacchisleep_one 34.0051 34 5100000 120b871f899SRobert Mustacchisleep_one 0x654.100 0x654 62500000 121b871f899SRobert Mustacchi 122b871f899SRobert Mustacchi# 123b871f899SRobert Mustacchi# Large values that are basically the same as infinity. The current 124b871f899SRobert Mustacchi# implementation will do a sleep in groups of INT32_MAX at a time. So 125b871f899SRobert Mustacchi# make sure our large values are the same. 126b871f899SRobert Mustacchi# 127b871f899SRobert Mustacchisleep_one Inf 0x7fffffff 0 128b871f899SRobert Mustacchisleep_one +Inf 0x7fffffff 0 129b871f899SRobert Mustacchisleep_one 1e100 0x7fffffff 0 130b871f899SRobert Mustacchisleep_one 0x123456789abc 0x7fffffff 0 131b871f899SRobert Mustacchi 132b871f899SRobert Mustacchi# 133b871f899SRobert Mustacchi# That all of our suffixes for time increments work and make sense. 134b871f899SRobert Mustacchi# 135b871f899SRobert Mustacchisleep_one 1s 1 0 136b871f899SRobert Mustacchisleep_one 1m 60 0 137b871f899SRobert Mustacchisleep_one 1h 3600 0 138b871f899SRobert Mustacchisleep_one 1d 86400 0 139b871f899SRobert Mustacchisleep_one 1w 604800 0 140b871f899SRobert Mustacchisleep_one 1y 31536000 0 141b871f899SRobert Mustacchi 142b871f899SRobert Mustacchisleep_one 3.5s 3 500000000 143b871f899SRobert Mustacchisleep_one 3.6d 311040 0 144b871f899SRobert Mustacchisleep_one 2.001y 63103536 0 145b871f899SRobert Mustacchi 146b871f899SRobert Mustacchi# 147b871f899SRobert Mustacchi# Now we need to go through and use ptime -m to get the slp time for 148b871f899SRobert Mustacchi# things and make sure it is always greater than what we asked for and 149b871f899SRobert Mustacchi# less than a bound. 150b871f899SRobert Mustacchi# 151b871f899SRobert Mustacchisleep_bound 0.01 152b871f899SRobert Mustacchisleep_bound 0.1 153b871f899SRobert Mustacchisleep_bound 0.25 154b871f899SRobert Mustacchisleep_bound 0.5 155b871f899SRobert Mustacchisleep_bound 0.75 156b871f899SRobert Mustacchi 157b871f899SRobert Mustacchi# 158b871f899SRobert Mustacchi# The next set of tests are negative tests that make sure that sleep 159b871f899SRobert Mustacchi# does not correctly execute in these cases. 160b871f899SRobert Mustacchi# 161b871f899SRobert Mustacchisleep_err \"\" 162b871f899SRobert Mustacchisleep_err 1 2 3 163b871f899SRobert Mustacchisleep_err 1@23 164b871f899SRobert Mustacchisleep_err 0,56 165b871f899SRobert Mustacchisleep_err "hello" 166b871f899SRobert Mustacchisleep_err s 167b871f899SRobert Mustacchisleep_err 1z 168b871f899SRobert Mustacchisleep_err -- -0.3 169b871f899SRobert Mustacchi 170b871f899SRobert Mustacchi# 171b871f899SRobert Mustacchi# Test a locale that uses a ',' character (de_DE.UTF-8 is one) as the 172*c3f3f381SJohn Levon# decimal point to make sure that sleep is correctly using LC_NUMERIC. 173*c3f3f381SJohn Levonexport LC_ALL=de_DE.UTF-8 174b871f899SRobert Mustacchisleep_err 21.45 175b871f899SRobert Mustacchisleep_one 2,5 2 500000000 176b871f899SRobert Mustacchisleep_one 34,0051 34 5100000 177b871f899SRobert Mustacchisleep_one 3,6d 311040 0 178*c3f3f381SJohn Levonexport LC_ALL=C.UTF-8 179b871f899SRobert Mustacchi 180b871f899SRobert Mustacchiexit $sleep_exit 181