Files
NeoTachyon/tests/forkop_migration_installer.sh
T

176 lines
5.8 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
INSTALLER="$ROOT_DIR/install.sh"
WORK_DIR="$(mktemp -d)"
cleanup() {
rm -rf "$WORK_DIR"
}
trap cleanup EXIT
fail() {
printf 'FAIL: %s\n' "$1" >&2
exit 1
}
[ -r "$INSTALLER" ] || fail "install.sh is missing"
# 1. Extract embedded ucode helper and verify its syntax
helper="$WORK_DIR/install-json.uc"
awk '
/cat > "\$helper_path" <<'\''EOF'\''/ { capture = 1; next }
capture && /^EOF$/ { exit }
capture { print }
' "$INSTALLER" > "$helper"
[ -s "$helper" ] || fail "failed to extract embedded installer ucode helper"
if command -v ucode >/dev/null 2>&1; then
ucode -c -o /dev/null "$helper" || fail "embedded ucode helper failed syntax check"
fi
# 2. Test installer_cleanup_legacy with mock Forkop environment
MOCK_ROOT="$WORK_DIR/rootfs"
mkdir -p "$MOCK_ROOT/etc/config"
mkdir -p "$MOCK_ROOT/etc/init.d"
mkdir -p "$MOCK_ROOT/usr/bin"
mkdir -p "$MOCK_ROOT/usr/lib/forkop"
mkdir -p "$MOCK_ROOT/tmp"
mkdir -p "$MOCK_ROOT/var/run/forkop"
cat >"$MOCK_ROOT/etc/config/forkop" <<'EOF'
config settings 'settings'
option enabled '1'
EOF
cat >"$MOCK_ROOT/etc/init.d/forkop" <<'EOF'
#!/usr/bin/env sh
case "$1" in
enabled) exit 0 ;;
running) exit 0 ;;
stop|disable) exit 0 ;;
*) exit 0 ;;
esac
EOF
chmod 0755 "$MOCK_ROOT/etc/init.d/forkop"
cat >"$MOCK_ROOT/usr/bin/forkop" <<'EOF'
#!/usr/bin/env sh
case "$1" in
get_status) printf '{"running":1}\n' ;;
restore_dnsmasq) exit 0 ;;
*) exit 0 ;;
esac
EOF
chmod 0755 "$MOCK_ROOT/usr/bin/forkop"
# Mock opkg
MOCK_BIN="$WORK_DIR/bin"
mkdir -p "$MOCK_BIN"
cat >"$MOCK_BIN/opkg" <<'EOF'
#!/usr/bin/env sh
case "$1" in
list-installed)
printf '%s\n' \
'forkop - 1.0.4' \
'luci-app-forkop - 1.0.4' \
'luci-i18n-forkop-ru - 1.0.4'
;;
remove)
shift
[ "$1" = "--force-depends" ] && shift
printf 'removed: %s\n' "$1" >> "$TMP_DIR/opkg-removed.log"
;;
esac
exit 0
EOF
chmod 0755 "$MOCK_BIN/opkg"
# Run installer-cleanup-legacy in mock environment
if command -v ucode >/dev/null 2>&1; then
export PATH="$MOCK_BIN:$PATH"
export TMP_DIR="$WORK_DIR"
state_output="$(
TACHYON_LEGACY_DETECTED=1 \
TACHYON_INSTALLER_OPKG_BIN="$MOCK_BIN/opkg" \
TACHYON_INSTALLER_TACHYON_INIT="$WORK_DIR/no-init" \
TACHYON_INSTALLER_TACHYON_BIN="$WORK_DIR/no-bin" \
TACHYON_INSTALLER_TACHYON_LIB="$WORK_DIR/no-lib" \
TACHYON_INSTALLER_TACHYON_UCI_DEFAULTS="$WORK_DIR/no-defaults" \
TACHYON_INSTALLER_TACHYON_LUCI_VIEW="$WORK_DIR/no-view" \
TACHYON_INSTALLER_MENU_JSON="$WORK_DIR/no-menu" \
TACHYON_INSTALLER_ACL_JSON="$WORK_DIR/no-acl" \
TACHYON_INSTALLER_RU_LMO="$WORK_DIR/no-ru-lmo" \
TACHYON_INSTALLER_EN_LMO="$WORK_DIR/no-en-lmo" \
TACHYON_INSTALLER_RU_LUA="$WORK_DIR/no-ru-lua" \
TACHYON_INSTALLER_EN_LUA="$WORK_DIR/no-en-lua" \
TACHYON_INSTALLER_LEGACY_INIT="$WORK_DIR/no-leg-init" \
TACHYON_INSTALLER_LEGACY_BIN="$WORK_DIR/no-leg-bin" \
TACHYON_INSTALLER_LEGACY_LIB="$WORK_DIR/no-leg-lib" \
TACHYON_INSTALLER_LEGACY_UCI_DEFAULTS="$WORK_DIR/no-leg-defaults" \
TACHYON_INSTALLER_LEGACY_LUCI_VIEW="$WORK_DIR/no-leg-view" \
TACHYON_INSTALLER_LEGACY_MENU_JSON="$WORK_DIR/no-leg-menu" \
TACHYON_INSTALLER_LEGACY_ACL_JSON="$WORK_DIR/no-leg-acl" \
TACHYON_INSTALLER_LEGACY_BASE_INIT="$WORK_DIR/no-base-init" \
TACHYON_INSTALLER_LEGACY_BASE_BIN="$WORK_DIR/no-base-bin" \
TACHYON_INSTALLER_LEGACY_BASE_LIB="$WORK_DIR/no-base-lib" \
TACHYON_INSTALLER_LEGACY_BASE_UCI_DEFAULTS="$WORK_DIR/no-base-defaults" \
TACHYON_INSTALLER_LEGACY_BASE_LUCI_VIEW="$WORK_DIR/no-base-view" \
TACHYON_INSTALLER_LEGACY_BASE_MENU_JSON="$WORK_DIR/no-base-menu" \
TACHYON_INSTALLER_LEGACY_BASE_ACL_JSON="$WORK_DIR/no-base-acl" \
TACHYON_INSTALLER_LEGACY_BASE_I18N="$WORK_DIR/no-base-i18n" \
TACHYON_INSTALLER_LEGACY_BRAND="podkop" \
TACHYON_INSTALLER_LEGACY_BACKEND="podkop-plus" \
ucode "$helper" installer-cleanup-legacy
)"
printf '%s\n' "$state_output" | grep -Fxq 'TACHYON_LEGACY_DETECTED=1' ||
fail "installer_cleanup_legacy must report TACHYON_LEGACY_DETECTED=1 when Forkop is installed"
# 3. Test post-install when TACHYON_LEGACY_DETECTED=1
# reset_settings must NOT be executed
cat >"$WORK_DIR/mock-tachyon-bin" <<'EOF'
#!/usr/bin/env sh
if [ "$1" = "reset_settings" ]; then
echo "CALLED_RESET_SETTINGS" >> "$TMP_DIR/reset_settings.called"
fi
exit 0
EOF
chmod 0755 "$WORK_DIR/mock-tachyon-bin"
TACHYON_WAS_INSTALLED=0 \
TACHYON_LEGACY_DETECTED=1 \
TACHYON_WAS_ENABLED=1 \
TACHYON_WAS_RUNNING=1 \
TACHYON_INSTALLER_TACHYON_BIN="$WORK_DIR/mock-tachyon-bin" \
TACHYON_INSTALLER_TACHYON_INIT="$WORK_DIR/mock-tachyon-bin" \
ucode "$helper" installer-post-install
if [ -f "$WORK_DIR/reset_settings.called" ]; then
fail "installer_post_install must not invoke reset_settings when legacy migration is active"
fi
fi
# 4. Static checks on install.sh to ensure Forkop / Netshift migration contracts
grep -Fq 'TACHYON_FORKOP_MIGRATION=1' "$INSTALLER" ||
fail "install.sh must set TACHYON_FORKOP_MIGRATION flag"
grep -Fq 'TACHYON_NETSHIFT_MIGRATION=1' "$INSTALLER" ||
fail "install.sh must set TACHYON_NETSHIFT_MIGRATION flag"
grep -Fq 'legacy_detected_before="$TACHYON_LEGACY_DETECTED"' "$INSTALLER" ||
fail "cleanup_legacy_installation must guard TACHYON_LEGACY_DETECTED against being overwritten to 0"
grep -Fq 'installer_package_installed("forkop")' "$INSTALLER" ||
fail "installer_cleanup_legacy must detect forkop packages"
grep -Fq 'installer_package_installed("netshift")' "$INSTALLER" ||
fail "installer_cleanup_legacy must detect netshift packages"
grep -Fq '"/etc/config/forkop"' "$INSTALLER" ||
fail "installer must reference /etc/config/forkop for migration and cleanup"
printf 'Forkop migration installer tests passed successfully.\n'