mirror of
https://github.com/xroche/httrack.git
synced 2026-07-28 19:43:02 +03:00
Under `set -e` a failing command in an EXIT trap becomes the script's exit status, so a hiccup while tearing down fixtures fails a test whose assertions all passed. That is what turned `57_local-proxy-connect.test` red on the Windows x64 leg of #765: five OK lines, no FAIL, exit 1. Every EXIT trap in the suite now runs teardown with errexit off, and the signal traps keep their own `trap` line, since sharing `set +e` with HUP/INT/QUIT/PIPE/TERM would leave errexit off for the rest of a signalled run and let a torn-down test still report success. A `|| true` on the `rm` would have been smaller, but it throws away the only diagnostic, and the evidence does not say which teardown command failed: a blocked `rm -rf` on the Windows runner exits 1 and prints "Device or resource busy", while the log shows exit 1 and nothing at all. The sharing violation in the issue is the plausible mechanism rather than a confirmed one, so whatever it really is now prints its own error. `99_teardown-status.test` pins the semantics both ways and scans the suite so a new test cannot reintroduce the shape, the leaky combined trap included. The `return 0` that three `cleanup()` bodies ended with never protected anything, since errexit fires at the failing command before it is reached. Closes #773 Signed-off-by: Xavier Roche <roche@httrack.com> Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
53 lines
2.1 KiB
Bash
Executable File
53 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# Keep this POSIX-portable: the harness runs it via $(BASH), which is a plain
|
|
# POSIX /bin/sh on some platforms (e.g. macOS), so avoid bashisms and GNU-only
|
|
# tool flags despite the #!/bin/bash above.
|
|
|
|
# Cache create/read/update logic (driven by 'httrack -#test=cache <dir>').
|
|
#
|
|
# The in-process self-test stores several hand-crafted edge entries (normal
|
|
# HTML, an empty redirect with a near-limit location, a non-HTML body kept via
|
|
# all-in-cache, a binary body with embedded NUL/high bytes), a few thousand
|
|
# small entries (index/lookup scale), and a few large compressible and
|
|
# incompressible bodies (zlib deflate/inflate). It reads everything back
|
|
# asserting every header field and the body round-trip byte for byte, then
|
|
# updates one entry and confirms the new value is read back. It exits non-zero
|
|
# on the first mismatch.
|
|
|
|
set -eu
|
|
|
|
dir=$(mktemp -d)
|
|
trap 'set +e; rm -rf "$dir"' EXIT
|
|
|
|
# The working directory is a required argument; without it the test prints a
|
|
# usage line to stderr and returns non-zero.
|
|
out=$(httrack -#test=cache "$dir")
|
|
|
|
# Match the exact success line, so the test cannot pass for an unrelated reason
|
|
# (e.g. the cache test being gone, which prints the registry to stderr but
|
|
# never prints this line).
|
|
test "$out" = "cache-selftest: OK" || {
|
|
echo "expected 'cache-selftest: OK', got: $out" >&2
|
|
exit 1
|
|
}
|
|
|
|
# The self-test must have actually produced a ZIP cache on disk.
|
|
test -e "$dir/hts-cache/new.zip" || {
|
|
echo "no ZIP cache was written by the self-test" >&2
|
|
exit 1
|
|
}
|
|
|
|
# Sanity-check the cache footprint: the few-thousand-entry pass is expected to
|
|
# weigh ~1-2 MB. Fail if it balloons well past that (e.g. a per-entry overhead
|
|
# regression or runaway growth), so the cache size stays bounded.
|
|
# du -sk (1024-byte units) is portable; GNU's -b (apparent bytes) is rejected
|
|
# by BSD/macOS du. Block-allocated size is an upper bound on apparent size,
|
|
# which is all a ceiling check needs.
|
|
ceiling=$((4 * 1024)) # KiB
|
|
kbytes=$(du -sk "$dir/hts-cache" | cut -f1)
|
|
test "$kbytes" -le "$ceiling" || {
|
|
echo "cache footprint ${kbytes} KiB exceeds ${ceiling} KiB ceiling" >&2
|
|
exit 1
|
|
}
|