test: use mire to record some e2e tests for itself

This commit is contained in:
2026-03-25 21:03:13 +00:00
parent 952211ef93
commit 526e31d0b0
21 changed files with 345 additions and 2 deletions
-2
View File
@@ -1,4 +1,2 @@
/build/
/e2e/
/mire.toml
/mire
+5
View File
@@ -0,0 +1,5 @@
mkdir -p /tmp/project
cd /tmp/project
mire init
test -f mire.toml && test -x e2e/shell.sh && echo ok
exit
+8
View File
@@ -0,0 +1,8 @@
[?2004h$ mkdir -p /tmp/project
[?2004l
[?2004h$ cd /tmp/project
[?2004l
[?2004h$ mire init
[?2004l
mire  Done initialising...
[?2004h$ test -f mire.toml && test -x e2e/shell.sh && echo ok
+8
View File
@@ -0,0 +1,8 @@
__MIRE_RUN_WITH_BREAKS___
mire init
mire record suite/spec
echo nope
exit
n
test ! -e e2e/suite/spec/in && test ! -e e2e/suite/spec/out && echo discarded
exit
+13
View File
@@ -0,0 +1,13 @@
[?2004h$ mire init
[?2004l
mire  Done initialising...
[?2004h$ mire record suite/spec
[?2004l
mire  Run commands in the recorder shell, then type exit to finish.
[?2004h$ echo nope
[?2004l
nope
[?2004h$ exit
[?2004l
exit
mire  Save recording? [y/N] n
+7
View File
@@ -0,0 +1,7 @@
__MIRE_RUN_WITH_BREAKS___
mire init
mire record --save suite/spec
echo saved
exit
test -f e2e/suite/spec/in && test -f e2e/suite/spec/out && echo fixtures
exit
+14
View File
@@ -0,0 +1,14 @@
[?2004h$ mire init
[?2004l
mire  Done initialising...
[?2004h$ mire record --save suite/spec
[?2004l
mire  Run commands in the recorder shell, then type exit to finish.
[?2004h$ echo saved
[?2004l
saved
[?2004h$ exit
[?2004l
exit
mire  Verifying recording...
mire  /home/test/e2e/suite/spec
+9
View File
@@ -0,0 +1,9 @@
__MIRE_RUN_WITH_BREAKS___
mire init
mire record --save a
echo rewrite
exit
echo stale > e2e/a/out
mire rewrite
grep rewrite e2e/a/out >/dev/null && echo saw-rewrite
exit
+19
View File
@@ -0,0 +1,19 @@
[?2004h$ mire init
[?2004l
mire  Done initialising...
[?2004h$ mire record --save a
[?2004l
mire  Run commands in the recorder shell, then type exit to finish.
[?2004h$ echo rewrite
[?2004l
rewrite
[?2004h$ exit
[?2004l
exit
mire  Verifying recording...
mire  /home/test/e2e/a
[?2004h$ echo stale > e2e/a/out
[?2004l
[?2004h$ mire rewrite
[?2004l
mire  RUN a
Executable
+96
View File
@@ -0,0 +1,96 @@
#!/bin/sh
set -eu
host_home=${MIRE_HOST_HOME:?}
host_tmp=${MIRE_HOST_TMP:?}
path_env=${MIRE_PATH_ENV:?}
visible_home=${MIRE_HOME:?}
bootstrap_rc="$host_home/.mire-shell-rc"
visible_bootstrap_rc="$visible_home/.mire-shell-rc"
setup_scripts_dir='/tmp/mire-setup-scripts'
visible_bin_dir='/tmp/mire/bin'
cat >"$bootstrap_rc" <<'EOF'
cd "${HOME:?}"
for path in /tmp/mire-setup-scripts/*.sh; do
[ -e "$path" ] || continue
cd "${HOME:?}"
source "$path"
cd "${HOME:?}"
done
if [ "${MIRE_COMPARE_MARKER:-0}" = "1" ]; then
__mire_prompt_ready_original=${PROMPT_COMMAND-}
__mire_prompt_ready() {
printf '__MIRE_PROMPT_READY__\n'
if [ -n "${__mire_prompt_ready_original:-}" ]; then
PROMPT_COMMAND=$__mire_prompt_ready_original
eval "$PROMPT_COMMAND"
else
unset PROMPT_COMMAND
fi
}
PROMPT_COMMAND=__mire_prompt_ready
fi
unset MIRE_COMPARE_MARKER
EOF
# the first ro-bind allows for /usr/bin etc to be mounted and accessible
set -- \
--ro-bind / / \
--tmpfs /home \
--bind "$host_home" "$visible_home" \
--bind "$host_tmp" '/tmp' \
--dev /dev \
--proc /proc \
--unshare-pid \
--die-with-parent \
--setenv HISTFILE '/dev/null' \
--setenv HOME "$visible_home" \
--setenv LANG 'C' \
--setenv LC_ALL 'C' \
--setenv PAGER 'cat' \
--setenv PATH "$visible_bin_dir:$path_env" \
--setenv PS1 '$ ' \
--setenv TERM 'xterm-256color' \
--setenv TMPDIR '/tmp' \
--setenv TZ 'UTC' \
--chdir "$visible_home"
set -- "$@" --dir /tmp/mire --dir "$visible_bin_dir"
if [ -n "${MIRE_SETUP_SCRIPTS:-}" ]; then
i=1
while IFS= read -r host_path || [ -n "$host_path" ]; do
[ -n "$host_path" ] || continue
visible_path=$(printf '%s/%03d.sh' "$setup_scripts_dir" "$i")
set -- "$@" --ro-bind "$host_path" "$visible_path"
i=$((i + 1))
done <<EOF
${MIRE_SETUP_SCRIPTS-}
EOF
fi
if [ -n "${MIRE_MOUNTS:-}" ]; then
while IFS= read -r mount || [ -n "$mount" ]; do
[ -n "$mount" ] || continue
host_path=${mount%%:*}
sandbox_path=${mount#*:}
set -- "$@" --ro-bind "$host_path" "$sandbox_path"
done <<EOF
${MIRE_MOUNTS-}
EOF
fi
if [ -n "${MIRE_PATHS:-}" ]; then
while IFS= read -r host_path || [ -n "$host_path" ]; do
[ -n "$host_path" ] || continue
visible_path=$visible_bin_dir/${host_path##*/}
set -- "$@" --ro-bind "$host_path" "$visible_path"
done <<EOF
${MIRE_PATHS-}
EOF
fi
exec bwrap "$@" bash --noprofile --rcfile "$visible_bootstrap_rc" -i
+2
View File
@@ -0,0 +1,2 @@
mire
exit
+20
View File
@@ -0,0 +1,20 @@
[?2004h$ mire
[?2004l
A lean CLI E2E testing framework.
Usage:
mire [flags]
mire [command]
Available Commands:
help Help about any command
init Initialise mire in the current project
record Record a new CLI scenario
rewrite Refresh recorded CLI output fixtures
test Replay recorded CLI scenarios
Flags:
-h, --help help for mire
Use "mire [command] --help" for more information about a command.
[?2004h$ exit
+10
View File
@@ -0,0 +1,10 @@
__MIRE_RUN_WITH_BREAKS___
mire init
mire record --save a
echo one
exit
mire record --save nested/b
echo two
exit
mire test
exit
+35
View File
@@ -0,0 +1,35 @@
[?2004h$ mire init
[?2004l
mire  Done initialising...
[?2004h$ mire record --save a
[?2004l
mire  Run commands in the recorder shell, then type exit to finish.
[?2004h$ echo one
[?2004l
one
[?2004h$ exit
[?2004l
exit
mire  Verifying recording...
mire  /home/test/e2e/a
[?2004h$ mire record --save nested/b
[?2004l
mire  Run commands in the recorder shell, then type exit to finish.
[?2004h$ echo two
[?2004l
two
[?2004h$ exit
[?2004l
exit
mire  Verifying recording...
mire  /home/test/e2e/nested/b
[?2004h$ mire test
[?2004l
mire  RUN a
mire  PASS a (12 ms)
mire  RUN nested/b
mire  PASS nested/b (12 ms)
mire  Summary: total=2 passed=2 failed=0
[?2004h$ exit
[?2004l
exit
+7
View File
@@ -0,0 +1,7 @@
__MIRE_RUN_WITH_BREAKS___
mire init
mire recoird tsest
echo a
exit
y
exit
+13
View File
@@ -0,0 +1,13 @@
[?2004h$ mire init
[?2004l
mire  Done initialising...
[?2004h$ mire recoi rd ts est
[?2004l
mire  Run commands in the recorder shell, then type exit to finish.
[?2004h$ echo a
[?2004l
a
[?2004h$ exit
[?2004l
exit
mire  Save recording? [y/N] y
+10
View File
@@ -0,0 +1,10 @@
__MIRE_RUN_WITH_BREAKS___
mire init
mire record --save a
echo one
exit
mire record --save nested/b
echo two
exit
mire test nested
exit
+24
View File
@@ -0,0 +1,24 @@
[?2004h$ mire init
[?2004l
mire  Done initialising...
[?2004h$ mire record --save a
[?2004l
mire  Run commands in the recorder shell, then type exit to finish.
[?2004h$ echo one
[?2004l
one
[?2004h$ exit
[?2004l
exit
mire  Verifying recording...
mire  /home/test/e2e/a
[?2004h$ mire record --save nested/b
[?2004l
mire  Run commands in the recorder shell, then type exit to finish.
[?2004h$ echo two
[?2004l
two
[?2004h$ exit
[?2004l
exit
mire  Verifying recording...
+9
View File
@@ -0,0 +1,9 @@
__MIRE_RUN_WITH_BREAKS___
mire init
mkdir -p e2e/suite
echo export FROM_SETUP=from_setup > e2e/suite/setup.sh
mire record --save suite/spec
echo $FROM_SETUP
exit
mire test suite
exit
+18
View File
@@ -0,0 +1,18 @@
[?2004h$ mire init
[?2004l
mire  Done initialising...
[?2004h$ mkdir -p e2e/suite
[?2004l
[?2004h$ echo export FROM_SETUP=from_setup > e2e/suite/setup.sh
[?2004l
[?2004h$ mire record --save suite/spec
[?2004l
mire  Run commands in the recorder shell, then type exit to finish.
[?2004h$ echo $FROM_SETUP
[?2004l
from_setup
[?2004h$ exit
[?2004l
exit
mire  Verifying recording...
mire  /home/test/e2e/suite/spec
+18
View File
@@ -0,0 +1,18 @@
[mire]
# which folder to strore tests in
test_dir = "e2e"
# regexes for differing lines to ignore during replay comparison
ignore_diffs = [
"^.*PASS.*\\([0-9]+ ms\\).*$", # timing diff ms
"^.*PASS.*\\([0-9]+\\.[0-9]{2} s\\).*$", # timing diff s
]
[sandbox]
# home is where mire would drop you by default on record
home = "/home/test"
# read only paths from host, entry looks like "path on host:path on sanbox"
# paths on host are absolute or relative to repo root
mounts = []
# read only host paths to expose on PATH inside the sandbox as /tmp/mire/bin/<basename>
# paths on host can be absolute or relative to repo root
paths = [ "./build/mire" ]