Source: exfatprogs
Severity: normal
Dear Maintainer,
We want to include exfatprogs in Ubuntu Main and that requires the
package having non-trivial build-time tests and autopkgtests.
The upstream project in GitHub has a test suite for fsck.exfat under
`./tests` but it is currently not included in the dist tarball so I've
had to modify the tarball myself to include those tests.
This might be a maintenance burden because for every new release you'd
have to modify the tarball. We also lose the tarball signing verification...
If you have better ideas on how to pull upstream tests into our build,
please let me know!
I've proposed that upstream includes those tests in the dist tarball:
https://github.com/exfatprogs/exfatprogs/pull/264
Upstream also has a test that verifies creating/mounting an exfat
filesystem and creating files/dirs inside it, that they're running in
GitHub CI: I've duplicated that script under debian/tests to be run as
an autopkgtest. Because this requires root, it is only suitable for an
autopkgtest and not for a build-time test.
Because you're maintaining the package with gbp, I've pushed my gbp
branches to the git repository at
g...@salsa.debian.org:aleasto/exfatprogs.git for you to pull.
You'll also find a debdiff below for convenience:
*** ../exfatprogs_1.2.4+tests-1.debdiff
diff -Nru exfatprogs-1.2.4/debian/changelog
exfatprogs-1.2.4+tests/debian/changelog
--- exfatprogs-1.2.4/debian/changelog 2024-06-17 11:45:31.000000000 +0200
+++ exfatprogs-1.2.4+tests/debian/changelog 2024-07-22
11:46:51.000000000 +0200
@@ -1,3 +1,11 @@
+exfatprogs (1.2.4+tests-1) UNRELEASED; urgency=medium
+
+ * New upstream version 1.2.4+tests
+ * Add upstream tests both as build-time tests and autopkgtests
+ * Add autopkgtest from upstream CI
+
+ -- Alessandro Astone <alessandro.ast...@canonical.com> Mon, 22 Jul
2024 11:46:51 +0200
+
exfatprogs (1.2.4-1) unstable; urgency=medium
* New upstream release.
diff -Nru exfatprogs-1.2.4/debian/rules exfatprogs-1.2.4+tests/debian/rules
--- exfatprogs-1.2.4/debian/rules 2024-06-17 11:44:08.000000000 +0200
+++ exfatprogs-1.2.4+tests/debian/rules 2024-07-22 11:39:57.000000000 +0200
@@ -7,5 +7,10 @@
%:
dh $@
+override_dh_auto_test:
+ dh_auto_test
+ export PATH="$(shell pwd)/fsck:$$PATH"; cd tests; ./test_fsck.sh
+ rm tests/exfat.img
+
override_dh_installchangelogs:
dh_installchangelogs NEWS
diff -Nru exfatprogs-1.2.4/debian/tests/control
exfatprogs-1.2.4+tests/debian/tests/control
--- exfatprogs-1.2.4/debian/tests/control 1970-01-01 01:00:00.000000000
+0100
+++ exfatprogs-1.2.4+tests/debian/tests/control 2024-07-22
11:41:55.000000000 +0200
@@ -0,0 +1,7 @@
+Tests: fsck
+Depends: @
+Restrictions: allow-stderr
+
+Tests: create-files
+Depends: @
+Restrictions: isolation-machine, needs-root
diff -Nru exfatprogs-1.2.4/debian/tests/create-files
exfatprogs-1.2.4+tests/debian/tests/create-files
--- exfatprogs-1.2.4/debian/tests/create-files 1970-01-01
01:00:00.000000000 +0100
+++ exfatprogs-1.2.4+tests/debian/tests/create-files 2024-07-22
11:41:30.000000000 +0200
@@ -0,0 +1,35 @@
+#!/bin/bash
+
+# Original source:
+#
https://github.com/exfatprogs/exfatprogs/blob/1.2.4/.github/workflows/c-cpp.yml#L37
+
+set -e
+
+mkdir "${AUTOPKGTEST_TMP}/mnt"
+truncate -s 10G "${AUTOPKGTEST_TMP}/test.img"
+
+dev=$(losetup --show -f "${AUTOPKGTEST_TMP}/test.img")
+mkfs.exfat ${dev}
+
+mount -t exfat ${dev} "${AUTOPKGTEST_TMP}/mnt"
+cd "${AUTOPKGTEST_TMP}/mnt"
+
+i=1;while [ $i -le 10000 ];do touch file$i;if [ $? != 0 ]; then exit 1;
fi; i=$(($i + 1));done
+sync
+rm -rf *
+
+i=1;while [ $i -le 10000 ];do mkdir dir$i;if [ $? != 0 ]; then exit 1;
fi; i=$(($i + 1));done
+sync
+rm -rf *
+
+i=1;while [ $i -le 10000 ];do touch file$i;if [ $? != 0 ]; then exit 1;
fi; i=$(($i + 1));done
+i=1;while [ $i -le 10000 ];do mkdir dir$i;if [ $? != 0 ]; then exit 1;
fi; i=$(($i + 1));done
+sync
+
+fsck.exfat ${dev}
+find . -delete
+fsck.exfat ${dev}
+
+cd -
+umount ${dev}
+losetup -d ${dev}
diff -Nru exfatprogs-1.2.4/debian/tests/fsck
exfatprogs-1.2.4+tests/debian/tests/fsck
--- exfatprogs-1.2.4/debian/tests/fsck 1970-01-01 01:00:00.000000000 +0100
+++ exfatprogs-1.2.4+tests/debian/tests/fsck 2024-07-22
11:39:57.000000000 +0200
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+set -e
+
+export TESTDIR="${AUTOPKGTEST_TMP}/fsck_tests"
+
+cp -r ./tests "$TESTDIR"
+cd "$TESTDIR"
+
+./test_fsck.sh
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/2tb_disk/exfat.img.tar.xz and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/2tb_disk/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/bad_bitmap/exfat.img.tar.xz and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/bad_bitmap/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/bad_dentries/exfat.img.tar.xz and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/bad_dentries/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/bad_dentries2/exfat.img.tar.xz
and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/bad_dentries2/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/bad_file_size/exfat.img.tar.xz
and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/bad_file_size/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/bad_first_clu/exfat.img.tar.xz
and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/bad_first_clu/exfat.img.tar.xz
differ
diff -Nru exfatprogs-1.2.4/tests/bad_num_chain/config
exfatprogs-1.2.4+tests/tests/bad_num_chain/config
--- exfatprogs-1.2.4/tests/bad_num_chain/config 1970-01-01
01:00:00.000000000 +0100
+++ exfatprogs-1.2.4+tests/tests/bad_num_chain/config 2024-07-19
17:52:13.000000000 +0200
@@ -0,0 +1 @@
+#OPTS: -s
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/bad_num_chain/exfat.img.tar.xz
and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/bad_num_chain/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/bad_root/exfat.img.tar.xz and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/bad_root/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/bs_bad_csum/exfat.img.tar.xz and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/bs_bad_csum/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/de_bad_csum/exfat.img.tar.xz and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/de_bad_csum/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/duplicate_clu/exfat.img.tar.xz
and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/duplicate_clu/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/duplicated_name/exfat.img.tar.xz
and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/duplicated_name/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/file_invalid_clus/exfat.img.tar.xz
and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/file_invalid_clus/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/large_file_invalid_clus/exfat.img.tar.xz
and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/large_file_invalid_clus/exfat.img.tar.xz
differ
diff -Nru exfatprogs-1.2.4/tests/loop_chain/config
exfatprogs-1.2.4+tests/tests/loop_chain/config
--- exfatprogs-1.2.4/tests/loop_chain/config 1970-01-01
01:00:00.000000000 +0100
+++ exfatprogs-1.2.4+tests/tests/loop_chain/config 2024-07-19
17:52:13.000000000 +0200
@@ -0,0 +1 @@
+#OPTS: -s
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/loop_chain/exfat.img.tar.xz and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/loop_chain/exfat.img.tar.xz
differ
Binary files
/tmp/PwXOhicayr/exfatprogs-1.2.4/tests/rename_dot_entry/exfat.img.tar.xz
and
/tmp/oXgAbPLX4n/exfatprogs-1.2.4+tests/tests/rename_dot_entry/exfat.img.tar.xz
differ
diff -Nru exfatprogs-1.2.4/tests/test_fsck.sh
exfatprogs-1.2.4+tests/tests/test_fsck.sh
--- exfatprogs-1.2.4/tests/test_fsck.sh 1970-01-01 01:00:00.000000000 +0100
+++ exfatprogs-1.2.4+tests/tests/test_fsck.sh 2024-07-19
17:52:13.000000000 +0200
@@ -0,0 +1,88 @@
+#!/usr/bin/env bash
+
+TESTCASE_DIR=$1
+NEED_LOOPDEV=$2
+IMAGE_FILE=exfat.img
+FSCK_PROG=fsck.exfat
+FSCK_PROG_2=fsck.exfat
+FSCK_OPTS="-y -s"
+PASS_COUNT=0
+
+cleanup() {
+ echo ""
+ echo "Passed ${PASS_COUNT} of ${TEST_COUNT}"
+ if [ ${PASS_COUNT} -ne ${TEST_COUNT} ]; then
+ exit 1
+ else
+ exit 0
+ fi
+}
+
+if [ $# -eq 0 ]; then
+ TESTCASE_DIRS=$(find . -mindepth 1 -maxdepth 1 -type d)
+ TEST_COUNT=$(find . -mindepth 1 -maxdepth 1 -type d | wc -l)
+else
+ TESTCASE_DIRS=$@
+ TEST_COUNT=$#
+fi
+
+for TESTCASE_DIR in $TESTCASE_DIRS; do
+ if [ ! -e "${TESTCASE_DIR}/${IMAGE_FILE}.tar.xz" ]; then
+ TEST_COUNT=$((TEST_COUNT - 1))
+ continue
+ fi
+
+ echo "Running ${TESTCASE_DIR}"
+ echo "-----------------------------------"
+
+ # Set up image file as loop device
+ tar -C . -xf "${TESTCASE_DIR}/${IMAGE_FILE}.tar.xz"
+ if [ $NEED_LOOPDEV ]; then
+ DEV_FILE=$(losetup -f "${IMAGE_FILE}" --show)
+ else
+ DEV_FILE=$IMAGE_FILE
+ fi
+
+ # Run fsck to detect corruptions
+ $FSCK_PROG "$DEV_FILE" | grep -q "ERROR:\|corrupted"
+ if [ $? -ne 0 ]; then
+ echo ""
+ echo "Failed to detect corruption for ${TESTCASE_DIR}"
+ if [ $NEED_LOOPDEV ]; then
+ losetup -d "${DEV_FILE}"
+ fi
+ cleanup
+ fi
+
+ # Run fsck for repair
+ $FSCK_PROG $FSCK_OPTS "$DEV_FILE"
+ if [ $? -ne 1 ] && [ $? -ne 0 ]; then
+ echo ""
+ echo "Failed to repair ${TESTCASE_DIR}"
+ if [ $NEED_LOOPDEV ]; then
+ losetup -d "${DEV_FILE}"
+ fi
+ cleanup
+ fi
+
+ echo ""
+ # Run fsck again
+ $FSCK_PROG_2 "$DEV_FILE"
+ if [ $? -ne 0 ]; then
+ echo ""
+ echo "Failed, corrupted ${TESTCASE_DIR}"
+ if [ $NEED_LOOPDEV ]; then
+ losetup -d "${DEV_FILE}"
+ fi
+ cleanup
+ fi
+
+ echo ""
+ echo "Passed ${TESTCASE_DIR}"
+ PASS_COUNT=$((PASS_COUNT + 1))
+
+ if [ $NEED_LOOPDEV ]; then
+ losetup -d "${DEV_FILE}"
+ fi
+done
+cleanup
-- System Information:
Debian Release: trixie/sid
APT prefers noble-updates
APT policy: (500, 'noble-updates'), (500, 'noble-security'), (500,
'noble'), (100, 'noble-proposed'), (100, 'noble-backports')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 6.8.0-40-generic (SMP w/16 CPU threads; PREEMPT)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE
not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled