diff options
Diffstat (limited to 'tools/test-common.sh')
-rwxr-xr-x | tools/test-common.sh | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/tools/test-common.sh b/tools/test-common.sh new file mode 100755 index 00000000..2656eece --- /dev/null +++ b/tools/test-common.sh @@ -0,0 +1,160 @@ +#!/bin/bash +# +# Copyright 2013 Gerald Combs <gerald@wireshark.org> +# +# Wireshark - Network traffic analyzer +# By Gerald Combs <gerald@wireshark.org> +# Copyright 1998 Gerald Combs +# +# SPDX-License-Identifier: GPL-2.0-or-later + +# Common variables and functions for fuzz and randpkt tests. + +# This needs to point to a 'date' that supports %s. +if [ -z "$TEST_TYPE" ] ; then + echo "TEST_TYPE must be defined by the sourcing script." + exit 1 +fi + +DATE=/bin/date +BASE_NAME=$TEST_TYPE-$($DATE +%Y-%m-%d)-$$ + +# Directory containing binaries. Default: cmake run directory. +if [ -z "$WIRESHARK_BIN_DIR" ]; then + WIRESHARK_BIN_DIR=run +fi + +# Temporary file directory and names. +# (had problems with this on cygwin, tried TMP_DIR=./ which worked) +TMP_DIR=/tmp +if [ "$OSTYPE" == "cygwin" ] ; then + TMP_DIR=$(cygpath --windows "$TMP_DIR") +fi +TMP_FILE=$BASE_NAME.pcap +ERR_FILE=$BASE_NAME.err + +# Loop this many times (< 1 loops forever) +MAX_PASSES=0 + +# These may be set to your liking +# Stop the child process if it's running longer than x seconds +MAX_CPU_TIME=600 +# Stop the child process if it's using more than y * 1024 bytes +MAX_VMEM=1000000 +# Stop the child process if its stack is larger than z * 1024 bytes +# Windows XP: 2033 +# Windows 7: 2034 +# Mac OS X 10.6: 8192 +# Linux 2.6.24: 8192 +# Solaris 10: 8192 +MAX_STACK=2033 +# Insert z times an error into the capture file (0.02 seems to be a good value to find errors) +ERR_PROB=0.02 +# Maximum number of packets to fuzz +MAX_FUZZ_PACKETS=50000 + +# Call *after* any changes to WIRESHARK_BIN_DIR (e.g., via command-line options) +function ws_bind_exec_paths() { +# Tweak the following to your liking. Editcap must support "-E". +TSHARK="$WIRESHARK_BIN_DIR/tshark" +EDITCAP="$WIRESHARK_BIN_DIR/editcap" +CAPINFOS="$WIRESHARK_BIN_DIR/capinfos" +RANDPKT="$WIRESHARK_BIN_DIR/randpkt" + +if [ "$WIRESHARK_BIN_DIR" = "." ]; then + export WIRESHARK_RUN_FROM_BUILD_DIRECTORY=1 +fi +} + +function ws_check_exec() { +NOTFOUND=0 +for i in "$@" ; do + if [ ! -x "$i" ]; then + echo "Couldn't find \"$i\"" + NOTFOUND=1 + fi +done +if [ $NOTFOUND -eq 1 ]; then + exit 1 +fi +} + +source "$(dirname "$0")"/debug-alloc.env + +# Address Sanitizer options +export ASAN_OPTIONS=detect_leaks=0 + +# See if we were configured with gcc or clang's AddressSanitizer. +CONFIGURED_WITH_ASAN=0 +# If tshark is built with ASAN this will generate an error. We could +# also pass help=1 and look for help text. +ASAN_OPTIONS=Invalid_Option_Flag $TSHARK -h > /dev/null 2>&1 +if [ $? -ne 0 ] ; then + CONFIGURED_WITH_ASAN=1 +fi +export CONFIGURED_WITH_ASAN + +# Create an error report +function ws_exit_error() { + echo -e "\n ERROR" + echo -e "Processing failed. Capture info follows:\n" + echo " Input file: $CF" + echo " Output file: $TMP_DIR/$TMP_FILE" + echo " Pass: $PASS" + echo + + # Fill in build information + { + if [ -n "$CI_COMMIT_BRANCH" ] ; then + printf "Branch: %s\\n" "$CI_COMMIT_BRANCH" + else + printf "Branch: %s\\n" "$(git rev-parse --abbrev-ref HEAD)" + fi + + printf "Input file: %s\\n" "$CF" + + if [ -n "$CI_JOB_NAME" ] ; then + printf "CI job name: %s, ID: %s\\n" "$CI_JOB_NAME" "$CI_JOB_ID" + printf "CI job URL: %s\\n" "$CI_JOB_URL" + fi + + printf "Return value: %s\\n" "$RETVAL" + printf "Dissector bug: %s\\n" "$DISSECTOR_BUG" + if [ "$VALGRIND" -eq 1 ] ; then + printf "Valgrind error count: %s\\n" "$VG_ERR_CNT" + fi + + printf "Date and time: %s\\n" "$( date --utc )" + + SINCE_HOURS=48 + if [ -d "${GIT_DIR:-.git}" ] ; then + printf "\\nCommits in the last %s hours:\\n" $SINCE_HOURS + git --no-pager log --oneline --no-decorate --since=${SINCE_HOURS}hours + printf "\\n" + fi + + printf "Build host information:\\n" + uname -srvm + lsb_release -a 2> /dev/null + printf "\\n" + + } > "$TMP_DIR/${ERR_FILE}.header" + + # Trim the stderr output if needed + ERR_SIZE=$(du -sk $TMP_DIR/$ERR_FILE | awk '{ print $1 }') + if [ $ERR_SIZE -ge 5000 ] ; then + mv $TMP_DIR/$ERR_FILE $TMP_DIR/${ERR_FILE}.full + head -n 2000 $TMP_DIR/${ERR_FILE}.full > $TMP_DIR/$ERR_FILE + echo -e "\n\n[ Output removed ]\n\n" >> $TMP_DIR/$ERR_FILE + tail -n 2000 $TMP_DIR/${ERR_FILE}.full >> $TMP_DIR/$ERR_FILE + rm -f $TMP_DIR/${ERR_FILE}.full + fi + + cat $TMP_DIR/${ERR_FILE} >> $TMP_DIR/${ERR_FILE}.header + mv $TMP_DIR/${ERR_FILE}.header $TMP_DIR/${ERR_FILE} + + echo -e "stderr follows:\n" + cat $TMP_DIR/$ERR_FILE + + exit 255 +} |