test: make Windows Unicode gate byte-exact

This commit is contained in:
Cristian Cezar Moisés 2026-08-31 21:25:10 -03:00
commit 6fd78e0515
2 changed files with 24 additions and 7 deletions

View file

@ -86,20 +86,33 @@ jobs:
trap 'chmod -R u+rwX "$test_root" 2>/dev/null || true; rm -rf -- "$test_root"' EXIT trap 'chmod -R u+rwX "$test_root" 2>/dev/null || true; rm -rf -- "$test_root"' EXIT
output_dir="$test_root/saída-安全" output_dir="$test_root/saída-安全"
archive="$test_root/cópia-安全.zupt" archive="$test_root/cópia-安全.zupt"
emoji_name=$'emoji-\xF0\x9F\x98\x80.bin'
mkdir -p "$test_root/input/subdir" "$output_dir" mkdir -p "$test_root/input/subdir" "$output_dir"
printf 'Windows release smoke test\n' > "$test_root/input/café.txt" printf 'Windows release smoke test\n' > "$test_root/input/café.txt"
printf 'UTF-8: café-安全\n' > "$test_root/input/subdir/ação-安全.txt" printf 'UTF-8: café-安全\n' > "$test_root/input/subdir/ação-安全.txt"
printf 'emoji filename\n' > "$test_root/input/subdir/emoji-😀.bin" printf 'emoji filename\n' > "$test_root/input/subdir/$emoji_name"
: > "$test_root/input/empty" : > "$test_root/input/empty"
dd if=/dev/urandom of="$test_root/input/subdir/random.bin" bs=4096 count=4 2>/dev/null dd if=/dev/urandom of="$test_root/input/subdir/random.bin" bs=4096 count=4 2>/dev/null
(cd "$test_root" && "$exe" compress "$archive" input) (cd "$test_root" && "$exe" compress "$archive" input)
"$exe" test "$archive" "$exe" test "$archive"
"$exe" list "$archive" > "$test_root/list.txt" 2>&1 "$exe" list "$archive" > "$test_root/list.txt" 2>&1
grep -F 'café.txt' "$test_root/list.txt"
grep -F 'ação-安全.txt' "$test_root/list.txt"
grep -F 'emoji-😀.bin' "$test_root/list.txt"
"$exe" extract -o "$output_dir" "$archive" "$exe" extract -o "$output_dir" "$archive"
diff -r "$test_root/input" "$output_dir/input" diff -r "$test_root/input" "$output_dir/input"
python3 - "$test_root/list.txt" <<'PY'
import pathlib
import sys
listing = pathlib.Path(sys.argv[1]).read_bytes()
expected = {
"Latin-1": bytes.fromhex("636166c3a92e747874"),
"BMP": bytes.fromhex("61c3a7c3a36f2de5ae89e585a82e747874"),
"non-BMP": bytes.fromhex("656d6f6a692df09f98802e62696e"),
}
missing = [label for label, name in expected.items() if name not in listing]
if missing:
raise SystemExit("list output is missing exact UTF-8 names: " +
", ".join(missing))
PY
objdump -p "$exe" > "$test_root/imports.txt" objdump -p "$exe" > "$test_root/imports.txt"
if grep -Eqi '(vendor[/\\]|libvuptsdk|libpqvaptvupt|libgcc_s|libstdc\+\+|libwinpthread|msys-2[.]0|cygwin1)[^[:space:]]*[.]dll' \ if grep -Eqi '(vendor[/\\]|libvuptsdk|libpqvaptvupt|libgcc_s|libstdc\+\+|libwinpthread|msys-2[.]0|cygwin1)[^[:space:]]*[.]dll' \
"$test_root/imports.txt"; then "$test_root/imports.txt"; then

View file

@ -248,13 +248,17 @@ else
fail 'backslash separators are normalized within the extraction root' fail 'backslash separators are normalized within the extraction root'
fi fi
legitimate_entry_hex=73616665206469722f61c3a7c3a36f2e747874 legitimate_entry_hex=73616665206469722f61c3a7c3a36f2df09f98802e747874
MSYS2_ARG_CONV_EXCL='--entry-hex=' \ MSYS2_ARG_CONV_EXCL='--entry-hex=' \
"$FIXTURE" "$TEST_ROOT/legitimate.zupt" \ "$FIXTURE" "$TEST_ROOT/legitimate.zupt" \
"--entry-hex=$legitimate_entry_hex" "--entry-hex=$legitimate_entry_hex"
mkdir "$TEST_ROOT/legitimate-out" mkdir "$TEST_ROOT/legitimate-out"
if file_contains_hex_bytes "$TEST_ROOT/legitimate.zupt" \ if file_contains_hex_bytes "$TEST_ROOT/legitimate.zupt" \
"$legitimate_entry_hex" && "$legitimate_entry_hex" &&
"$ZUPT_BIN" list "$TEST_ROOT/legitimate.zupt" \
> "$TEST_ROOT/legitimate-list.log" 2>&1 &&
file_contains_hex_bytes "$TEST_ROOT/legitimate-list.log" \
"$legitimate_entry_hex" &&
"$ZUPT_BIN" extract -o "$TEST_ROOT/legitimate-out" \ "$ZUPT_BIN" extract -o "$TEST_ROOT/legitimate-out" \
"$TEST_ROOT/legitimate.zupt" > "$TEST_ROOT/legitimate.log" 2>&1 && "$TEST_ROOT/legitimate.zupt" > "$TEST_ROOT/legitimate.log" 2>&1 &&
python3 - "$TEST_ROOT/legitimate-out" "$legitimate_entry_hex" <<'PY' python3 - "$TEST_ROOT/legitimate-out" "$legitimate_entry_hex" <<'PY'
@ -268,9 +272,9 @@ extracted = pathlib.Path(sys.argv[1]).joinpath(*relative_path.split("/"))
raise SystemExit(0 if extracted.read_bytes() == b"fixture content\n" else 1) raise SystemExit(0 if extracted.read_bytes() == b"fixture content\n" else 1)
PY PY
then then
pass 'safe nested UTF-8 path extracts normally' pass 'safe nested BMP and non-BMP UTF-8 path lists and extracts normally'
else else
fail 'safe nested UTF-8 path extracts normally' fail 'safe nested BMP and non-BMP UTF-8 path lists and extracts normally'
fi fi
mkdir -p "$TEST_ROOT/relative-root/work" mkdir -p "$TEST_ROOT/relative-root/work"