git: 2d3cd414d1ce - stable/14 - tools/test/stress2/misc: Add msdosfs tests for surrogate pairs

From: Stefan Eßer <se_at_FreeBSD.org>
Date: Tue, 16 Jun 2026 11:00:51 UTC
The branch stable/14 has been updated by se:

URL: https://cgit.FreeBSD.org/src/commit/?id=2d3cd414d1cef4d8b33bc257cd803069805fb359

commit 2d3cd414d1cef4d8b33bc257cd803069805fb359
Author:     Stefan Eßer <se@FreeBSD.org>
AuthorDate: 2026-05-29 15:52:05 +0000
Commit:     Stefan Eßer <se@FreeBSD.org>
CommitDate: 2026-06-16 10:59:36 +0000

    tools/test/stress2/misc: Add msdosfs tests for surrogate pairs
    
    Test msdos22.sh creates 1000 files with long random names consisting
    of only ASCII characters. The mount is performed without -L option,
    therefore no use of iconv to convert between character sets.
    
    Test msdos23.sh mixes some non-ASCII characters into the file names.
    The file system is therefore mounted with -L C.UTF-8 to include tests
    of the conversions between UTF-8 and UTF-16.
    
    Test msdos24.sh adds emojis to the names to test the (not yet
    committed) support of UTF-16 surrogate pairs in filenames.
    
    (cherry picked from commit aa029088ec130d71b406c4118346fbd933940826)
    (cherry picked from commit 11f23d7c078b319285727d277f05b6962280bcce)
    (cherry picked from commit 596dadbbb5a711477f811fed65a6c463801d16c5)
    (cherry picked from commit 3260c42c4183ac817cf08fcaa236d4d21b4fc0d2)
---
 tools/test/stress2/misc/msdos22.sh | 77 ++++++++++++++++++++++++++++++++++
 tools/test/stress2/misc/msdos23.sh | 77 ++++++++++++++++++++++++++++++++++
 tools/test/stress2/misc/msdos24.sh | 86 ++++++++++++++++++++++++++++++++++++++
 3 files changed, 240 insertions(+)

