|
| 1 | +#! /bin/bash |
| 2 | +# SPDX-License-Identifier: GPL-2.0 |
| 3 | + |
| 4 | +set -e |
| 5 | +set -u |
| 6 | + |
| 7 | +unset KBUILD_OUTPUT |
| 8 | + |
| 9 | +current_dir="$(realpath "$(dirname "$0")")" |
| 10 | +build_dir="$current_dir" |
| 11 | + |
| 12 | +build_include="$current_dir/include.sh" |
| 13 | +if test -f "$build_include"; then |
| 14 | + # this include will define "$mk_build_dir" as the location the test was |
| 15 | + # built. We will need this if the tests are installed in a location |
| 16 | + # other than the kernel source |
| 17 | + |
| 18 | + source "$build_include" |
| 19 | + build_dir="$mk_build_dir" |
| 20 | +fi |
| 21 | + |
| 22 | +# This test requires kernel source and the *.gcda data therein |
| 23 | +# Locate the top level of the kernel source, and the net/rds |
| 24 | +# subfolder with the appropriate *.gcno object files |
| 25 | +ksrc_dir="$(realpath "$build_dir"/../../../../../)" |
| 26 | +kconfig="$ksrc_dir/.config" |
| 27 | +obj_dir="$ksrc_dir/net/rds" |
| 28 | + |
| 29 | +GCOV_CMD=gcov |
| 30 | + |
| 31 | +#check to see if the host has the required packages to generate a gcov report |
| 32 | +check_gcov_env() |
| 33 | +{ |
| 34 | + if ! which "$GCOV_CMD" > /dev/null 2>&1; then |
| 35 | + echo "Warning: Could not find gcov. " |
| 36 | + GENERATE_GCOV_REPORT=0 |
| 37 | + return |
| 38 | + fi |
| 39 | + |
| 40 | + # the gcov version must match the gcc version |
| 41 | + GCC_VER=$(gcc -dumpfullversion) |
| 42 | + GCOV_VER=$($GCOV_CMD -v | grep gcov | awk '{print $3}'| awk 'BEGIN {FS="-"}{print $1}') |
| 43 | + if [ "$GCOV_VER" != "$GCC_VER" ]; then |
| 44 | + #attempt to find a matching gcov version |
| 45 | + GCOV_CMD=gcov-$(gcc -dumpversion) |
| 46 | + |
| 47 | + if ! which "$GCOV_CMD" > /dev/null 2>&1; then |
| 48 | + echo "Warning: Could not find an appropriate gcov installation. \ |
| 49 | + gcov version must match gcc version" |
| 50 | + GENERATE_GCOV_REPORT=0 |
| 51 | + return |
| 52 | + fi |
| 53 | + |
| 54 | + #recheck version number of found gcov executable |
| 55 | + GCOV_VER=$($GCOV_CMD -v | grep gcov | awk '{print $3}'| \ |
| 56 | + awk 'BEGIN {FS="-"}{print $1}') |
| 57 | + if [ "$GCOV_VER" != "$GCC_VER" ]; then |
| 58 | + echo "Warning: Could not find an appropriate gcov installation. \ |
| 59 | + gcov version must match gcc version" |
| 60 | + GENERATE_GCOV_REPORT=0 |
| 61 | + else |
| 62 | + echo "Warning: Mismatched gcc and gcov detected. Using $GCOV_CMD" |
| 63 | + fi |
| 64 | + fi |
| 65 | +} |
| 66 | + |
| 67 | +# Check to see if the kconfig has the required configs to generate a coverage report |
| 68 | +check_gcov_conf() |
| 69 | +{ |
| 70 | + if ! grep -x "CONFIG_GCOV_PROFILE_RDS=y" "$kconfig" > /dev/null 2>&1; then |
| 71 | + echo "INFO: CONFIG_GCOV_PROFILE_RDS should be enabled for coverage reports" |
| 72 | + GENERATE_GCOV_REPORT=0 |
| 73 | + fi |
| 74 | + if ! grep -x "CONFIG_GCOV_KERNEL=y" "$kconfig" > /dev/null 2>&1; then |
| 75 | + echo "INFO: CONFIG_GCOV_KERNEL should be enabled for coverage reports" |
| 76 | + GENERATE_GCOV_REPORT=0 |
| 77 | + fi |
| 78 | + if grep -x "CONFIG_GCOV_PROFILE_ALL=y" "$kconfig" > /dev/null 2>&1; then |
| 79 | + echo "INFO: CONFIG_GCOV_PROFILE_ALL should be disabled for coverage reports" |
| 80 | + GENERATE_GCOV_REPORT=0 |
| 81 | + fi |
| 82 | + |
| 83 | + if [ "$GENERATE_GCOV_REPORT" -eq 0 ]; then |
| 84 | + echo "To enable gcov reports, please run "\ |
| 85 | + "\"tools/testing/selftests/net/rds/config.sh -g\" and rebuild the kernel" |
| 86 | + else |
| 87 | + # if we have the required kernel configs, proceed to check the environment to |
| 88 | + # ensure we have the required gcov packages |
| 89 | + check_gcov_env |
| 90 | + fi |
| 91 | +} |
| 92 | + |
| 93 | +# Kselftest framework requirement - SKIP code is 4. |
| 94 | +check_conf_enabled() { |
| 95 | + if ! grep -x "$1=y" "$kconfig" > /dev/null 2>&1; then |
| 96 | + echo "selftests: [SKIP] This test requires $1 enabled" |
| 97 | + echo "Please run tools/testing/selftests/net/rds/config.sh and rebuild the kernel" |
| 98 | + exit 4 |
| 99 | + fi |
| 100 | +} |
| 101 | +check_conf_disabled() { |
| 102 | + if grep -x "$1=y" "$kconfig" > /dev/null 2>&1; then |
| 103 | + echo "selftests: [SKIP] This test requires $1 disabled" |
| 104 | + echo "Please run tools/testing/selftests/net/rds/config.sh and rebuild the kernel" |
| 105 | + exit 4 |
| 106 | + fi |
| 107 | +} |
| 108 | +check_conf() { |
| 109 | + check_conf_enabled CONFIG_NET_SCH_NETEM |
| 110 | + check_conf_enabled CONFIG_VETH |
| 111 | + check_conf_enabled CONFIG_NET_NS |
| 112 | + check_conf_enabled CONFIG_RDS_TCP |
| 113 | + check_conf_enabled CONFIG_RDS |
| 114 | + check_conf_disabled CONFIG_MODULES |
| 115 | +} |
| 116 | + |
| 117 | +check_env() |
| 118 | +{ |
| 119 | + if ! test -d "$obj_dir"; then |
| 120 | + echo "selftests: [SKIP] This test requires a kernel source tree" |
| 121 | + exit 4 |
| 122 | + fi |
| 123 | + if ! test -e "$kconfig"; then |
| 124 | + echo "selftests: [SKIP] This test requires a configured kernel source tree" |
| 125 | + exit 4 |
| 126 | + fi |
| 127 | + if ! which strace > /dev/null 2>&1; then |
| 128 | + echo "selftests: [SKIP] Could not run test without strace" |
| 129 | + exit 4 |
| 130 | + fi |
| 131 | + if ! which tcpdump > /dev/null 2>&1; then |
| 132 | + echo "selftests: [SKIP] Could not run test without tcpdump" |
| 133 | + exit 4 |
| 134 | + fi |
| 135 | + |
| 136 | + if ! which python3 > /dev/null 2>&1; then |
| 137 | + echo "selftests: [SKIP] Could not run test without python3" |
| 138 | + exit 4 |
| 139 | + fi |
| 140 | + |
| 141 | + python_major=$(python3 -c "import sys; print(sys.version_info[0])") |
| 142 | + python_minor=$(python3 -c "import sys; print(sys.version_info[1])") |
| 143 | + if [[ python_major -lt 3 || ( python_major -eq 3 && python_minor -lt 9 ) ]] ; then |
| 144 | + echo "selftests: [SKIP] Could not run test without at least python3.9" |
| 145 | + python3 -V |
| 146 | + exit 4 |
| 147 | + fi |
| 148 | +} |
| 149 | + |
| 150 | +LOG_DIR="$current_dir"/rds_logs |
| 151 | +PLOSS=0 |
| 152 | +PCORRUPT=0 |
| 153 | +PDUP=0 |
| 154 | +GENERATE_GCOV_REPORT=1 |
| 155 | +while getopts "d:l:c:u:" opt; do |
| 156 | + case ${opt} in |
| 157 | + d) |
| 158 | + LOG_DIR=${OPTARG} |
| 159 | + ;; |
| 160 | + l) |
| 161 | + PLOSS=${OPTARG} |
| 162 | + ;; |
| 163 | + c) |
| 164 | + PCORRUPT=${OPTARG} |
| 165 | + ;; |
| 166 | + u) |
| 167 | + PDUP=${OPTARG} |
| 168 | + ;; |
| 169 | + :) |
| 170 | + echo "USAGE: run.sh [-d logdir] [-l packet_loss] [-c packet_corruption]" \ |
| 171 | + "[-u packet_duplcate] [-g]" |
| 172 | + exit 1 |
| 173 | + ;; |
| 174 | + ?) |
| 175 | + echo "Invalid option: -${OPTARG}." |
| 176 | + exit 1 |
| 177 | + ;; |
| 178 | + esac |
| 179 | +done |
| 180 | + |
| 181 | + |
| 182 | +check_env |
| 183 | +check_conf |
| 184 | +check_gcov_conf |
| 185 | + |
| 186 | + |
| 187 | +rm -fr "$LOG_DIR" |
| 188 | +TRACE_FILE="${LOG_DIR}/rds-strace.txt" |
| 189 | +COVR_DIR="${LOG_DIR}/coverage/" |
| 190 | +mkdir -p "$LOG_DIR" |
| 191 | +mkdir -p "$COVR_DIR" |
| 192 | + |
| 193 | +set +e |
| 194 | +echo running RDS tests... |
| 195 | +echo Traces will be logged to "$TRACE_FILE" |
| 196 | +rm -f "$TRACE_FILE" |
| 197 | +strace -T -tt -o "$TRACE_FILE" python3 "$(dirname "$0")/test.py" --timeout 400 -d "$LOG_DIR" \ |
| 198 | + -l "$PLOSS" -c "$PCORRUPT" -u "$PDUP" |
| 199 | + |
| 200 | +test_rc=$? |
| 201 | +dmesg > "${LOG_DIR}/dmesg.out" |
| 202 | + |
| 203 | +if [ "$GENERATE_GCOV_REPORT" -eq 1 ]; then |
| 204 | + echo saving coverage data... |
| 205 | + (set +x; cd /sys/kernel/debug/gcov; find ./* -name '*.gcda' | \ |
| 206 | + while read -r f |
| 207 | + do |
| 208 | + cat < "/sys/kernel/debug/gcov/$f" > "/$f" |
| 209 | + done) |
| 210 | + |
| 211 | + echo running gcovr... |
| 212 | + gcovr -s --html-details --gcov-executable "$GCOV_CMD" --gcov-ignore-parse-errors \ |
| 213 | + -o "${COVR_DIR}/gcovr" "${ksrc_dir}/net/rds/" |
| 214 | +else |
| 215 | + echo "Coverage report will be skipped" |
| 216 | +fi |
| 217 | + |
| 218 | +if [ "$test_rc" -eq 0 ]; then |
| 219 | + echo "PASS: Test completed successfully" |
| 220 | +else |
| 221 | + echo "FAIL: Test failed" |
| 222 | +fi |
| 223 | + |
| 224 | +exit "$test_rc" |
0 commit comments