mirror of
https://github.com/wnlen/clash-for-linux.git
synced 2026-10-10 20:23:04 +08:00
171 lines
4.6 KiB
Bash
171 lines
4.6 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
|
|
source_clashctl_for_tests() {
|
|
set -- ""
|
|
# Source the real functions; suppress the no-arg usage printed by the command dispatcher.
|
|
source "$PROJECT_DIR/scripts/core/clashctl.sh" >/dev/null
|
|
}
|
|
|
|
source_clashctl_for_tests
|
|
|
|
tmp_dir="$(mktemp -d)"
|
|
trap 'rm -rf "$tmp_dir"' EXIT
|
|
|
|
prepare() { :; }
|
|
ui_warn() { printf 'warn: %s\n' "$*" >> "$tmp_dir/output"; }
|
|
ui_next() { printf 'next: %s\n' "$*" >> "$tmp_dir/output"; }
|
|
ui_blank() { :; }
|
|
system_proxy_env_file() { printf '%s\n' "$tmp_dir/environment"; }
|
|
write_runtime_value() { :; }
|
|
die_state() {
|
|
printf 'die: %s\nnext: %s\n' "$1" "$2" >> "$tmp_dir/output"
|
|
exit 1
|
|
}
|
|
|
|
run_case() {
|
|
local name="$1"
|
|
local proxy_rc="$2"
|
|
local stop_calls_file="$tmp_dir/stop-calls"
|
|
local output_file="$tmp_dir/output"
|
|
|
|
: > "$stop_calls_file"
|
|
: > "$output_file"
|
|
|
|
system_proxy_disable() { return "$proxy_rc"; }
|
|
service_stop() { printf 'stop\n' >> "$stop_calls_file"; }
|
|
status_is_running() {
|
|
[ ! -s "$stop_calls_file" ]
|
|
}
|
|
|
|
cmd_off > "$output_file"
|
|
|
|
if [ "$(wc -l < "$stop_calls_file" | tr -d ' ')" != "1" ]; then
|
|
echo "not ok - $name: service_stop was not called exactly once" >&2
|
|
return 1
|
|
fi
|
|
|
|
if ! grep -Fq "代理已关闭" "$output_file"; then
|
|
echo "not ok - $name: success feedback missing" >&2
|
|
sed 's/^/ /' "$output_file" >&2
|
|
return 1
|
|
fi
|
|
|
|
echo "ok - $name"
|
|
}
|
|
|
|
run_case "stops runtime after disabling system proxy" 0
|
|
run_case "still stops runtime when system proxy cleanup is unsupported" 2
|
|
|
|
run_stop_failure_case() {
|
|
local stop_calls_file="$tmp_dir/stop-failure-calls"
|
|
local output_file="$tmp_dir/output"
|
|
|
|
: > "$stop_calls_file"
|
|
: > "$output_file"
|
|
|
|
system_proxy_disable() { return 0; }
|
|
service_stop() {
|
|
printf 'stop\n' >> "$stop_calls_file"
|
|
return 7
|
|
}
|
|
status_is_running() { return 0; }
|
|
|
|
if ( cmd_off ) > "$output_file"; then
|
|
echo "not ok - stop failure: cmd_off unexpectedly succeeded" >&2
|
|
return 1
|
|
fi
|
|
|
|
if ! grep -Fq "运行后端 stop 返回 7" "$output_file"; then
|
|
echo "not ok - stop failure: missing stop failure detail" >&2
|
|
sed 's/^/ /' "$output_file" >&2
|
|
return 1
|
|
fi
|
|
|
|
if grep -Fq "代理已关闭" "$output_file"; then
|
|
echo "not ok - stop failure: printed success after stop failure" >&2
|
|
sed 's/^/ /' "$output_file" >&2
|
|
return 1
|
|
fi
|
|
|
|
echo "ok - stop failure returns non-zero"
|
|
}
|
|
|
|
run_persistent_cleanup_blocked_case() {
|
|
local stop_calls_file="$tmp_dir/persistent-cleanup-blocked-calls"
|
|
local output_file="$tmp_dir/output"
|
|
|
|
: > "$stop_calls_file"
|
|
: > "$output_file"
|
|
|
|
system_proxy_status() { printf 'on\n'; }
|
|
system_proxy_disable() { return 2; }
|
|
service_stop() { printf 'stop\n' >> "$stop_calls_file"; }
|
|
status_is_running() {
|
|
[ ! -s "$stop_calls_file" ]
|
|
}
|
|
|
|
if ( cmd_off ) > "$output_file"; then
|
|
echo "not ok - persistent cleanup blocked: cmd_off unexpectedly succeeded" >&2
|
|
return 1
|
|
fi
|
|
|
|
if [ "$(wc -l < "$stop_calls_file" | tr -d ' ')" != "1" ]; then
|
|
echo "not ok - persistent cleanup blocked: service_stop was not called exactly once" >&2
|
|
return 1
|
|
fi
|
|
|
|
if ! grep -Fq "系统代理持久块未清理" "$output_file"; then
|
|
echo "not ok - persistent cleanup blocked: missing cleanup failure detail" >&2
|
|
sed 's/^/ /' "$output_file" >&2
|
|
return 1
|
|
fi
|
|
|
|
if grep -Fq "代理已关闭" "$output_file"; then
|
|
echo "not ok - persistent cleanup blocked: printed success while persistent proxy remained" >&2
|
|
sed 's/^/ /' "$output_file" >&2
|
|
return 1
|
|
fi
|
|
|
|
echo "ok - persistent cleanup failure returns non-zero after stopping runtime"
|
|
}
|
|
|
|
run_still_running_case() {
|
|
local stop_calls_file="$tmp_dir/still-running-calls"
|
|
local output_file="$tmp_dir/output"
|
|
|
|
: > "$stop_calls_file"
|
|
: > "$output_file"
|
|
|
|
system_proxy_disable() { return 0; }
|
|
service_stop() { printf 'stop\n' >> "$stop_calls_file"; }
|
|
status_is_running() { return 0; }
|
|
wait_runtime_stopped() { return 1; }
|
|
|
|
if ( cmd_off ) > "$output_file"; then
|
|
echo "not ok - still running: cmd_off unexpectedly succeeded" >&2
|
|
return 1
|
|
fi
|
|
|
|
if ! grep -Fq "代理内核仍在运行" "$output_file"; then
|
|
echo "not ok - still running: missing still-running detail" >&2
|
|
sed 's/^/ /' "$output_file" >&2
|
|
return 1
|
|
fi
|
|
|
|
if grep -Fq "代理已关闭" "$output_file"; then
|
|
echo "not ok - still running: printed success while runtime stayed up" >&2
|
|
sed 's/^/ /' "$output_file" >&2
|
|
return 1
|
|
fi
|
|
|
|
echo "ok - still running returns non-zero"
|
|
}
|
|
|
|
run_stop_failure_case
|
|
run_persistent_cleanup_blocked_case
|
|
run_still_running_case
|