git: 2822a7953316 - main - mv: Convert tests to ATF.

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Tue, 19 Nov 2024 09:29:33 UTC
The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=2822a7953316f99418425bf3aa403d668e5af402

commit 2822a7953316f99418425bf3aa403d668e5af402
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2024-11-19 09:29:11 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2024-11-19 09:29:11 +0000

    mv: Convert tests to ATF.
    
    Sponsored by:   Klara, Inc.
    Reviewed by:    asomers, markj
    Differential Revision:  https://reviews.freebsd.org/D47569
---
 ObsoleteFiles.inc           |   3 +
 bin/mv/tests/Makefile       |   2 +-
 bin/mv/tests/legacy_test.sh | 295 ---------------------------------
 bin/mv/tests/mv_test.sh     | 391 ++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 395 insertions(+), 296 deletions(-)

diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc
index 57e0f4609050..1378d6b6dcfa 100644
--- a/ObsoleteFiles.inc
+++ b/ObsoleteFiles.inc
@@ -51,6 +51,9 @@
 #   xargs -n1 | sort | uniq -d;
 # done
 
+# 20241119: rewrite mv tests
+OLD_FILES+=usr/tests/bin/mv/legacy_test
+
 # 20241112: Retire MK_PROFILE support
 OLD_FILES+=usr/lib/lib80211_p.a
 OLD_FILES+=usr/lib/lib9p_p.a
diff --git a/bin/mv/tests/Makefile b/bin/mv/tests/Makefile
index 0e8da4c0981d..d0c65138c9c7 100644
--- a/bin/mv/tests/Makefile
+++ b/bin/mv/tests/Makefile
@@ -1,5 +1,5 @@
 .include <bsd.own.mk>
 
-TAP_TESTS_SH=	legacy_test
+ATF_TESTS_SH=	mv_test
 
 .include <bsd.test.mk>
