summaryrefslogtreecommitdiffstats
path: root/source3/script/tests/test_winbind_call_depth_trace.sh
diff options
context:
space:
mode:
Diffstat (limited to 'source3/script/tests/test_winbind_call_depth_trace.sh')
-rwxr-xr-xsource3/script/tests/test_winbind_call_depth_trace.sh113
1 files changed, 113 insertions, 0 deletions
diff --git a/source3/script/tests/test_winbind_call_depth_trace.sh b/source3/script/tests/test_winbind_call_depth_trace.sh
new file mode 100755
index 0000000..6d978be
--- /dev/null
+++ b/source3/script/tests/test_winbind_call_depth_trace.sh
@@ -0,0 +1,113 @@
+#!/bin/sh
+
+# Copyright (c) Pavel Filipenský <pfilipensky@samba.org>
+# License: GPLv3
+
+if [ $# -lt 4 ]; then
+ echo "Usage: test_winbind_call_depth_trace SMBCONTROL CONFIGURATION PREFIX TESTENV"
+ exit 1
+fi
+
+SMBCONTROL="${1}"
+CONFIGURATION=${2}
+PREFIX="${3}"
+TESTENV="${4}"
+shift 4
+
+incdir=$(dirname "$0")/../../../testprogs/blackbox
+. "$incdir"/subunit.sh
+
+failed=0
+
+PREFIX_ABS="$(readlink -f "${PREFIX}")"
+# Strip from TESTENV the ':local' if present
+TESTENV_SUBDIR=${TESTENV%:*}
+
+LOGFILE="${PREFIX_ABS}/${TESTENV_SUBDIR}/logs/log.winbindd"
+# Add support for "WINBINDD_DONT_LOG_STDOUT=1"
+if [ ! -r "${LOGFILE}" ]; then
+ TEST_LOGFILE="${PREFIX_ABS}/${TESTENV_SUBDIR}/winbindd_test.log"
+ subunit_start_test "test winbind call depth trace"
+ subunit_skip_test "test winbind call depth trace" <<EOF
+Test is skipped, we need $LOGFILE but have only $TEST_LOGFILE which is missing debug headers (they are not printed to stdout).
+EOF
+ exit 0
+fi
+
+saved_level=1
+
+get_winbind_loglevel()
+{
+ s1=$(${SMBCONTROL} "${CONFIGURATION}" winbind debuglevel)
+ # We need to get the all level from output like this:
+ # "PID 664474: all:1 tdb:1 printdrivers:1 lanman:1 smb:1 rpc_parse:1 rpc_srv:1 rpc_cli:1 passdb:1 sam:1..."
+ # 1. remove PID 664474:
+ s2=${s1#PID*: }
+ # "all:1 tdb:1 printdrivers:1 lanman:1 smb:1 rpc_parse:1 rpc_srv:1 rpc_cli:1 passdb"
+ # 2. remove " tdb:1 printdrivers:1 ..."
+ s3=${s2%% *}
+ # "all:1"
+ # 3. remove "all:"
+ saved_level=${s3#all:}
+}
+
+# Example of trace line
+# [2023/01/25 00:20:33.307038, 5, pid=535581, effective(0, 0), real(0, 0), class=winbind, traceid=78, depth=4] ../../source3/winbindd/wb_group_members.c:310(wb_group_members_send)
+test_winbind_call_depth_trace()
+{
+ get_winbind_loglevel
+
+ # If loglevel < 10, set it to 10.
+ if [ "$saved_level" -lt 10 ]; then
+ ${SMBCONTROL} "${CONFIGURATION}" winbind debug 10
+ fi
+
+ COUNT1=$(grep -c wb_group_members_send "$LOGFILE")
+
+ id ADDOMAIN/alice
+ ret=$?
+
+ # Restore loglevel, if it was changed.
+ if [ "$saved_level" -lt 10 ]; then
+ ${SMBCONTROL} "${CONFIGURATION}" winbind debug "$saved_level"
+ fi
+
+ if [ $ret != 0 ]; then
+ echo "Command 'id ADDOMAIN/alice' failed!"
+ return 1
+ fi
+
+ # Check that there are more lines with wb_group_members_send
+ COUNT2=$(grep -c wb_group_members_send "$LOGFILE")
+ if [ "$COUNT1" -eq "$COUNT2" ]; then
+ echo "The number of the trace lines in $LOGFILE has not increased."
+ return 1
+ fi
+
+ # Test that the depth of last line with 'wb_group_members_send' is: depth=4
+ COUNT3=$(grep wb_group_members_send "$LOGFILE" | tail -1 | grep -c depth=4)
+ if [ "$COUNT3" -ne 1 ]; then
+ echo "The last line with wb_group_members_send should have depth=4."
+ return 1
+ fi
+
+ # Test that the indentation of the line below last 'wb_group_members_send' is indented by 2+4*4 spaces:
+ COUNT4=$(grep -A1 wb_group_members_send "$LOGFILE" | tail -1| grep -c '^ WB command group_members start')
+ if [ "$COUNT4" -ne 1 ]; then
+ echo "The line after the last line with wb_group_members_send should be indented by 18 spaces."
+ return 1
+ fi
+
+ return 0
+}
+
+case ${TESTENV} in
+ad_member*)
+ ;;
+*)
+ echo "Test is for ad_member only, but called for ${TESTENV}." | subunit_fail_test "test winbind call depth trace"
+ exit 1;
+esac
+
+testit "test winbind call depth trace" test_winbind_call_depth_trace || failed=$((failed + 1))
+testok "$0" "$failed"