mirror of
https://oauth2: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@github.com/m1ngsama/TNT.git
synced 2026-06-26 04:34:38 +08:00
140 lines
3.5 KiB
Bash
Executable file
140 lines
3.5 KiB
Bash
Executable file
#!/bin/sh
|
|
# Maintenance-script regression tests for scripts/logrotate.sh.
|
|
|
|
set -u
|
|
|
|
PASS=0
|
|
FAIL=0
|
|
SCRIPT="../scripts/logrotate.sh"
|
|
STATE_DIR=$(mktemp -d "${TMPDIR:-/tmp}/tnt-logrotate-test.XXXXXX")
|
|
|
|
cleanup() {
|
|
rm -rf "$STATE_DIR"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
pass() {
|
|
echo "✓ $1"
|
|
PASS=$((PASS + 1))
|
|
}
|
|
|
|
fail() {
|
|
echo "✗ $1"
|
|
FAIL=$((FAIL + 1))
|
|
}
|
|
|
|
archive_payload() {
|
|
archive=$1
|
|
case "$archive" in
|
|
*.gz) gzip -cd "$archive" ;;
|
|
*) cat "$archive" ;;
|
|
esac
|
|
}
|
|
|
|
echo "=== TNT Logrotate Tests ==="
|
|
|
|
if [ ! -x "$SCRIPT" ]; then
|
|
echo "Error: script $SCRIPT not found or not executable."
|
|
exit 1
|
|
fi
|
|
|
|
MISSING_OUTPUT=$("$SCRIPT" "$STATE_DIR/missing.log" 100 10 2>&1)
|
|
MISSING_STATUS=$?
|
|
printf '%s\n' "$MISSING_OUTPUT" | grep -q 'does not exist'
|
|
if [ "$MISSING_STATUS" -eq 0 ] && [ $? -eq 0 ]; then
|
|
pass "missing log is a successful no-op"
|
|
else
|
|
fail "missing log handling"
|
|
printf '%s\n' "$MISSING_OUTPUT"
|
|
fi
|
|
|
|
LOG="$STATE_DIR/messages.log"
|
|
cat > "$LOG" <<'EOF'
|
|
2026-01-01T00:00:01Z|alice|one
|
|
2026-01-01T00:00:02Z|bob|two
|
|
2026-01-01T00:00:03Z|carol|three
|
|
EOF
|
|
|
|
if "$SCRIPT" "$LOG" 100 2 >/dev/null 2>&1 &&
|
|
grep -q 'alice|one' "$LOG" &&
|
|
[ "$(ls "$LOG".* 2>/dev/null | wc -l | tr -d ' ')" -eq 0 ]; then
|
|
pass "small log stays unmodified"
|
|
else
|
|
fail "small log no-op"
|
|
cat "$LOG" 2>/dev/null
|
|
fi
|
|
|
|
ROTATE_OUTPUT=$("$SCRIPT" "$LOG" 0 2 2>&1)
|
|
ROTATE_STATUS=$?
|
|
ARCHIVE=$(ls "$LOG".*.gz "$LOG".[0-9]* 2>/dev/null | head -n 1)
|
|
if [ "$ROTATE_STATUS" -eq 0 ] &&
|
|
printf '%s\n' "$ROTATE_OUTPUT" | grep -q 'kept last 2 lines' &&
|
|
! grep -q 'alice|one' "$LOG" &&
|
|
grep -q 'bob|two' "$LOG" &&
|
|
grep -q 'carol|three' "$LOG" &&
|
|
[ -n "$ARCHIVE" ] &&
|
|
archive_payload "$ARCHIVE" | grep -q 'alice|one'; then
|
|
pass "oversize log is archived and compacted"
|
|
else
|
|
fail "oversize rotation"
|
|
printf '%s\n' "$ROTATE_OUTPUT"
|
|
cat "$LOG" 2>/dev/null
|
|
fi
|
|
|
|
DRY_LOG="$STATE_DIR/dry.log"
|
|
printf 'line1\nline2\nline3\n' > "$DRY_LOG"
|
|
DRY_BEFORE=$(cat "$DRY_LOG")
|
|
DRY_OUTPUT=$("$SCRIPT" --dry-run "$DRY_LOG" 0 1 2>&1)
|
|
DRY_STATUS=$?
|
|
if [ "$DRY_STATUS" -eq 0 ] &&
|
|
[ "$(cat "$DRY_LOG")" = "$DRY_BEFORE" ] &&
|
|
printf '%s\n' "$DRY_OUTPUT" | grep -q 'would archive'; then
|
|
pass "dry run does not modify the log"
|
|
else
|
|
fail "dry run handling"
|
|
printf '%s\n' "$DRY_OUTPUT"
|
|
fi
|
|
|
|
INVALID_OUTPUT=$("$SCRIPT" "$LOG" nope 2 2>&1)
|
|
INVALID_STATUS=$?
|
|
if [ "$INVALID_STATUS" -eq 64 ] &&
|
|
printf '%s\n' "$INVALID_OUTPUT" | grep -q 'invalid max size'; then
|
|
pass "invalid arguments exit 64"
|
|
else
|
|
fail "invalid argument status"
|
|
printf '%s\n' "$INVALID_OUTPUT"
|
|
echo "exit status: $INVALID_STATUS"
|
|
fi
|
|
|
|
DIR_OUTPUT=$("$SCRIPT" "$STATE_DIR" 0 1 2>&1)
|
|
DIR_STATUS=$?
|
|
if [ "$DIR_STATUS" -eq 1 ] &&
|
|
printf '%s\n' "$DIR_OUTPUT" | grep -q 'not a regular file'; then
|
|
pass "non-regular log path is rejected"
|
|
else
|
|
fail "non-regular path handling"
|
|
printf '%s\n' "$DIR_OUTPUT"
|
|
echo "exit status: $DIR_STATUS"
|
|
fi
|
|
|
|
RET_LOG="$STATE_DIR/retention.log"
|
|
printf 'a\nb\nc\n' > "$RET_LOG"
|
|
printf old1 > "$RET_LOG.20000101T000000Z.gz"
|
|
sleep 1
|
|
printf old2 > "$RET_LOG.20010101T000000Z.gz"
|
|
sleep 1
|
|
printf old3 > "$RET_LOG.20020101T000000Z.gz"
|
|
|
|
if "$SCRIPT" --keep-archives 2 "$RET_LOG" 100 2 >/dev/null 2>&1 &&
|
|
[ "$(ls "$RET_LOG".*.gz 2>/dev/null | wc -l | tr -d ' ')" -eq 2 ]; then
|
|
pass "archive retention removes older archives"
|
|
else
|
|
fail "archive retention"
|
|
ls "$RET_LOG".* 2>/dev/null || true
|
|
fi
|
|
|
|
echo ""
|
|
echo "PASSED: $PASS"
|
|
echo "FAILED: $FAIL"
|
|
[ "$FAIL" -eq 0 ] && echo "All tests passed" || echo "Some tests failed"
|
|
exit "$FAIL"
|