blob: 424f633d0661d0d0d98b4f4a71708549d479a188 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
#!/bin/bash
die() {
echo "$@"
exit 5
}
SCRIPT_PATH="${SCRIPT_PATH:-$(readlink -f "$(dirname "$0")")}"
VALGRIND_ERROR=37
if [ "$1" == "--called-from-make" ]; then
shift
NMTST_LIBTOOL=($1 --mode=execute); shift
NMTST_VALGRIND="$1"; shift
SUPPRESSIONS="$1"; shift
if [ "$1" = "--launch-dbus" ]; then
NMTST_LAUNCH_DBUS=yes
shift
else
NMTST_LAUNCH_DBUS=no
fi
TEST="$1"; shift
else
if [ -n "${NMTST_LIBTOOL-:x}" ]; then
NMTST_LIBTOOL=(sh "$SCRIPT_PATH/../libtool" --mode=execute)
elif [ -n "${NMTST_LIBTOOL-x}" ]; then
NMTST_LIBTOOL=()
else
NMTST_LIBTOOL=($NMTST_LIBTOOL --mode=execute)
fi
for a in "$@"; do
case "$a" in
"--launch-dbus")
NMTST_LAUNCH_DBUS=yes
shift
;;
"--no-launch-dbus"|"-D")
NMTST_LAUNCH_DBUS=no
shift
;;
"--no-libtool")
NMTST_LIBTOOL=()
shift
;;
"--")
shift
break
;;
*)
break
;;
esac
done
# we support calling the script directly. In this case,
# only pass the path to the test to run.
TEST="$1"; shift
NMTST_VALGRIND="${NMTST_VALGRIND:-valgrind}"
if [ "$SUPPRESSIONS" == "" ]; then
SUPPRESSIONS="$SCRIPT_PATH/../valgrind.suppressions"
fi
[ -x "$TEST" ] || die "Test \"$TEST\" does not exist"
TEST_PATH="$(readlink -f "$(dirname "$TEST")")"
if [ -n "${NMTST_LAUNCH_DBUS-x}" ]; then
# autodetect whether to launch D-Bus based on the test path.
if [[ $TEST_PATH == */libnm/tests || $TEST_PATH == */libnm-glib/tests ]]; then
NMTST_LAUNCH_DBUS=yes
else
NMTST_LAUNCH_DBUS=no
fi
fi
# some tests require you to cd into the base directory.
# do that.
if [ "$NMTST_VALGRIND_NO_CD" == "" ]; then
cd "$TEST_PATH"
TEST="./$(basename "$TEST")"
fi
fi
if [ "$NMTST_LAUNCH_DBUS" == "yes" ]; then
# Spawn DBus
eval `dbus-launch --sh-syntax`
trap "kill $DBUS_SESSION_BUS_PID" EXIT
fi
if [ "$NMTST_NO_VALGRIND" != "" ]; then
"$TEST" "$@"
exit $?
fi
LOGFILE="valgrind-`echo "$TEST" | tr -cd '[:alpha:]-'`.log"
export G_SLICE=always-malloc
export G_DEBUG=gc-friendly
"${NMTST_LIBTOOL[@]}" "$NMTST_VALGRIND" \
--quiet \
--error-exitcode=$VALGRIND_ERROR \
--leak-check=full \
--gen-suppressions=all \
--suppressions="$SUPPRESSIONS" \
--num-callers=100 \
--log-file="$LOGFILE" \
"$TEST" \
"$@"
RESULT=$?
test -s "$LOGFILE"
HAS_ERRORS=$?
if [ $RESULT -ne 0 -a $RESULT -ne 77 ]; then
if [ $HAS_ERRORS -ne 0 ]; then
rm -f "$LOGFILE"
elif [ $RESULT -ne $VALGRIND_ERROR ]; then
# the test (probably) didn't fail due to valgrind.
echo "The test failed. Also check the valgrind log at '`realpath "$LOGFILE"`'" >&2
else
echo "valgrind failed! Check the log at '`realpath "$LOGFILE"`'" >&2
UNRESOLVED=$(awk -F: '/obj:\// {print $NF}' "$LOGFILE" | sort | uniq)
if [ -n "$UNRESOLVED" ]; then
echo Some addresses could not be resolved into symbols. >&2
echo The errors might get suppressed when you install the debuging symbols. >&2
if [ -x /usr/bin/dnf ]; then
echo Hint: dnf debuginfo-install $UNRESOLVED >&2
elif [ -x /usr/bin/debuginfo-install ]; then
echo Hint: debuginfo-install $UNRESOLVED >&2
else
echo Files without debugging symbols: $UNRESOLVED >&2
fi
fi
fi
exit $RESULT
fi
if [ $HAS_ERRORS -eq 0 ]; then
# shouldn't actually happen...
echo "valgrind succeeded, but log is not empty: '`realpath "$LOGFILE"`'" >&2
exit 1
fi
rm -f "$LOGFILE"
exit $RESULT
|