diff --git a/tools/test/stress2/misc/msdos22.sh b/tools/test/stress2/misc/msdos22.sh
new file mode 100755
index 000000000000..f3a2110f13f1
--- /dev/null
+++ b/tools/test/stress2/misc/msdos22.sh
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+# Test file operations using long random file names consisting only of ASCII characters
+
+MDUNIT=10
+FS=/mnt
+LOCALE=C
+FILES=1000
+
+export LANG=$LOCALE
+
+randomfilename () {
+	name=""
+	count=$(jot -r 1 10 3)
+	for r in $(jot -r $count 7 0); do
+		r=$(( r + 0 ))
+		c='_'
+		if [ $r -gt 0 ]; then
+			for i in $(jot $r); do
+				name="$name$i"
+			done
+		fi
+		count=$(( count - 1 ))
+		if [ "$count" -gt 0 ]; then
+			name="$name$c"
+		fi
+	done
+	echo "$name"
+}
+
+(
+	set -e
+
+	mdconfig -u $MDUNIT -t malloc -s 512m
+	newfs_msdos -c 8 -F 32 /dev/md$MDUNIT > /dev/null 2>&1
+	mkdir -p $FS
+	mount_msdosfs /dev/md$MDUNIT $FS
+
+	mkdir -p $FS/test
+	cd $FS/test
+
+	for i in $(jot $FILES); do
+		testfiles="$testfiles
+$(randomfilename)"
+	done
+
+	testfiles=$(echo "$testfiles" | grep "." | sort -R | uniq)
+
+	for f in $testfiles; do
+		echo "$f" > $f
+	done
+	for f in $(echo "$testfiles" | sort -R); do
+		cp $f $f.tmp
+	done
+	for f in $(echo "$testfiles" | sort -R); do
+		mv $f.tmp $f
+	done
+	for f in $(echo "$testfiles" | sort -R); do
+		rm $f
+	done
+)
+
+failed=$?
+
+cd
+
+[ "$failed" -ne 0 ] && ls $FS/test
+
+umount /dev/md$MDUNIT
+
+#[ "$failed" -ne 0 ] && hd /dev/md$MDUNIT > /tmp/msdos22.dump
+
+fsck_msdosfs -y /dev/md$MDUNIT
+
+mdconfig -d -u $MDUNIT 2>/dev/null
+
+exit $failed
diff --git a/tools/test/stress2/misc/msdos23.sh b/tools/test/stress2/misc/msdos23.sh
new file mode 100755
index 000000000000..fcaa90917235
--- /dev/null
+++ b/tools/test/stress2/misc/msdos23.sh
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+# Test file operations using random file names containing non-ASCII characters
+
+MDUNIT=10
+FS=/mnt
+LOCALE=C.UTF-8
+FILES=1000
+
+export LANG=$LOCALE
+
+randomfilename () {
+	name=""
+	count=$(jot -r 1 10 3)
+	for r in $(jot -r $count 7 0); do
+		r=$(( r + 0 ))
+		c='·'
+		if [ $r -gt 0 ]; then
+			for i in $(jot $r); do
+				name="$name$i"
+			done
+		fi
+		count=$(( count - 1 ))
+		if [ "$count" -gt 0 ]; then
+			name="$name$c"
+		fi
+	done
+	echo "$name"
+}
+
+(
+	set -e
+
+	mdconfig -u $MDUNIT -t malloc -s 512m
+	newfs_msdos -c 8 -F 32 /dev/md$MDUNIT > /dev/null 2>&1
+	mkdir -p $FS
+	mount_msdosfs -L $LOCALE /dev/md$MDUNIT $FS
+
+	mkdir -p $FS/test
+	cd $FS/test
+
+	for i in $(jot $FILES); do
+		testfiles="$testfiles
+$(randomfilename)"
+	done
+
+	testfiles=$(echo "$testfiles" | grep "." | sort -R | uniq)
+
+	for f in $testfiles; do
+		echo "$f" > $f
+	done
+	for f in $(echo "$testfiles" | sort -R); do
+		cp $f $f.tmp
+	done
+	for f in $(echo "$testfiles" | sort -R); do
+		mv $f.tmp $f
+	done
+	for f in $(echo "$testfiles" | sort -R); do
+		rm $f
+	done
+)
+
+failed=$?
+
+cd
+
+[ "$failed" -ne 0 ] && ls $FS/test
+
+umount /dev/md$MDUNIT
+
+#[ "$failed" -ne 0 ] && hd /dev/md$MDUNIT > /tmp/msdos23.dump
+
+fsck_msdosfs -y /dev/md$MDUNIT
+
+mdconfig -d -u $MDUNIT 2>/dev/null
+
+exit $failed
diff --git a/tools/test/stress2/misc/msdos24.sh b/tools/test/stress2/misc/msdos24.sh
new file mode 100755
index 000000000000..d16a869d3eea
--- /dev/null
+++ b/tools/test/stress2/misc/msdos24.sh
@@ -0,0 +1,86 @@
+#!/bin/sh
+
+# Test file operations using long random file names containing UTF-16 surrogate pairs
+
+MDUNIT=10
+FS=/mnt
+LOCALE=C.UTF-8
+FILES=1000
+
+export LANG=$LOCALE
+
+randomfilename () {
+	name=""
+	count=$(jot -r 1 10 3)
+	for r in $(jot -r $count 7 0); do
+		r=$(( r + 0 ))
+		case $(jot -r 1 3 1) in
+		1)
+			emoji="\0360\0237\0230\020$r"
+			c=$(echo -e $emoji)
+			;;
+		*)
+			food="\0360\0237\0245\022$r"
+			c=$(echo -e $food)
+			;;
+		esac
+		if [ $r -gt 0 ]; then
+			for i in $(jot $r); do
+				name="$name$i"
+			done
+		fi
+		count=$(( count - 1 ))
+		if [ "$count" -gt 0 ]; then
+			name="$name$c"
+		fi
+	done
+	echo "$name"
+}
+
+(
+	set -e
+
+	mdconfig -u $MDUNIT -t malloc -s 512m
+	newfs_msdos -c 8 -F 32 /dev/md$MDUNIT > /dev/null 2>&1
+	mkdir -p $FS
+	mount_msdosfs -L $LOCALE /dev/md$MDUNIT $FS
+
+	mkdir -p $FS/test
+	cd $FS/test
+
+	for i in $(jot $FILES); do
+		testfiles="$testfiles
+$(randomfilename)"
+	done
+
+	testfiles=$(echo "$testfiles" | grep "." | sort -R | uniq)
+
+	for f in $testfiles; do
+		echo "$f" > $f
+	done
+	for f in $(echo "$testfiles" | sort -R); do
+		cp $f $f.tmp
+	done
+	for f in $(echo "$testfiles" | sort -R); do
+		mv $f.tmp $f
+	done
+	for f in $(echo "$testfiles" | sort -R); do
+		rm $f
+	done
+)
+
+failed=$?
+
+cd
+
+[ "$failed" -ne 0 ] && ls $FS/test
+
+umount /dev/md$MDUNIT
+
+#[ "$failed" -ne 0 ] && hd /dev/md$MDUNIT > /tmp/msdos24.dump
+
+fsck_msdosfs -y /dev/md$MDUNIT
+
+mdconfig -d -u $MDUNIT 2>/dev/null
+
+exit $failed