Files
capy-bearer/scripts/test_capy_services.sh

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'