git: 85ff0b08ee69 - main - tee: add some basic tests

From: Kyle Evans <kevans_at_FreeBSD.org>
Date: Sun, 20 Apr 2025 16:35:46 UTC
The branch main has been updated by kevans:

URL: https://cgit.FreeBSD.org/src/commit/?id=85ff0b08ee699ff323404727998993275b4d2e2a

commit 85ff0b08ee699ff323404727998993275b4d2e2a
Author:     Kyle Evans <kevans@FreeBSD.org>
AuthorDate: 2025-04-20 16:34:50 +0000
Commit:     Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2025-04-20 16:35:32 +0000

    tee: add some basic tests
    
    The cases are ordered in such a way that we naturally progress through
    the functionality, with the earliest failures perhaps shedding light on
    any later failures.
    
    sysutils/porch is used for one test if it's available, just to cleanly
    check that SIGINT is being ignored properly.
    
    Reviewed by:    des, emaste
    Differential Revision:  https://reviews.freebsd.org/D48195
---
 etc/mtree/BSD.tests.dist      |  2 ++
 usr.bin/tee/Makefile          |  5 +++
 usr.bin/tee/tests/Makefile    |  6 ++++
 usr.bin/tee/tests/sigint.orch | 14 ++++++++
 usr.bin/tee/tests/tee_test.sh | 74 +++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 101 insertions(+)

diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist
index f197021bd4e9..20744e7b944a 100644
--- a/etc/mtree/BSD.tests.dist
+++ b/etc/mtree/BSD.tests.dist
@@ -1207,6 +1207,8 @@
         ..
         tar
         ..
+        tee
+        ..
         tftp
         ..
         touch
diff --git a/usr.bin/tee/Makefile b/usr.bin/tee/Makefile
index ab7b93575967..1e5781bef4da 100644
--- a/usr.bin/tee/Makefile
+++ b/usr.bin/tee/Makefile
@@ -1,3 +1,8 @@
+.include <src.opts.mk>
+
 PROG=	tee
 
+HAS_TESTS=
+SUBDIR.${MK_TESTS}+= tests
+
 .include <bsd.prog.mk>
diff --git a/usr.bin/tee/tests/Makefile b/usr.bin/tee/tests/Makefile
new file mode 100644
index 000000000000..acb78e671a8c
--- /dev/null
+++ b/usr.bin/tee/tests/Makefile
@@ -0,0 +1,6 @@
+PACKAGE=	tests
+
+ATF_TESTS_SH+=	tee_test
+${PACKAGE}FILES+=	sigint.orch
+
+.include <bsd.test.mk>
diff --git a/usr.bin/tee/tests/sigint.orch b/usr.bin/tee/tests/sigint.orch
new file mode 100644
index 000000000000..2fc0b32c61fb
--- /dev/null
+++ b/usr.bin/tee/tests/sigint.orch
@@ -0,0 +1,14 @@
+-- We expect the caller to have spawned the appropriate application
+write "text\r"
+match "text"
+
+write "^C"
+
+-- If SIGINT isn't being ignored, we'll bail out somewhere in the process of
+-- writing to the pty or trying to read from it to perform the following match.
+write "text\r"
+match "text"
+
+-- Finally, just close it out cleanly.
+write "^D"
+eof()
diff --git a/usr.bin/tee/tests/tee_test.sh b/usr.bin/tee/tests/tee_test.sh
new file mode 100644
index 000000000000..6ac733f2e58f
--- /dev/null
+++ b/usr.bin/tee/tests/tee_test.sh
@@ -0,0 +1,74 @@
+#
+# Copyright (c) 2024 Kyle Evans <kevans@FreeBSD.org>
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+
+atf_test_case single_file
+single_file_body()
+{
+	atf_check -o inline:"text\n" -x "echo text | tee file"
+	atf_check -o inline:"text\n" cat file
+}
+
+atf_test_case device
+device_body()
+{
+	atf_check -e inline:"text\n" -o inline:"text\n" -x \
+	    "echo text | tee /dev/stderr"
+}
+
+atf_test_case multiple_file
+multiple_file_body()
+{
+	atf_check -o inline:"text\n" -x "echo text | tee file1 file2"
+	atf_check -o inline:"text\n" cat file1
+	atf_check -o inline:"text\n" cat file2
+}
+
+atf_test_case append
+append_body()
+{
+	atf_check -o ignore -x "echo text | tee file"
+	atf_check -o inline:"text\n" cat file
+
+	# Should overwrite if done again
+	atf_check -o ignore -x "echo text | tee file"
+	atf_check -o inline:"text\n" cat file
+
+	# Should duplicate if we use -a
+	atf_check -o ignore -x "echo text | tee -a file"
+	atf_check -o inline:"text\ntext\n" cat file
+}
+
+atf_test_case sigint_ignored
+sigint_ignored_head()
+{
+	# This is most cleanly tested with interactive input, to avoid adding
+	# a lot of complexity in trying to manage an input and signal delivery
+	# dance purely in shell.
+	atf_set "require.progs" "porch"
+}
+sigint_ignored_body()
+{
+
+	# sigint.orch will write "text" to the file twice if we're properly
+	# ignoring SIGINT, so we'll do one test to confirm that SIGINT is not
+	# being ignored by porch(1), then another to confirm that tee(1) will
+	# ignore SIGINT when instructed to.
+	atf_check -s exit:1 -e ignore \
+	    porch -f $(atf_get_srcdir)/sigint.orch tee file
+	atf_check -o inline:"text\n" cat file
+
+	atf_check porch -f $(atf_get_srcdir)/sigint.orch tee -i file
+	atf_check -o inline:"text\ntext\n" cat file
+}
+
+atf_init_test_cases()
+{
+	atf_add_test_case single_file
+	atf_add_test_case device
+	atf_add_test_case multiple_file
+	atf_add_test_case append
+	atf_add_test_case sigint_ignored
+}