aboutsummaryrefslogtreecommitdiff
path: root/bin/dd/tests/dd2_test.sh
diff options
context:
space:
mode:
Diffstat (limited to 'bin/dd/tests/dd2_test.sh')
-rwxr-xr-xbin/dd/tests/dd2_test.sh97
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
+}