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