#!/bin/bash
# Sourced by the destructive test tools. This file never performs server actions.
sdp_test_error() { printf 'Disposable test guard: %s\n' "$*" >&2; return 1; }

sdp_test_validate_args() {
   [[ "$TEST_ROOT" =~ ^/[A-Za-z0-9_./-]+/sdp-test-[A-Za-z0-9_-]+$ && "$TEST_ROOT" != *'/../'* && "$TEST_ROOT" != *'/./'* ]] || {
      sdp_test_error 'root must be an absolute path ending in /sdp-test-NAME (no spaces, . or .. components).'; return 1;
   }
   [[ "$INSTANCE" =~ ^[A-Za-z0-9_-]+$ ]] || { sdp_test_error 'an explicit valid instance is required.'; return 1; }
   [[ "$TEST_PORT" =~ ^[0-9]+$ ]] && (( 10#$TEST_PORT >= 1024 && 10#$TEST_PORT <= 65535 )) || {
      sdp_test_error 'port must be an explicit unprivileged numeric port.'; return 1;
   }
   [[ "$TEST_OSUSER" =~ ^[a-z_][a-z0-9_-]*$ ]] || { sdp_test_error 'an explicit OS account is required.'; return 1; }
}

sdp_test_marker_text() {
   printf 'SDP_DISPOSABLE_V1\n%s\n%s\n%s\n%s\nsdp-test-%s\n' "$TEST_ROOT" "$INSTANCE" "$TEST_PORT" "$TEST_OSUSER" "$INSTANCE"
}

sdp_test_validate_marker() {
   local physical marker
   sdp_test_validate_args || return 1
   [[ -d "$TEST_ROOT" && ! -L "$TEST_ROOT" ]] || { sdp_test_error 'root must be a real directory.'; return 1; }
   physical=$(cd "$TEST_ROOT" && pwd -P) || return 1
   [[ "$physical" == "$TEST_ROOT" ]] || { sdp_test_error 'root must not contain symlink components.'; return 1; }
   marker="$TEST_ROOT/.sdp-disposable-test"
   [[ -f "$marker" && ! -L "$marker" ]] || { sdp_test_error 'disposable marker is missing.'; return 1; }
   [[ "$(cat "$marker")" == "$(sdp_test_marker_text)" ]] || { sdp_test_error 'marker does not match root, instance, port and OS account.'; return 1; }
   [[ -L /p4 && "$(readlink /p4)" == "$TEST_ROOT/p4" ]] || {
      sdp_test_error '/p4 must be the symlink owned by this disposable deployment.'; return 1;
   }
}
