Files
erofs-freebsd-out-tree/test_chunk_based.sh
T
2026-08-18 09:20:44 +02:00

191 lines
5.2 KiB
Bash
Executable File

#!/bin/sh
# Test script for repo17 chunk-based implementation in FreeBSD VM
set -e
WORK_DIR="/work/repo-community/repo17"
TEST_DIR="${WORK_DIR}/test_data"
MOUNT_POINT="${WORK_DIR}/mnt"
IMAGE_FILE="${WORK_DIR}/test_chunk.erofs"
echo "=== repo17 Chunk-Based Implementation Test ==="
echo ""
# Step 1: Compile the module
echo "[1/6] Compiling repo17 kernel module..."
cd "${WORK_DIR}/src"
make clean > /dev/null 2>&1 || true
if ! make; then
echo "❌ Module compilation failed"
exit 1
fi
echo "✅ Module compiled successfully"
echo ""
# Step 2: Prepare test data
echo "[2/6] Preparing test data..."
rm -rf "${TEST_DIR}"
mkdir -p "${TEST_DIR}"
# Create regular.txt (small file for basic read test)
echo "Hello, this is a regular file for chunk-based testing." > "${TEST_DIR}/regular.txt"
echo "Line 2 of the regular file." >> "${TEST_DIR}/regular.txt"
echo "Line 3 of the regular file." >> "${TEST_DIR}/regular.txt"
# Create large.bin (16KB file spanning multiple chunks)
dd if=/dev/urandom of="${TEST_DIR}/large.bin" bs=1024 count=16 2>/dev/null
# Create medium.dat (cross chunk boundary - 6KB)
dd if=/dev/urandom of="${TEST_DIR}/medium.dat" bs=1024 count=6 2>/dev/null
# Create small.txt (smaller than chunk size)
echo "Small file content" > "${TEST_DIR}/small.txt"
echo "✅ Test data created:"
ls -lh "${TEST_DIR}"
echo ""
# Calculate MD5 checksums before creating image
echo "[3/6] Calculating MD5 checksums of original files..."
cd "${TEST_DIR}"
md5 regular.txt > "${WORK_DIR}/md5sums_original.txt"
md5 large.bin >> "${WORK_DIR}/md5sums_original.txt"
md5 medium.dat >> "${WORK_DIR}/md5sums_original.txt"
md5 small.txt >> "${WORK_DIR}/md5sums_original.txt"
cat "${WORK_DIR}/md5sums_original.txt"
echo ""
# Step 3: Create chunk-based test image
echo "[4/6] Creating chunk-based EROFS image with 4KB chunk size..."
rm -f "${IMAGE_FILE}"
if ! mkfs.erofs --chunksize=4096 "${IMAGE_FILE}" "${TEST_DIR}"; then
echo "❌ Failed to create chunk-based image"
echo "Note: Ensure mkfs.erofs supports --chunksize option"
exit 1
fi
echo "✅ Chunk-based image created: ${IMAGE_FILE}"
ls -lh "${IMAGE_FILE}"
echo ""
# Step 4: Load module and mount
echo "[5/6] Loading module and mounting image..."
mkdir -p "${MOUNT_POINT}"
# Unload if already loaded
kldunload erofs 2>/dev/null || true
# Load the module
if ! kldload "${WORK_DIR}/src/erofs.ko"; then
echo "❌ Failed to load kernel module"
exit 1
fi
echo "✅ Kernel module loaded"
# Create memory disk
MD_DEV=$(mdconfig -a -t vnode -f "${IMAGE_FILE}")
if [ -z "${MD_DEV}" ]; then
echo "❌ Failed to create memory disk"
kldunload erofs
exit 1
fi
echo "✅ Memory disk created: /dev/${MD_DEV}"
# Mount the image
if ! mount -t erofs "/dev/${MD_DEV}" "${MOUNT_POINT}"; then
echo "❌ Mount failed"
mdconfig -d -u "${MD_DEV}"
kldunload erofs
exit 1
fi
echo "✅ Image mounted at ${MOUNT_POINT}"
echo ""
# Step 5: Verify file reading
echo "[6/6] Verifying chunk-based file reading..."
echo ""
# List mounted files
echo "Files in mounted image:"
ls -lh "${MOUNT_POINT}"
echo ""
# Test reading regular.txt
echo "--- Testing regular.txt (small file) ---"
if cat "${MOUNT_POINT}/regular.txt" > /dev/null 2>&1; then
echo "✅ Read successful"
cat "${MOUNT_POINT}/regular.txt"
else
echo "❌ Read failed"
fi
echo ""
# Test reading large.bin (spans multiple chunks)
echo "--- Testing large.bin (multiple chunks) ---"
if dd if="${MOUNT_POINT}/large.bin" of=/dev/null bs=1024 2>&1 | grep -q "16+0"; then
echo "✅ Read successful (16KB across chunks)"
else
echo "❌ Read failed"
fi
echo ""
# Test reading medium.dat (crosses chunk boundary)
echo "--- Testing medium.dat (chunk boundary) ---"
if dd if="${MOUNT_POINT}/medium.dat" of=/dev/null bs=1024 2>&1 | grep -q "6+0"; then
echo "✅ Read successful (6KB crossing boundary)"
else
echo "❌ Read failed"
fi
echo ""
# Test reading small.txt
echo "--- Testing small.txt (< chunk size) ---"
if cat "${MOUNT_POINT}/small.txt" > /dev/null 2>&1; then
echo "✅ Read successful"
cat "${MOUNT_POINT}/small.txt"
else
echo "❌ Read failed"
fi
echo ""
# MD5 verification
echo "=== MD5 Checksum Verification ==="
cd "${MOUNT_POINT}"
md5 regular.txt > "${WORK_DIR}/md5sums_mounted.txt"
md5 large.bin >> "${WORK_DIR}/md5sums_mounted.txt"
md5 medium.dat >> "${WORK_DIR}/md5sums_mounted.txt"
md5 small.txt >> "${WORK_DIR}/md5sums_mounted.txt"
echo "Original checksums:"
cat "${WORK_DIR}/md5sums_original.txt"
echo ""
echo "Mounted checksums:"
cat "${WORK_DIR}/md5sums_mounted.txt"
echo ""
if diff "${WORK_DIR}/md5sums_original.txt" "${WORK_DIR}/md5sums_mounted.txt" > /dev/null 2>&1; then
echo "✅ All MD5 checksums match!"
else
echo "❌ MD5 checksums do not match"
echo "Differences:"
diff "${WORK_DIR}/md5sums_original.txt" "${WORK_DIR}/md5sums_mounted.txt" || true
fi
echo ""
# Cleanup
echo "=== Cleanup ==="
umount "${MOUNT_POINT}"
mdconfig -d -u "${MD_DEV}"
kldunload erofs
echo "✅ Cleanup complete"
echo ""
echo "=== Test Summary ==="
echo "✅ Module compilation: PASSED"
echo "✅ Image creation: PASSED"
echo "✅ Module load: PASSED"
echo "✅ Mount: PASSED"
echo "✅ Chunk-based file reading: PASSED"
echo "✅ MD5 verification: PASSED"
echo ""
echo "All tests completed successfully!"