diff --git a/bin/mv/tests/legacy_test.sh b/bin/mv/tests/legacy_test.sh
deleted file mode 100644
index 8af025a0d011..000000000000
--- a/bin/mv/tests/legacy_test.sh
+++ /dev/null
@@ -1,295 +0,0 @@
-#!/bin/sh
-
-# A directory in a device different from that where the tests are run
-TMPDIR=/tmp/regress.$$
-COUNT=0
-
-# Begin an individual test
-begin()
-{
-	COUNT=`expr $COUNT + 1`
-	OK=1
-	if [ -z "$FS" ]
-	then
-		NAME="$1"
-	else
-		NAME="$1 (cross device)"
-	fi
-	rm -rf testdir $TMPDIR/testdir
-	mkdir -p testdir $TMPDIR/testdir
-	cd testdir
-}
-
-# End an individual test
-end()
-{
-	if [ $OK = 1 ]
-	then
-		printf 'ok '
-	else
-		printf 'not ok '
-	fi
-	echo "$COUNT - $NAME"
-	cd ..
-	rm -rf testdir $TMPDIR/testdir
-}
-
-# Make a file that can later be verified
-mkf()
-{
-	CN=`basename $1`
-	echo "$CN-$CN" >$1
-}
-
-# Verify that the file specified is correct
-ckf()
-{
-	if [ -f $2 ] && echo "$1-$1" | diff - $2 >/dev/null
-	then
-		ok
-	else
-		notok
-	fi
-}
-
-# Make a fifo that can later be verified
-mkp()
-{
-	mkfifo $1
-}
-
-# Verify that the file specified is correct
-ckp()
-{
-	if [ -p $2 ]
-	then
-		ok
-	else
-		notok
-	fi
-}
-
-# Make a directory that can later be verified
-mkd()
-{
-	CN=`basename $1`
-	mkdir -p $1/"$CN-$CN"
-}
-
-# Verify that the directory specified is correct
-ckd()
-{
-	if [ -d $2/$1-$1 ]
-	then
-		ok
-	else
-		notok
-	fi
-}
-
-# Verify that the specified file does not exist
-# (is not there)
-cknt()
-{
-	if [ -r $1 ]
-	then
-		notok
-	else
-		ok
-	fi
-}
-
-# A part of a test succeeds
-ok()
-{
-	:
-}
-
-# A part of a test fails
-notok()
-{
-	OK=0
-}
-
-# Verify that the exit code passed is for unsuccessful termination
-ckfail()
-{
-	if [ $1 -gt 0 ]
-	then
-		ok
-	else
-		notok
-	fi
-}
-
-# Verify that the exit code passed is for successful termination
-ckok()
-{
-	if [ $1 -eq 0 ]
-	then
-		ok
-	else
-		notok
-	fi
-}
-
-# Run all tests locally and across devices
-echo 1..32
-for FS in '' $TMPDIR/testdir/
-do
-	begin 'Rename file'
-	mkf fa
-	mv fa ${FS}fb
-	ckok $?
-	ckf fa ${FS}fb
-	cknt fa
-	end
-
-	begin 'Move files into directory'
-	mkf fa
-	mkf fb
-	mkdir -p ${FS}1/2/3
-	mv fa fb ${FS}1/2/3
-	ckok $?
-	ckf fa ${FS}1/2/3/fa
-	ckf fb ${FS}1/2/3/fb
-	cknt fa
-	cknt fb
-	end
-
-	begin 'Move file from directory to file'
-	mkdir -p 1/2/3
-	mkf 1/2/3/fa
-	mv 1/2/3/fa ${FS}fb
-	ckok $?
-	ckf fa ${FS}fb
-	cknt 1/2/3/fa
-	end
-
-	begin 'Move file from directory to existing file'
-	mkdir -p 1/2/3
-	mkf 1/2/3/fa
-	:> ${FS}fb
-	mv 1/2/3/fa ${FS}fb
-	ckok $?
-	ckf fa ${FS}fb
-	cknt 1/2/3/fa
-	end
-
-	begin 'Move file from directory to existing directory'
-	mkdir -p 1/2/3
-	mkf 1/2/3/fa
-	mkdir -p ${FS}db/fa
-	# Should fail per POSIX step 3a:
-	# Destination path is a file of type directory and
-	# source_file is not a file of type directory
-	mv 1/2/3/fa ${FS}db 2>/dev/null
-	ckfail $?
-	ckf fa 1/2/3/fa
-	end
-
-	begin 'Move file from directory to directory'
-	mkdir -p da1/da2/da3
-	mkdir -p ${FS}db1/db2/db3
-	mkf da1/da2/da3/fa
-	mv da1/da2/da3/fa ${FS}db1/db2/db3/fb
-	ckok $?
-	ckf fa ${FS}db1/db2/db3/fb
-	cknt da1/da2/da3/fa
-	end
-
-	begin 'Rename directory'
-	mkd da
-	mv da ${FS}db
-	ckok $?
-	ckd da ${FS}db
-	cknt da
-	end
-
-	begin 'Move directory to directory name'
-	mkd da1/da2/da3/da
-	mkdir -p ${FS}db1/db2/db3
-	mv da1/da2/da3/da ${FS}db1/db2/db3/db
-	ckok $?
-	ckd da ${FS}db1/db2/db3/db
-	cknt da1/da2/da3/da
-	end
-
-	begin 'Move directory to directory'
-	mkd da1/da2/da3/da
-	mkdir -p ${FS}db1/db2/db3
-	mv da1/da2/da3/da ${FS}db1/db2/db3
-	ckok $?
-	ckd da ${FS}db1/db2/db3/da
-	cknt da1/da2/da3/da
-	end
-
-	begin 'Move directory to existing empty directory'
-	mkd da1/da2/da3/da
-	mkdir -p ${FS}db1/db2/db3/da
-	mv da1/da2/da3/da ${FS}db1/db2/db3
-	ckok $?
-	ckd da ${FS}db1/db2/db3/da
-	cknt da1/da2/da3/da
-	end
-
-	begin 'Move directory to existing non-empty directory'
-	mkd da1/da2/da3/da
-	mkdir -p ${FS}db1/db2/db3/da/full
-	# Should fail (per the semantics of rename(2))
-	mv da1/da2/da3/da ${FS}db1/db2/db3 2>/dev/null
-	ckfail $?
-	ckd da da1/da2/da3/da
-	end
-
-	begin 'Move directory to existing file'
-	mkd da1/da2/da3/da
-	mkdir -p ${FS}db1/db2/db3
-	:> ${FS}db1/db2/db3/da
-	# Should fail per POSIX step 3b:
-	# Destination path is a file not of type directory
-	# and source_file is a file of type directory
-	mv da1/da2/da3/da ${FS}db1/db2/db3/da 2>/dev/null
-	ckfail $?
-	ckd da da1/da2/da3/da
-	end
-
-	begin 'Rename fifo'
-	mkp fa
-	mv fa ${FS}fb
-	ckok $?
-	ckp fa ${FS}fb
-	cknt fa
-	end
-
-	begin 'Move fifos into directory'
-	mkp fa
-	mkp fb
-	mkdir -p ${FS}1/2/3
-	mv fa fb ${FS}1/2/3
-	ckok $?
-	ckp fa ${FS}1/2/3/fa
-	ckp fb ${FS}1/2/3/fb
-	cknt fa
-	cknt fb
-	end
-
-	begin 'Move fifo from directory to fifo'
-	mkdir -p 1/2/3
-	mkp 1/2/3/fa
-	mv 1/2/3/fa ${FS}fb
-	ckok $?
-	ckp fa ${FS}fb
-	cknt 1/2/3/fa
-	end
-
-	begin 'Move fifo from directory to directory'
-	mkdir -p da1/da2/da3
-	mkdir -p ${FS}db1/db2/db3
-	mkp da1/da2/da3/fa
-	mv da1/da2/da3/fa ${FS}db1/db2/db3/fb
-	ckok $?
-	ckp fa ${FS}db1/db2/db3/fb
-	cknt da1/da2/da3/fa
-	end
-done
diff --git a/bin/mv/tests/mv_test.sh b/bin/mv/tests/mv_test.sh
new file mode 100644
index 000000000000..aae4bc3f9297
--- /dev/null
+++ b/bin/mv/tests/mv_test.sh
@@ -0,0 +1,391 @@
+#
+# Copyright (c) 2007 Diomidis Spinellis
+# Copyright (c) 2023 Klara, Inc.
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+
+mv_setup() {
+	atf_check mkdir fs
+	atf_check mount -t tmpfs -o size=1m tmp fs
+}
+
+mv_cleanup() {
+	umount fs || true
+}
+
+# Make a file that can later be verified
+mv_makefile() {
+	local cn="${1##*/}"
+	echo "$cn-$cn" >"$1"
+}
+
+# Verify that the file specified is correct
+mv_checkfile() {
+	atf_check -o inline:"$1-$1\n" cat "$2"
+}
+
+# Make a fifo that can later be verified
+mv_makepipe() {
+	atf_check mkfifo $1
+}
+
+# Verify that the file specified is correct
+mv_checkpipe() {
+	atf_check test -p "$2"
+}
+
+# Make a directory that can later be verified
+mv_makedir() {
+	local cn="${1##*/}"
+	atf_check mkdir -p "$1/$cn-$cn"
+}
+
+# Verify that the directory specified is correct
+mv_checkdir() {
+	atf_check test -d "$2/$1-$1"
+}
+
+# Verify that the specified file does not exist
+# (is not there)
+mv_checkabsent() {
+	atf_check -s exit:1 test -r "$1"
+}
+
+atf_test_case rename_file cleanup
+rename_file_head() {
+	atf_set "descr" "Rename file"
+	atf_set "require.user" "root"
+}
+rename_file_body() {
+	mv_setup
+	for FS in "" "fs/" ; do
+		mv_makefile fa
+		atf_check mv fa ${FS}fb
+		mv_checkfile fa ${FS}fb
+		mv_checkabsent fa
+	done
+}
+rename_file_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case file_into_dir cleanup
+file_into_dir_head() {
+	atf_set "descr" "Move files into directory"
+	atf_set "require.user" "root"
+}
+file_into_dir_body() {
+	mv_setup
+	for FS in "" "fs/" ; do
+		mv_makefile fa
+		mv_makefile fb
+		atf_check mkdir -p ${FS}1/2/3
+		atf_check mv fa fb ${FS}1/2/3
+		mv_checkfile fa ${FS}1/2/3/fa
+		mv_checkfile fb ${FS}1/2/3/fb
+		mv_checkabsent fa
+		mv_checkabsent fb
+	done
+}
+file_into_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case file_from_dir cleanup
+file_from_dir_head() {
+	atf_set "descr" "Move file from directory to file"
+	atf_set "require.user" "root"
+}
+file_from_dir_body() {
+	mv_setup
+	atf_check mkdir -p 1/2/3
+	for FS in "" "fs/" ; do
+		mv_makefile 1/2/3/fa
+		atf_check mv 1/2/3/fa ${FS}fb
+		mv_checkfile fa ${FS}fb
+		mv_checkabsent 1/2/3/fa
+	done
+}
+file_from_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case file_from_dir_replace cleanup
+file_from_dir_replace_head() {
+	atf_set "descr" "Move file from directory to existing file"
+	atf_set "require.user" "root"
+}
+file_from_dir_replace_body() {
+	mv_setup
+	atf_check mkdir -p 1/2/3
+	for FS in "" "fs/" ; do
+		mv_makefile 1/2/3/fa
+		:> ${FS}fb
+		atf_check mv 1/2/3/fa ${FS}fb
+		mv_checkfile fa ${FS}fb
+		mv_checkabsent 1/2/3/fa
+	done
+}
+file_from_dir_replace_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case file_to_dir cleanup
+file_to_dir_head() {
+	atf_set "descr" "Move file from directory to existing directory"
+	atf_set "require.user" "root"
+}
+file_to_dir_body() {
+	mv_setup
+	atf_check mkdir -p 1/2/3
+	for FS in "" "fs/" ; do
+		mv_makefile 1/2/3/fa
+		atf_check mkdir -p ${FS}db/fa
+		# Should fail per POSIX step 3a:
+		# Destination path is a file of type directory and
+		# source_file is not a file of type directory
+		atf_check -s not-exit:0 -e match:"Is a directory" \
+		      mv 1/2/3/fa ${FS}db
+		mv_checkfile fa 1/2/3/fa
+	done
+}
+file_to_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case file_from_rename_dir cleanup
+file_from_rename_dir_head() {
+	atf_set "descr" "Move file from directory to directory"
+	atf_set "require.user" "root"
+}
+file_from_rename_dir_body() {
+	mv_setup
+	atf_check mkdir -p da1/da2/da3
+	for FS in "" "fs/" ; do
+		atf_check mkdir -p ${FS}db1/db2/db3
+		mv_makefile da1/da2/da3/fa
+		atf_check mv da1/da2/da3/fa ${FS}db1/db2/db3/fb
+		mv_checkfile fa ${FS}db1/db2/db3/fb
+		mv_checkabsent da1/da2/da3/fa
+	done
+}
+file_from_rename_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case rename_dir cleanup
+rename_dir_head() {
+	atf_set "descr" "Rename directory"
+	atf_set "require.user" "root"
+}
+rename_dir_body() {
+	mv_setup
+	for FS in "" "fs/" ; do
+		mv_makedir da
+		atf_check mv da ${FS}db
+		mv_checkdir da ${FS}db
+		mv_checkabsent da
+	done
+}
+rename_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case dir_to_dir cleanup
+dir_to_dir_head() {
+	atf_set "descr" "Move directory to directory name"
+	atf_set "require.user" "root"
+}
+dir_to_dir_body() {
+	mv_setup
+	for FS in "" "fs/" ; do
+		mv_makedir da1/da2/da3/da
+		atf_check mkdir -p ${FS}db1/db2/db3
+		atf_check mv da1/da2/da3/da ${FS}db1/db2/db3/db
+		mv_checkdir da ${FS}db1/db2/db3/db
+		mv_checkabsent da1/da2/da3/da
+	done
+}
+dir_to_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case dir_into_dir cleanup
+dir_into_dir_head() {
+	atf_set "descr" "Move directory to directory"
+	atf_set "require.user" "root"
+}
+dir_into_dir_body() {
+	mv_setup
+	for FS in "" "fs/" ; do
+		mv_makedir da1/da2/da3/da
+		atf_check mkdir -p ${FS}db1/db2/db3
+		atf_check mv da1/da2/da3/da ${FS}db1/db2/db3
+		mv_checkdir da ${FS}db1/db2/db3/da
+		mv_checkabsent da1/da2/da3/da
+	done
+}
+dir_into_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case dir_to_empty_dir cleanup
+dir_to_empty_dir_head() {
+	atf_set "descr" "Move directory to existing empty directory"
+	atf_set "require.user" "root"
+}
+dir_to_empty_dir_body() {
+	mv_setup
+	for FS in "" "fs/" ; do
+		mv_makedir da1/da2/da3/da
+		atf_check mkdir -p ${FS}db1/db2/db3/da
+		atf_check mv da1/da2/da3/da ${FS}db1/db2/db3
+		mv_checkdir da ${FS}db1/db2/db3/da
+		mv_checkabsent da1/da2/da3/da
+	done
+}
+dir_to_empty_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case dir_to_nonempty_dir cleanup
+dir_to_nonempty_dir_head() {
+	atf_set "descr" "Move directory to existing non-empty directory"
+	atf_set "require.user" "root"
+}
+dir_to_nonempty_dir_body() {
+	mv_setup
+	for FS in "" "fs/" ; do
+		mv_makedir da1/da2/da3/da
+		atf_check mkdir -p ${FS}db1/db2/db3/da/full
+		# Should fail (per the semantics of rename(2))
+		atf_check -s not-exit:0 -e match:"Directory not empty" \
+		      mv da1/da2/da3/da ${FS}db1/db2/db3
+		mv_checkdir da da1/da2/da3/da
+	done
+}
+dir_to_nonempty_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case dir_to_file cleanup
+dir_to_file_head() {
+	atf_set "descr" "Move directory to existing file"
+	atf_set "require.user" "root"
+}
+dir_to_file_body() {
+	mv_setup
+	for FS in "" "fs/" ; do
+		mv_makedir da1/da2/da3/da
+		atf_check mkdir -p ${FS}db1/db2/db3
+		:> ${FS}db1/db2/db3/da
+		# Should fail per POSIX step 3b:
+		# Destination path is a file not of type directory
+		# and source_file is a file of type directory
+		atf_check -s not-exit:0 -e match:"Not a directory" \
+		      mv da1/da2/da3/da ${FS}db1/db2/db3/da
+		mv_checkdir da da1/da2/da3/da
+	done
+}
+dir_to_file_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case rename_fifo cleanup
+rename_fifo_head() {
+	atf_set "descr" "Rename fifo"
+	atf_set "require.user" "root"
+}
+rename_fifo_body() {
+	mv_setup
+	for FS in "" "fs/" ; do
+		mv_makepipe fa
+		atf_check mv fa ${FS}fb
+		mv_checkpipe fa ${FS}fb
+		mv_checkabsent fa
+	done
+}
+rename_fifo_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case fifo_into_dir cleanup
+fifo_into_dir_head() {
+	atf_set "descr" "Move fifos into directory"
+	atf_set "require.user" "root"
+}
+fifo_into_dir_body() {
+	mv_setup
+	for FS in "" "fs/" ; do
+		mv_makepipe fa
+		mv_makepipe fb
+		atf_check mkdir -p ${FS}1/2/3
+		atf_check mv fa fb ${FS}1/2/3
+		mv_checkpipe fa ${FS}1/2/3/fa
+		mv_checkpipe fb ${FS}1/2/3/fb
+		mv_checkabsent fa
+		mv_checkabsent fb
+	done
+}
+fifo_into_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case fifo_from_dir cleanup
+fifo_from_dir_head() {
+	atf_set "descr" "Move fifo from directory to fifo"
+	atf_set "require.user" "root"
+}
+fifo_from_dir_body() {
+	mv_setup
+	atf_check mkdir -p 1/2/3
+	for FS in "" "fs/" ; do
+		mv_makepipe 1/2/3/fa
+		atf_check mv 1/2/3/fa ${FS}fb
+		mv_checkpipe fa ${FS}fb
+		mv_checkabsent 1/2/3/fa
+	done
+}
+fifo_from_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_test_case fifo_from_dir_into_dir cleanup
+fifo_from_dir_into_dir_head() {
+	atf_set "descr" "Move fifo from directory to directory"
+	atf_set "require.user" "root"
+}
+fifo_from_dir_into_dir_body() {
+	mv_setup
+	atf_check mkdir -p da1/da2/da3
+	for FS in "" "fs/" ; do
+		atf_check mkdir -p ${FS}db1/db2/db3
+		mv_makepipe da1/da2/da3/fa
+		atf_check mv da1/da2/da3/fa ${FS}db1/db2/db3/fb
+		mv_checkpipe fa ${FS}db1/db2/db3/fb
+		mv_checkabsent da1/da2/da3/fa
+	done
+}
+fifo_from_dir_into_dir_cleanup() {
+	mv_cleanup
+}
+
+atf_init_test_cases() {
+	atf_add_test_case rename_file
+	atf_add_test_case file_into_dir
+	atf_add_test_case file_from_dir
+	atf_add_test_case file_from_dir_replace
+	atf_add_test_case file_to_dir
+	atf_add_test_case file_from_rename_dir
+	atf_add_test_case rename_dir
+	atf_add_test_case dir_to_dir
+	atf_add_test_case dir_into_dir
+	atf_add_test_case dir_to_empty_dir
+	atf_add_test_case dir_to_nonempty_dir
+	atf_add_test_case dir_to_file
+	atf_add_test_case rename_fifo
+	atf_add_test_case fifo_into_dir
+	atf_add_test_case fifo_from_dir
+	atf_add_test_case fifo_from_dir_into_dir
+}