- Bundle universal 17-byte empty SRS stub and add is_valid_srs_file/ensure_empty_srs_stub in rulesets.uc - Add prepare_community_rulesets in lifecycle.uc to pre-fetch via gh-proxy mirrors or initialize safe local stub before sing-box start - Support local community rulesets and stubs in generator_routes.uc - Add fallback to component proxy for list downloads in updates.uc and preserve cached stubs - Skip non-functional jsdelivr for release downloads and prioritize gh-proxy mirrors in core/url.uc - Add tests/cold_boot_community_stub.sh testing cold boot fallback behavior
101 lines
3.4 KiB
Bash
101 lines
3.4 KiB
Bash
#!/usr/bin/env bash
|
|
set -eo pipefail
|
|
|
|
TEST_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
ROOT_DIR="$(cd "$TEST_DIR/.." && pwd)"
|
|
TACHYON_LIB="$ROOT_DIR/tachyon/files/usr/lib"
|
|
RULESETS_UC="$TACHYON_LIB/singbox/rulesets.uc"
|
|
GENERATOR_UC="$TACHYON_LIB/singbox/generator.uc"
|
|
|
|
WORK_DIR="$(mktemp -d)"
|
|
trap 'rm -rf "$WORK_DIR"' EXIT
|
|
|
|
fail() {
|
|
echo "FAIL: $*" >&2
|
|
exit 1
|
|
}
|
|
|
|
# 1. Test is-valid-srs-file with invalid files
|
|
touch "$WORK_DIR/empty_zero.srs"
|
|
if ucode -L "$TACHYON_LIB" "$RULESETS_UC" is-valid-srs-file "$WORK_DIR/empty_zero.srs" >/dev/null 2>&1; then
|
|
fail "zero-byte file must not be recognized as valid SRS"
|
|
fi
|
|
|
|
printf '<html>404 Not Found</html>' > "$WORK_DIR/html_error.srs"
|
|
if ucode -L "$TACHYON_LIB" "$RULESETS_UC" is-valid-srs-file "$WORK_DIR/html_error.srs" >/dev/null 2>&1; then
|
|
fail "HTML error page must not be recognized as valid SRS"
|
|
fi
|
|
|
|
# 2. Test ensure-empty-srs-stub
|
|
STUB_TARGET="$WORK_DIR/rulesets/community-russia_inside.srs"
|
|
ucode -L "$TACHYON_LIB" "$RULESETS_UC" ensure-empty-srs-stub "$STUB_TARGET" || \
|
|
fail "ensure-empty-srs-stub failed to create stub"
|
|
|
|
[ -f "$STUB_TARGET" ] || fail "stub target file was not created"
|
|
|
|
size=$(wc -c < "$STUB_TARGET" | tr -d '[:space:]')
|
|
[ "$size" -eq 17 ] || fail "stub file size is $size, expected 17 bytes"
|
|
|
|
ucode -L "$TACHYON_LIB" "$RULESETS_UC" is-valid-srs-file "$STUB_TARGET" >/dev/null || \
|
|
fail "created stub must be recognized as valid SRS"
|
|
|
|
# 3. Test that generator produces type: local when stub is present
|
|
cat >"$WORK_DIR/fixture.json" <<'JSON'
|
|
{
|
|
"settings": {
|
|
".name": "settings",
|
|
".type": "settings",
|
|
"enabled": "1",
|
|
"dns_type": "udp",
|
|
"dns_server": "1.1.1.1",
|
|
"service_listen_address": "127.0.0.1"
|
|
},
|
|
"section": [
|
|
{
|
|
".name": "HyDE",
|
|
".type": "section",
|
|
"enabled": "1",
|
|
"action": "connection",
|
|
"outbound_jsons": [ "{\"type\":\"direct\"}" ],
|
|
"community_lists": [ "russia_inside" ]
|
|
}
|
|
]
|
|
}
|
|
JSON
|
|
|
|
output="$WORK_DIR/out.json"
|
|
mkdir -p "$output.section-cache" "$output.rulesets"
|
|
|
|
# Copy the stub into the generator's rulesets directory (simulating startup preparation)
|
|
cp "$STUB_TARGET" "$output.rulesets/community-russia_inside.srs"
|
|
|
|
ucode -L "$TACHYON_LIB" "$GENERATOR_UC" generate-config-fixture \
|
|
"$WORK_DIR/fixture.json" "$output" "127.0.0.1" "0" "1"
|
|
|
|
# The generated route.rule_set MUST be "type": "local" pointing to the stub
|
|
grep -Fq '"type": "local"' "$output" || \
|
|
fail "ruleset must be local when stub exists"
|
|
|
|
grep -Fq 'community-russia_inside.srs' "$output" || \
|
|
fail "ruleset must point to community-russia_inside.srs"
|
|
|
|
if grep -Fq '"type": "remote"' "$output"; then
|
|
fail "must not emit remote ruleset when local stub is present"
|
|
fi
|
|
|
|
# 4. Verify candidate generation in core.url prioritizes gh-proxy and handles releases
|
|
url_candidates=$(ucode -L "$TACHYON_LIB" -e '
|
|
let url = require("core.url");
|
|
let c = url.download_candidates("https://github.com/itdoginfo/allow-domains/releases/latest/download/russia_inside.srs");
|
|
for (let u in c) print(u, "\n");
|
|
')
|
|
|
|
echo "$url_candidates" | grep -Fq 'https://gh-proxy.com/https://github.com/itdoginfo/allow-domains/releases/latest/download/russia_inside.srs' || \
|
|
fail "download_candidates must include gh-proxy mirror for releases"
|
|
|
|
if echo "$url_candidates" | grep -Fq 'cdn.jsdelivr.net'; then
|
|
fail "download_candidates must not include jsdelivr for release assets"
|
|
fi
|
|
|
|
echo "ALL cold_boot_community_stub tests passed successfully"
|