Private
Public Access
91 lines
3.3 KiB
Bash
91 lines
3.3 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
cd "$(dirname "$0")/.."
|
|
site_directory=${BEARER_TEST_SITE_DIRECTORY:-site}
|
|
if [[ -z ${BEARER_TEST_SITE_DIRECTORY:-} && -r /etc/bearer/settings.cfg ]]; then
|
|
configured_site=$(awk -F= '/^[[:space:]]*HTTP_DOCUMENT_ROOT[[:space:]]*=/ {sub(/^[^=]*=/, ""); print; exit}' /etc/bearer/settings.cfg)
|
|
site_directory=${configured_site:-$site_directory}
|
|
fi
|
|
site_directory=$(realpath "$site_directory")
|
|
fixture=$(mktemp -d "$site_directory/tests/capy-services-slice.XXXXXX")
|
|
for ((candidate=0; candidate<256; ++candidate)); do
|
|
unit="/tests/${fixture##*/}/entry-$candidate.capy"
|
|
digest=$(printf '%s' "$site_directory$unit" | sha256sum | cut -d' ' -f1)
|
|
[[ $digest =~ ^(..)*00 ]] && break
|
|
done
|
|
[[ $digest =~ ^(..)*00 ]] || { rm -rf -- "$fixture"; echo 'No NUL-digest service identity found' >&2; exit 1; }
|
|
cli() { timeout 5 scripts/bearer-cli --get "$unit:$1" "${@:2}"; }
|
|
cleanup() {
|
|
cli STOP >/dev/null 2>&1 || true
|
|
local deadline=$((SECONDS + 4))
|
|
while ((SECONDS < deadline)); do
|
|
if [[ $(cli STATUS 2>/dev/null) == stopped\|false\|* ]]; then
|
|
rm -rf -- "$fixture"
|
|
return
|
|
fi
|
|
sleep 0.05
|
|
done
|
|
printf 'Service cleanup failed. Retained fixture: %s\n' "$fixture" >&2
|
|
return 1
|
|
}
|
|
trap cleanup EXIT
|
|
cp site/tests/capy-services-slice.capy "$fixture/${unit##*/}"
|
|
chmod 755 "$fixture"
|
|
chmod 644 "$fixture/${unit##*/}"
|
|
expect() {
|
|
[[ $2 == "$3" ]] || { printf '%s: expected %q, got %q\n' "$1" "$2" "$3" >&2; exit 1; }
|
|
}
|
|
wait_event() {
|
|
for ((i=0; i<100; ++i)); do
|
|
grep -Fxq "$1" "$fixture/events.log" 2>/dev/null && return
|
|
sleep 0.03
|
|
done
|
|
printf 'Missing service event: %s\n' "$1" >&2
|
|
[[ ! -f $fixture/events.log ]] || head -c 4096 "$fixture/events.log" >&2
|
|
exit 1
|
|
}
|
|
expect invalid 'false|missing' "$(cli INVALID)"
|
|
for mode in every spawn connect listen write close; do
|
|
if output=$(cli TRAP mode="$mode" 2>&1); then
|
|
echo "$mode did not trap outside a service" >&2
|
|
exit 1
|
|
fi
|
|
[[ $output == *'requires a service worker'* && $output == *"${unit##*/}:"* ]]
|
|
done
|
|
expect initial 'stopped|false|false|0|0|false' "$(cli STATUS)"
|
|
expect start true "$(cli START)"
|
|
for ((i=0; i<100; ++i)); do
|
|
status=$(cli STATUS)
|
|
[[ $status == 'running|true|true|0|0|false' ]] && break
|
|
sleep 0.03
|
|
done
|
|
expect running 'running|true|true|0|0|false' "$status"
|
|
wait_event 'START starting'
|
|
wait_event 'WRITE true'
|
|
timeout 2 head -c 1048576 /dev/zero | tr '\0' x >"$fixture/large.txt"
|
|
chmod 644 "$fixture/large.txt"
|
|
expect too-large false "$(cli LARGE)"
|
|
expect send 'true|true' "$(cli SEND)"
|
|
wait_event 'LINE slice-ok running'
|
|
wait_event 'EXIT 1 0 running'
|
|
wait_event 'TICK new 1'
|
|
wait_event 'DELAY delayed running'
|
|
sleep 0.1
|
|
expect tick-count 1 "$(grep -c '^TICK ' "$fixture/events.log")"
|
|
if grep -q '^FAIL ' "$fixture/events.log"; then
|
|
head -c 4096 "$fixture/events.log" >&2
|
|
exit 1
|
|
fi
|
|
line=$(grep -n '^LINE ' "$fixture/events.log" | cut -d: -f1)
|
|
exit_line=$(grep -n '^EXIT ' "$fixture/events.log" | cut -d: -f1)
|
|
((line < exit_line))
|
|
expect stop true "$(cli STOP)"
|
|
wait_event 'STOP stopping'
|
|
for ((i=0; i<100; ++i)); do
|
|
status=$(cli STATUS)
|
|
[[ $status == stopped\|false\|* ]] && break
|
|
sleep 0.03
|
|
done
|
|
expect stopped 'stopped|false|true|0|0|false' "$status"
|
|
echo 'Capy services NUL-digest identity, real cat, DATA framing/EXIT order, status, delay, timer replacement/cancellation, outside-service traps/too_large passed'
|