testsAndMisc/meta/scripts/fixtures/dropped_write_before.sh
Krzysztof kuhy Rudnicki f6356d4725
Some checks are pending
Pre-commit checks / pre-commit (push) Waiting to run
Shell tests / shell-tests (push) Waiting to run
Shell tests / arch-tests (push) Waiting to run
Trace scripts that place files, via a prefix redirect
Shell redirections are builtins, so no PATH stub can intercept
`cat > /etc/modprobe.d/x.conf`. That left installer scripts unverifiable:
stub cp/chmod/ln and the trace is nearly empty, don't and the run rewrites
the live system.

--prefix redirects HOME and every XDG_* base into a temp tree. XDG_DATA_HOME
is exported explicitly, not left to default off HOME: install_leechblock.sh
reads it directly and then runs `rsync -a --delete` at it.

--bind-abs binds hardcoded absolutes via bwrap --unshare-user --uid 0, leaf
directories only. uid 0 is load-bearing beyond permissions: common.sh's
require_root does `exec sudo "$0"`, and under the sudo stub that truncated
the whole run to one recorded call -- a trace that diffs clean against any
split. Binding /etc wholesale was measured to shadow /etc/passwd, collapse
$SUDO_USER to /home//, and mask a nested bind, so the scanner never emits it.

The trace gains a manifest of every file written, with content hashes. That
section is the point: with it, a dropped write in the fixture pair is a
one-line diff; with it stripped, the two traces are identical, i.e. the old
harness passed that broken split. Hashes normalize the prefix to @PREFIX@
because install_usage_monitoring.sh writes an unquoted heredoc that bakes
$HOME into the artifact.

Verified: ~/.config/systemd/user, ~/.local/bin, ~/.local/share and
/etc/modprobe.d byte-identical before and after; usage-report units still 2.
The three prior regressions are now committed fixtures rather than ad-hoc --
one was silently neutered mid-change when a trailing echo added for SC2034
became the function's last statement and turned exit 1 into exit 0.

Stub generation moved to lib/ because --prefix pushed the harness to 252
lines, over the cap it exists to serve.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011w2Pj4Ek3ZNMQVYcFHgXDY
2026-08-16 23:31:49 +02:00

40 lines
945 B
Bash
Executable File

#!/usr/bin/env bash
# Fixture: the pre-split installer. Places three files under $HOME.
#
# Its partner, dropped_write_after.sh, is the "split" version that silently
# loses one of them -- the exact failure --prefix exists to catch. Without the
# manifest section, a dropped `cat >` shows up as NOTHING at all: same exit
# status, same stubbed calls, same stdout. The traces match and the bug ships.
set -euo pipefail
bin_dir="$HOME/.local/bin"
unit_dir="$HOME/.config/systemd/user"
mkdir -p "$bin_dir" "$unit_dir"
cat >"$bin_dir/demo-agent.sh" <<'SCRIPT'
#!/usr/bin/env bash
echo "demo agent running"
SCRIPT
chmod +x "$bin_dir/demo-agent.sh"
cat >"$unit_dir/demo-agent.service" <<'UNIT'
[Unit]
Description=Demo agent
[Service]
ExecStart=%h/.local/bin/demo-agent.sh
UNIT
cat >"$unit_dir/demo-agent.timer" <<'UNIT'
[Unit]
Description=Demo agent timer
[Timer]
OnCalendar=hourly
UNIT
systemctl --user daemon-reload
echo "install complete"