Private
Public Access
Test the service cat slice and use hex digests for state filenames
This commit is contained in:
1 parent
078d54ec2e
commit
8423307a9e
6 files changed
+307
-1
No files matched your search
@@ -188,6 +188,8 @@ e7755838e50bc6c5694efbb9c50c7500c56e4a68d880c5a2117738a55501b20a site_tests_cap
|
||||
05fe02b659796a60e5ad805987c2a84f3b5dc4bafa1c6c11204127898adec6a4 site_tests_capy-services-api.capy.wasm.source-map
|
||||
9458cf9aa5278841cee3646f11d1acc57baad307306b3061bcccb4c00bf3a946 site_tests_capy-services-api-dep.capy.wasm
|
||||
c3fd87156412bcca1629178b52d15a997f3108f479fb11c25ed96e215218b540 site_tests_capy-services-api-dep.capy.wasm.source-map
|
||||
8b1fa9f2856e2d5ccca4702cb75dedbdf66f6f5c6908ea5aeae747dcc7015d1c site_tests_capy-services-slice.capy.wasm
|
||||
5c393f02e13ee7255d0efbb87a54129b32888516513bd9b2058863a6629855ac site_tests_capy-services-slice.capy.wasm.source-map
|
||||
b38be0d419a49e12f46db3fb520e0f3689a46d069ecc0638f6bcd894c6c2898d site_tests_capy-session.capy.wasm
|
||||
db859884cce403a35a0c4e43088e5673713d494d738e0d8e6c877ea547863396 site_tests_capy-session.capy.wasm.source-map
|
||||
4d2899e11780142c94f5a5e9f76d9d88a6051989bc8bb19ec2034f439f09a034 site_tests_capy-shell-exec-background-type-trap.capy.wasm
|
||||
|
||||
@@ -342,6 +342,7 @@ for service_case in every:service_every spawn:port_spawn connect:port_connect li
|
||||
done
|
||||
expect_equal "unit-scope variables persist across handler calls in one workspace" "2|ab|2|2|c|100" "$(scripts/bearer-cli /tests/capy-unit-vars.capy)"
|
||||
expect_equal "unit-scope variables start fresh per request" "2|ab|2|2|c|100" "$(scripts/bearer-cli /tests/capy-unit-vars.capy)"
|
||||
BEARER_TEST_SITE_DIRECTORY="$site_directory" timeout 20 bash scripts/test_capy_services.sh
|
||||
expect_equal "unit administration" "true|true|true|2|0" "$(scripts/bearer-cli /tests/capy-unit-admin.capy)"
|
||||
expect_equal "DValue array merge" "rightyesnewright|abcd|valueitem|right|value|z|oddkeep|map|unicode|9|0" "$(scripts/bearer-cli /tests/capy-dval-merge.capy)"
|
||||
expect_equal "DValue value API" 'truefalseAda42tail|trueone|Bearerfalse|truearray"A"|ftruey|truefalseAdanameengineer|23truefalse|-4242-918446744073709551615|0' "$(scripts/bearer-cli /tests/capy-dval-api.capy)"
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
#!/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'
|
||||
Reference in new issue
Block a user