git: 2d3cd414d1ce - stable/14 - tools/test/stress2/misc: Add msdosfs tests for surrogate pairs
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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