diff options
Diffstat (limited to 'bin/dd/tests/dd2_test.sh')
| -rwxr-xr-x | bin/dd/tests/dd2_test.sh | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/bin/dd/tests/dd2_test.sh b/bin/dd/tests/dd2_test.sh new file mode 100755 index 000000000000..c4a3065763cd --- /dev/null +++ b/bin/dd/tests/dd2_test.sh @@ -0,0 +1,97 @@ +# +# Copyright (c) 2017 Spectra Logic Corporation +# Copyright (c) 2023 Klara, Inc. +# +# SPDX-License-Identifier: BSD-2-Clause +# + +atf_test_case max_seek +max_seek_head() +{ + atf_set "descr" "dd(1) can seek by the maximum amount" +} +max_seek_body() +{ + case $(df -T . | tail -n 1 | cut -wf 2) in + "ufs") + atf_skip "UFS's maximum file size is too small" + ;; + "zfs") + # ZFS is fine + ;; + "tmpfs") + atf_skip "tmpfs can't create arbitrarily large sparse files" + ;; + *) + atf_skip "Unknown file system" + ;; + esac + + touch f.in + seek=$(bc -e "2^63 / 4096 - 1") + atf_check -s exit:0 -e ignore dd if=f.in of=f.out bs=4096 seek=$seek +} + +atf_test_case seek_overflow +seek_overflow_head() +{ + atf_set "descr" "dd(1) should reject too-large seek values" +} +seek_overflow_body() +{ + touch f.in + seek=$(bc -e "2^63 / 4096") + atf_check -s not-exit:0 -e match:"seek offsets cannot be larger than" \ + dd if=f.in of=f.out bs=4096 seek=$seek + atf_check -s not-exit:0 -e match:"seek offsets cannot be larger than" \ + dd if=f.in of=f.out bs=4096 seek=-1 +} + +atf_test_case sigint +sigint_open_head() +{ + atf_set "descr" "SIGINT while opening destination" +} +sigint_open_body() +{ + atf_check mkfifo fifo + set -m + dd if=fifo of=/dev/null 2>stderr & + pid=$! + sleep 3 + kill -INT $pid + wait $pid + rv=$? + atf_check test "$rv" -gt 128 + atf_check -o inline:"INT\n" kill -l $((rv-128)) + atf_check test -s stderr +} + +atf_test_case sigint +sigint_read_head() +{ + atf_set "descr" "SIGINT while reading source" +} +sigint_read_body() +{ + atf_check mkfifo fifo + (sleep 30 >fifo &) # ensures that dd does not block on open + set -m + dd if=fifo of=/dev/null 2>stderr & + pid=$! + sleep 3 + kill -INT $pid + wait $pid + rv=$? + atf_check test "$rv" -gt 128 + atf_check -o inline:"INT\n" kill -l $((rv-128)) + atf_check test -s stderr +} + +atf_init_test_cases() +{ + atf_add_test_case max_seek + atf_add_test_case seek_overflow + atf_add_test_case sigint_open + atf_add_test_case sigint_read +} |
