CI testing: Drop the Regression/testsuite-upstream-raw TC
This commit is contained in:
		
							parent
							
								
									6e2eede1a1
								
							
						
					
					
						commit
						1c8c98dbcd
					
				| @ -1,158 +0,0 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| # Show the testcase list on demand. | ||||
| if [[ "$1" == "TCLIST" ]]; then | ||||
|     if [[ "$(arch)" == "s390x" ]]; then | ||||
|         # Save the s390x machine time (regardless the rhel major): | ||||
|         # Almost all the testcases are failing there, and those, that | ||||
|         # do not, are flaky. | ||||
|         echo -n "notest.exp" | ||||
|     else | ||||
|         echo -n "bpf-asm.exp bpf.exp" | ||||
|     fi | ||||
|     exit 0 | ||||
| fi | ||||
| 
 | ||||
| _LOG=systemtap.check | ||||
| cp systemtap.sum $_LOG | ||||
| 
 | ||||
| _cleanup() | ||||
| { | ||||
|     rm $_LOG | ||||
| } | ||||
| trap _cleanup EXIT | ||||
| 
 | ||||
| set -xe | ||||
| 
 | ||||
| EXPECTED_PASSES_TRESHOLD=-1 | ||||
| 
 | ||||
| if test $(rpm --eval '0%{rhel}') -eq 8; then | ||||
|     # systemtap-4.0-7.el8, kernel-4.18.0-64.el8 | ||||
|     case `arch` in | ||||
|         x86_64) | ||||
|             EXPECTED_PASSES_TRESHOLD=55 | ||||
|             sed -i '/FAIL: bigmap1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: cast_op_tracepoint.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: logging1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: perf1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: pr23875_loop.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: pr23875_smash.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: reg_alloc3.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: string3.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: timer1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: timer2.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : | ||||
|         ;; | ||||
|         aarch64) | ||||
|             EXPECTED_PASSES_TRESHOLD=58 | ||||
|             sed -i '/FAIL: bigmap1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: logging1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: perf1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: perf2.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: pr23875_loop.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: pr23875_smash.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: reg_alloc3.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: string3.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: timer2.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : | ||||
|         ;; | ||||
|         ppc64le) | ||||
|             EXPECTED_PASSES_TRESHOLD=53 | ||||
|             sed -i '/FAIL: array.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: array_preinit.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: context_vars1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: context_vars2.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: context_vars2.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: context_vars3.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: globals2.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: globals3.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: kprobes.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: logging1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: perf1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: perf2.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: pr23875_loop.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: pr23875_loop.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: pr23875_smash.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: reg_alloc3.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: string3.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: timer2.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : | ||||
|         ;; | ||||
|         s390x) | ||||
|             # Many testcases fail for s390x, many of them are flaky | ||||
|             # Not worth testing at all at this stage at all probably. | ||||
|             echo "INFO: UNSUPPORTED RHEL7 ARCHITECTIRE ($(arch))" | ||||
|             exit 0 | ||||
|         ;; | ||||
|         *) | ||||
|             echo "ERROR: UNSUPPORTED RHEL8 ARCHITECTIRE" | ||||
|             exit 1 | ||||
|         ;; | ||||
|     esac | ||||
| elif test $(rpm --eval '0%{rhel}') -eq 7; then | ||||
|     case `arch` in | ||||
|         x86_64) | ||||
|             # (rhel7) systemtap-3.3-3.el7.x86_64, kernel-3.10.0-993.el7.x86_64 | ||||
|             if test $(rpm -q --queryformat='%{version}\n' kernel | awk -F. '{print $1}') -eq 3; then | ||||
|                 EXPECTED_PASSES_TRESHOLD=32 | ||||
|                 sed -i '/FAIL: cast_op_tracepoint.stp/d' $_LOG || : | ||||
|                 sed -i '/FAIL: perf2.stp/d' $_LOG || : | ||||
|                 sed -i '/FAIL: reg_alloc3.stp/d' $_LOG || : | ||||
|                 sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : | ||||
|             elif test $(rpm -q --queryformat='%{version}\n' kernel | awk -F. '{print $1}') -eq 4; then | ||||
|             # (rhel-alt-7) systemtap-3.3-3.el7.x86_64, kernel-4.14.0-115.el7a.x86_64 | ||||
|                 echo "ERROR: known bug on rhel-alt ('map entry 0: Function not implemented')" | ||||
|                 echo "<@fche> # CONFIG_BPF_SYSCALL is not set" | ||||
|                 exit 0 | ||||
|             else | ||||
|                 echo "ERROR: UNSUPPORTED RHEL7 KERNEL VERSION" | ||||
|                 exit 1 | ||||
|             fi | ||||
|         ;; | ||||
|     *) | ||||
|         echo "INFO: UNSUPPORTED RHEL7 ARCHITECTIRE ($(arch))" | ||||
|         exit 0 | ||||
|         ;; | ||||
|     esac | ||||
| elif test $(rpm --eval '0%{fedora}') -eq 29; then | ||||
|     case `arch` in | ||||
|         x86_64) | ||||
| 	    EXPECTED_PASSES_TRESHOLD=33 | ||||
|             sed -i '/FAIL: array.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: bigmap1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: cast_op_tracepoint.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: no_end.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: printf.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: reg_alloc3.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: string1.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: timer2.stp/d' $_LOG || : | ||||
|             sed -i '/FAIL: tracepoint1.stp/d' $_LOG || : | ||||
|         ;; | ||||
|         *) | ||||
|             # No test results for other arches yet | ||||
|             true; | ||||
|         ;; | ||||
|     esac | ||||
| else | ||||
|     echo "ERROR: UNSUPPORTED RHELMAJOR" | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| true _v_v_v_v_v_v_v_v_v_v_v_  UNEXPECTED FAILURES: _v_v_v_v_v_v_v_v_v_v_v_v_v_v_ | ||||
| fgrep 'FAIL: ' $_LOG || : | ||||
| true -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^- | ||||
| 
 | ||||
| 
 | ||||
| EXPECTED_PASSES=$(grep -a '^PASS: ' $_LOG | wc -l) | ||||
| UNEXPECTED_FAILURES=$(grep -a '^FAIL: ' $_LOG | wc -l) | ||||
| 
 | ||||
| test ${EXPECTED_PASSES_TRESHOLD} -gt 1 | ||||
| test 0${EXPECTED_PASSES} -ge 0${EXPECTED_PASSES_TRESHOLD} | ||||
| test 0${UNEXPECTED_FAILURES} -eq 0 | ||||
| 
 | ||||
| rm $_LOG | ||||
| 
 | ||||
| set +xe | ||||
| 
 | ||||
| 
 | ||||
| @ -1,55 +0,0 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| if [[ "$1" == "TCLIST" ]]; then | ||||
|     # Empty list means to run all the testcases: | ||||
|     exit 0 | ||||
| fi | ||||
| 
 | ||||
| set -xe | ||||
| 
 | ||||
| # It turns out that dg-extract-results.sh relies on the logfiles | ||||
| # summary (# of expected passes, # of unexpected failures, etc.) and | ||||
| # counts the summary values based on that.  This is is okay for the | ||||
| # normal dg-extract-results.sh use-case where it combines together | ||||
| # correct (per single testcase) logs coming from parallel GDB testcase | ||||
| # runs, where each of the input logfiles has such summary. | ||||
| # | ||||
| # But in our case we are combining incomplete log snippets coming from | ||||
| # various terminated/incomplete/partial testsuite runs (kernel | ||||
| # stall/crash, watchdog termination etc), where the log snippets do not | ||||
| # have that summary (with an exception of the very last one).  The | ||||
| # result is that only the last of the log snippets gets properly | ||||
| # counted, and the results from the other log snippets are ignored. | ||||
| # | ||||
| # rlRun "EXPECTED_PASSES=$(awk '/^# of expected passes/ {print $NF}' systemtap.sum)" | ||||
| # rlRun "UNEXPECTED_FAILURES=$(awk '/^# of unexpected failures/ {print $NF}' systemtap.sum)" | ||||
| # | ||||
| # So we really need to count the PASSes and FAILs on our own: | ||||
| # | ||||
| 
 | ||||
| EXPECTED_PASSES=$(grep -a '^PASS: ' systemtap.sum | wc -l) | ||||
| UNEXPECTED_FAILURES=$(grep -a '^FAIL: ' systemtap.sum | wc -l) | ||||
| 
 | ||||
| # | ||||
| # For this rough check, ignoring other states such as KFAIL and others | ||||
| # should be good enough. | ||||
| 
 | ||||
| case `arch` in | ||||
|     x86_64) | ||||
|         EXPECTED_PASSES_TRESHOLD=9000 | ||||
|         UNEXPECTED_FAILURES_TRESHOLD=800 | ||||
|         ;; | ||||
|     ppc64*) | ||||
|         EXPECTED_PASSES_TRESHOLD=8000 | ||||
|         UNEXPECTED_FAILURES_TRESHOLD=750 | ||||
|         ;; | ||||
|     *) | ||||
|         EXPECTED_PASSES_TRESHOLD=8000 | ||||
|         UNEXPECTED_FAILURES_TRESHOLD=500 | ||||
|         ;; | ||||
| esac | ||||
| 
 | ||||
| test 0${EXPECTED_PASSES} -ge 0${EXPECTED_PASSES_TRESHOLD} | ||||
| test 0${UNEXPECTED_FAILURES} -le 0${UNEXPECTED_FAILURES_TRESHOLD} | ||||
| 
 | ||||
| set +xe | ||||
| @ -1,453 +0,0 @@ | ||||
| #! /bin/sh | ||||
| 
 | ||||
| # For a specified tool and optional list of test variants, extract | ||||
| # test results from one or more test summary (.sum) files and combine | ||||
| # the results into a new test summary file, sent to the standard output. | ||||
| # The resulting file can be used with test result comparison scripts for | ||||
| # results from tests that were run in parallel.  See usage() below. | ||||
| 
 | ||||
| # Copyright (C) 2008-2016 Free Software Foundation, Inc. | ||||
| # Contributed by Janis Johnson <janis187@us.ibm.com> | ||||
| # | ||||
| # This file is part of GCC. | ||||
| # | ||||
| # GCC is free software; you can redistribute it and/or modify | ||||
| # it under the terms of the GNU General Public License as published by | ||||
| # the Free Software Foundation; either version 3, or (at your option) | ||||
| # any later version. | ||||
| # | ||||
| # GCC is distributed in the hope that it will be useful, | ||||
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
| # GNU General Public License for more details. | ||||
| # | ||||
| # You should have received a copy of the GNU General Public License | ||||
| # along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||
| 
 | ||||
| PROGNAME=dg-extract-results.sh | ||||
| 
 | ||||
| # Try to use the python version if possible, since it tends to be faster. | ||||
| PYTHON_VER=`echo "$0" | sed 's/sh$/py/'` | ||||
| if test "$PYTHON_VER" != "$0" && | ||||
|    test -f "$PYTHON_VER" && | ||||
|    python -c 'import sys; sys.exit (0 if sys.version_info >= (2, 6) else 1)' \ | ||||
|      > /dev/null 2> /dev/null; then | ||||
|   exec python $PYTHON_VER "$@" | ||||
| fi | ||||
| 
 | ||||
| usage() { | ||||
|   cat <<EOF >&2 | ||||
| Usage: $PROGNAME [-t tool] [-l variant-list] [-L] sum-file ... | ||||
| 
 | ||||
|     tool           The tool (e.g. g++, libffi) for which to create a | ||||
|                    new test summary file.  If not specified then all | ||||
|                    specified sum files must be for the same tool. | ||||
|     variant-list   One or more test variant names.  If the list is | ||||
|                    not specified then one is constructed from all | ||||
|                    variants in the files for <tool>. | ||||
|     sum-file       A test summary file with the format of those | ||||
|                    created by runtest from DejaGnu. | ||||
|     If -L is used, merge *.log files instead of *.sum.  In this | ||||
|     mode the exact order of lines may not be preserved, just different | ||||
|     Running *.exp chunks should be in correct order. | ||||
| EOF | ||||
| } | ||||
| 
 | ||||
| # Write a message to the standard error. | ||||
| 
 | ||||
| msg() { | ||||
|   echo "$@" >&2 | ||||
| } | ||||
| 
 | ||||
| # Parse the command-line options. | ||||
| 
 | ||||
| VARIANTS="" | ||||
| TOOL="" | ||||
| MODE="sum" | ||||
| 
 | ||||
| while getopts "l:t:L" ARG; do | ||||
|   case $ARG in | ||||
|   l)  VARIANTS="${VARIANTS} ${OPTARG}";; | ||||
|   t)  test -z "$TOOL" || (msg "${PROGNAME}: only one tool can be specified"; exit 1); | ||||
|       TOOL="${OPTARG}";; | ||||
|   L)  MODE="log";; | ||||
|   \?) usage; exit 0;; | ||||
|   esac | ||||
| done | ||||
| shift `expr ${OPTIND} - 1` | ||||
| 
 | ||||
| if test $# -lt 1 ; then | ||||
|   usage | ||||
|   exit 1 | ||||
| fi | ||||
| 
 | ||||
| TMPDIR=${TMPDIR-/tmp} | ||||
| SUM_FILES="$@" | ||||
| FIRST_SUM=$1 | ||||
| TMP= | ||||
| trap 'EXIT_STATUS=$?; rm -rf $TMP && exit $EXIT_STATUS' 0 | ||||
| # Create a (secure) tmp directory for tmp files. | ||||
| { | ||||
|   TMP=`(umask 077 && mktemp -d -q "${TMPDIR}/dg-combine-results-$$-XXXXXX") 2>/dev/null` && | ||||
|   test -n "$TMP" && test -d "$TMP" | ||||
| } || | ||||
| { | ||||
|   TMP=${TMPDIR}/dg-combine-results-$$-$RANDOM | ||||
|   (umask 077 && mkdir $TMP) | ||||
| } || | ||||
| { | ||||
|   msg "${PROGNAME}: cannot create a temporary directory" | ||||
|   { (exit 1); exit 1; } | ||||
| } | ||||
| 
 | ||||
| # Find a good awk. | ||||
| 
 | ||||
| if test -z "$AWK" ; then | ||||
|   for AWK in gawk nawk awk | ||||
|   do | ||||
|     if type $AWK 2>&1 | grep 'not found' > /dev/null 2>&1 ; then | ||||
|       : | ||||
|     else | ||||
|       break | ||||
|     fi | ||||
|   done | ||||
| fi | ||||
| 
 | ||||
| # Verify that the specified summary files exist. | ||||
| 
 | ||||
| ERROR=0 | ||||
| for FILE in $SUM_FILES | ||||
| do | ||||
|   if ! test -f $FILE ; then | ||||
|     msg "${PROGNAME}: file $FILE does not exist." | ||||
|     ERROR=1 | ||||
|   fi | ||||
| done | ||||
| test $ERROR -eq 0 || exit 1 | ||||
| 
 | ||||
| # Test if grep supports the '--text' option | ||||
| 
 | ||||
| GREP=grep | ||||
| 
 | ||||
| if echo -e '\x00foo\x00' | $GREP --text foo > /dev/null 2>&1 ; then | ||||
|   GREP="grep --text" | ||||
| else | ||||
|   # Our grep does not recognize the '--text' option.  We have to | ||||
|   # treat our files in order to remove any non-printable character. | ||||
|   for file in $SUM_FILES ; do | ||||
|     mv $file ${file}.orig | ||||
|     cat -v ${file}.orig > $file | ||||
|   done | ||||
| fi | ||||
| 
 | ||||
| if [ -z "$TOOL" ]; then | ||||
|   # If no tool was specified, all specified summary files must be for | ||||
|   # the same tool. | ||||
| 
 | ||||
|   CNT=`$GREP '=== .* tests ===' $SUM_FILES | $AWK '{ print $3 }' | sort -u | wc -l` | ||||
|   if [ $CNT -eq 1 ]; then | ||||
|     TOOL=`$GREP '=== .* tests ===' $FIRST_SUM | $AWK '{ print $2 }'` | ||||
|   else | ||||
|     msg "${PROGNAME}: sum files are for multiple tools, specify a tool" | ||||
|     msg "" | ||||
|     usage | ||||
|     exit 1 | ||||
|   fi | ||||
| else | ||||
|   # Ignore the specified summary files that are not for this tool.  This | ||||
|   # should keep the relevant files in the same order. | ||||
| 
 | ||||
|   SUM_FILES=`$GREP -l "=== $TOOL" $SUM_FILES` | ||||
|   if test -z "$SUM_FILES" ; then | ||||
|     msg "${PROGNAME}: none of the specified files are results for $TOOL" | ||||
|     exit 1 | ||||
|   fi | ||||
| fi | ||||
| 
 | ||||
| if [ "$TOOL" = acats ]; then | ||||
|   # Acats *.sum or *.log files aren't dejagnu generated, and they have | ||||
|   # somewhat different format. | ||||
|   ACATS_AWK=${TMP}/acats.awk | ||||
|   cat <<EOF > $ACATS_AWK | ||||
| BEGIN { | ||||
|   print_prologue=1; curfile=""; insummary=0 | ||||
|   passcnt=0; failcnt=0; unsupcnt=0; failures="" | ||||
| } | ||||
| /^[ \t]*=== acats configuration ===/ { | ||||
|   insummary=0 | ||||
|   if (print_prologue) print | ||||
|   next | ||||
| } | ||||
| /^[ \t]*=== acats tests ===/ { | ||||
|   if (print_prologue) print | ||||
|   print_prologue=0 | ||||
|   next | ||||
| } | ||||
| /^Running chapter / { | ||||
|   if (curfile) close (curfile) | ||||
|   curfile="${TMP}/chapter-"\$3 | ||||
|   print >> curfile | ||||
|   next | ||||
| } | ||||
| /^[ \t]*=== acats Summary ===/ { | ||||
|   if (curfile) close (curfile) | ||||
|   curfile="" | ||||
|   insummary=1 | ||||
|   next | ||||
| } | ||||
| /^# of expected passes/		{ if (insummary == 1) passcnt += \$5; next; } | ||||
| /^# of unexpected failures/	{ if (insummary == 1) failcnt += \$5; next; } | ||||
| /^# of unsupported tests/	{ if (insummary == 1) unsupcnt += \$5; next; } | ||||
| /^\*\*\* FAILURES: / { | ||||
|   if (insummary == 1) { | ||||
|     if (failures) sub(/^\*\*\* FAILURES:/,"") | ||||
|     failures=failures""\$0 | ||||
|   } | ||||
| } | ||||
| { | ||||
|   if (print_prologue) { print; next } | ||||
|   if (curfile) print >> curfile | ||||
| } | ||||
| END { | ||||
|   system ("cat ${TMP}/chapter-*") | ||||
|   print "		=== acats Summary ===" | ||||
|   print "# of expected passes		" passcnt | ||||
|   print "# of unexpected failures	" failcnt | ||||
|   if (unsupcnt) print "# of unsupported tests		" unsupcnt | ||||
|   if (failures) print failures | ||||
| } | ||||
| EOF | ||||
| 
 | ||||
|   rm -f ${TMP}/chapter-* | ||||
|   $AWK -f $ACATS_AWK $SUM_FILES | ||||
|   exit 0 | ||||
| fi | ||||
| 
 | ||||
| # If no variants were specified, find all variants in the remaining | ||||
| # summary files.  Otherwise, ignore specified variants that aren't in | ||||
| # any of those summary files. | ||||
| 
 | ||||
| if test -z "$VARIANTS" ; then | ||||
|   VAR_AWK=${TMP}/variants.awk | ||||
|   cat <<EOF > $VAR_AWK | ||||
| /^Schedule of variations:/      { in_vars=1; next } | ||||
| /^$/                            { in_vars=0 } | ||||
| /^Running target/               { exit } | ||||
| { if (in_vars==1) print \$1; else next } | ||||
| EOF | ||||
| 
 | ||||
|   touch ${TMP}/varlist | ||||
|   for FILE in $SUM_FILES; do | ||||
|     $AWK -f $VAR_AWK $FILE >> ${TMP}/varlist | ||||
|   done | ||||
|   VARIANTS="`sort -u ${TMP}/varlist`" | ||||
| else | ||||
|   VARS="$VARIANTS" | ||||
|   VARIANTS="" | ||||
|   for VAR in $VARS | ||||
|   do | ||||
|     $GREP "Running target $VAR" $SUM_FILES > /dev/null && VARIANTS="$VARIANTS $VAR" | ||||
|   done | ||||
| fi | ||||
| 
 | ||||
| # Find out if we have more than one variant, or any at all. | ||||
| 
 | ||||
| VARIANT_COUNT=0 | ||||
| for VAR in $VARIANTS | ||||
| do | ||||
|   VARIANT_COUNT=`expr $VARIANT_COUNT + 1` | ||||
| done | ||||
| 
 | ||||
| if test $VARIANT_COUNT -eq 0 ; then | ||||
|   msg "${PROGNAME}: no file for $TOOL has results for the specified variants" | ||||
|   exit 1 | ||||
| fi | ||||
| 
 | ||||
| cat $SUM_FILES \ | ||||
|   | $AWK '/^Running/ { if ($2 != "target" && $3 == "...") print "EXPFILE: "$2 } ' \ | ||||
|   | sort -u > ${TMP}/expfiles | ||||
| 
 | ||||
| # Write the begining of the combined summary file. | ||||
| 
 | ||||
| head -n 2 $FIRST_SUM | ||||
| echo | ||||
| echo "		=== $TOOL tests ===" | ||||
| echo | ||||
| echo "Schedule of variations:" | ||||
| for VAR in $VARIANTS | ||||
| do | ||||
|   echo "    $VAR" | ||||
| done | ||||
| echo | ||||
| 
 | ||||
| # For each test variant for the tool, copy test reports from each of the | ||||
| # summary files.  Set up two awk scripts from within the loop to | ||||
| # initialize VAR and TOOL with the script, rather than assuming that the | ||||
| # available version of awk can pass variables from the command line. | ||||
| 
 | ||||
| for VAR in $VARIANTS | ||||
| do | ||||
|   GUTS_AWK=${TMP}/guts.awk | ||||
|   cat << EOF > $GUTS_AWK | ||||
| BEGIN { | ||||
|   variant="$VAR" | ||||
|   firstvar=1 | ||||
|   expfileno=1 | ||||
|   cnt=0 | ||||
|   print_using=0 | ||||
|   need_close=0 | ||||
| } | ||||
| /^EXPFILE: / { | ||||
|   expfiles[expfileno] = \$2 | ||||
|   expfilesr[\$2] = expfileno | ||||
|   expfileno = expfileno + 1 | ||||
| } | ||||
| /^Running target / { | ||||
|   curvar = \$3 | ||||
|   if (variant == curvar && firstvar == 1) { print; print_using=1; firstvar = 0 } | ||||
|   next | ||||
| } | ||||
| /^Using / { | ||||
|   if (variant == curvar && print_using) { print; next } | ||||
| } | ||||
| /^Running .*\\.exp \\.\\.\\./ { | ||||
|   print_using=0 | ||||
|   if (variant == curvar) { | ||||
|     if (need_close) close(curfile) | ||||
|     curfile="${TMP}/list"expfilesr[\$2] | ||||
|     expfileseen[\$2]=expfileseen[\$2] + 1 | ||||
|     need_close=0 | ||||
|     testname="00" | ||||
|     next | ||||
|   } | ||||
| } | ||||
| /^\t\t=== .* ===$/ { curvar = ""; next } | ||||
| /^(PASS|XPASS|FAIL|XFAIL|UNRESOLVED|WARNING|ERROR|UNSUPPORTED|UNTESTED|KFAIL):/ { | ||||
|   testname=\$2 | ||||
|   # Ugly hack for gfortran.dg/dg.exp | ||||
|   if ("$TOOL" == "gfortran" && testname ~ /^gfortran.dg\/g77\//) | ||||
|     testname="h"testname | ||||
| } | ||||
| /^$/ { if ("$MODE" == "sum") next } | ||||
| { if (variant == curvar && curfile) { | ||||
|     if ("$MODE" == "sum") { | ||||
|       printf "%s %08d|", testname, cnt >> curfile | ||||
|       cnt = cnt + 1 | ||||
|     } | ||||
|     filewritten[curfile]=1 | ||||
|     need_close=1 | ||||
|     print >> curfile | ||||
|   } else | ||||
|     next | ||||
| } | ||||
| END { | ||||
|   n=1 | ||||
|   while (n < expfileno) { | ||||
|     if (expfileseen[expfiles[n]]) { | ||||
|       print "Running "expfiles[n]" ..." | ||||
|       if (filewritten["${TMP}/list"n]) { | ||||
| 	if (expfileseen[expfiles[n]] == 1) | ||||
| 	  cmd="cat" | ||||
| 	else | ||||
| 	  cmd="LC_ALL=C sort" | ||||
| 	if ("$MODE" == "sum") | ||||
| 	  system (cmd" ${TMP}/list"n" | sed -n 's/^[^ ]* [^ |]*|//p'") | ||||
| 	else | ||||
| 	  system ("cat ${TMP}/list"n) | ||||
|       } | ||||
|     } | ||||
|     n = n + 1 | ||||
|   } | ||||
| } | ||||
| EOF | ||||
| 
 | ||||
|   SUMS_AWK=${TMP}/sums.awk | ||||
|   rm -f $SUMS_AWK | ||||
|   cat << EOF > $SUMS_AWK | ||||
| BEGIN { | ||||
|   variant="$VAR" | ||||
|   tool="$TOOL" | ||||
|   passcnt=0; failcnt=0; untstcnt=0; xpasscnt=0; xfailcnt=0; kpasscnt=0; kfailcnt=0; unsupcnt=0; unrescnt=0; | ||||
|   curvar=""; insummary=0 | ||||
| } | ||||
| /^Running target /		{ curvar = \$3; next } | ||||
| /^# of /			{ if (variant == curvar) insummary = 1 } | ||||
| /^# of expected passes/		{ if (insummary == 1) passcnt += \$5; next; } | ||||
| /^# of unexpected successes/	{ if (insummary == 1) xpasscnt += \$5; next; } | ||||
| /^# of unexpected failures/	{ if (insummary == 1) failcnt += \$5; next; } | ||||
| /^# of expected failures/	{ if (insummary == 1) xfailcnt += \$5; next; } | ||||
| /^# of unknown successes/	{ if (insummary == 1) kpasscnt += \$5; next; } | ||||
| /^# of known failures/		{ if (insummary == 1) kfailcnt += \$5; next; } | ||||
| /^# of untested testcases/	{ if (insummary == 1) untstcnt += \$5; next; } | ||||
| /^# of unresolved testcases/	{ if (insummary == 1) unrescnt += \$5; next; } | ||||
| /^# of unsupported tests/	{ if (insummary == 1) unsupcnt += \$5; next; } | ||||
| /^$/				{ if (insummary == 1) | ||||
| 				    { insummary = 0; curvar = "" } | ||||
| 				  next | ||||
| 				} | ||||
| { next } | ||||
| END { | ||||
|   printf ("\t\t=== %s Summary for %s ===\n\n", tool, variant) | ||||
|   if (passcnt != 0) printf ("# of expected passes\t\t%d\n", passcnt) | ||||
|   if (failcnt != 0) printf ("# of unexpected failures\t%d\n", failcnt) | ||||
|   if (xpasscnt != 0) printf ("# of unexpected successes\t%d\n", xpasscnt) | ||||
|   if (xfailcnt != 0) printf ("# of expected failures\t\t%d\n", xfailcnt) | ||||
|   if (kpasscnt != 0) printf ("# of unknown successes\t\t%d\n", kpasscnt) | ||||
|   if (kfailcnt != 0) printf ("# of known failures\t\t%d\n", kfailcnt) | ||||
|   if (untstcnt != 0) printf ("# of untested testcases\t\t%d\n", untstcnt) | ||||
|   if (unrescnt != 0) printf ("# of unresolved testcases\t%d\n", unrescnt) | ||||
|   if (unsupcnt != 0) printf ("# of unsupported tests\t\t%d\n", unsupcnt) | ||||
| } | ||||
| EOF | ||||
| 
 | ||||
|   PVAR=`echo $VAR | sed 's,/,.,g'` | ||||
|   TMPFILE=${TMP}/var-$PVAR | ||||
|   rm -f $TMPFILE | ||||
|   rm -f ${TMP}/list* | ||||
|   cat ${TMP}/expfiles $SUM_FILES | $AWK -f $GUTS_AWK | ||||
|   cat $SUM_FILES | $AWK -f $SUMS_AWK > $TMPFILE | ||||
|   # If there are multiple variants, output the counts for this one; | ||||
|   # otherwise there will just be the final counts at the end. | ||||
|   test $VARIANT_COUNT -eq 1 || cat $TMPFILE | ||||
| done | ||||
| 
 | ||||
| # Set up an awk script to get the combined summary counts for the tool. | ||||
| 
 | ||||
| TOTAL_AWK=${TMP}/total.awk | ||||
| cat << EOF > $TOTAL_AWK | ||||
| BEGIN { | ||||
|   tool="$TOOL" | ||||
|   passcnt=0; failcnt=0; untstcnt=0; xpasscnt=0; xfailcnt=0; kfailcnt=0; unsupcnt=0; unrescnt=0 | ||||
| } | ||||
| /^# of expected passes/		{ passcnt += \$5 } | ||||
| /^# of unexpected failures/	{ failcnt += \$5 } | ||||
| /^# of unexpected successes/	{ xpasscnt += \$5 } | ||||
| /^# of expected failures/	{ xfailcnt += \$5 } | ||||
| /^# of unknown successes/	{ kpasscnt += \$5 } | ||||
| /^# of known failures/		{ kfailcnt += \$5 } | ||||
| /^# of untested testcases/	{ untstcnt += \$5 } | ||||
| /^# of unresolved testcases/	{ unrescnt += \$5 } | ||||
| /^# of unsupported tests/	{ unsupcnt += \$5 } | ||||
| END { | ||||
|   printf ("\n\t\t=== %s Summary ===\n\n", tool) | ||||
|   if (passcnt != 0) printf ("# of expected passes\t\t%d\n", passcnt) | ||||
|   if (failcnt != 0) printf ("# of unexpected failures\t%d\n", failcnt) | ||||
|   if (xpasscnt != 0) printf ("# of unexpected successes\t%d\n", xpasscnt) | ||||
|   if (xfailcnt != 0) printf ("# of expected failures\t\t%d\n", xfailcnt) | ||||
|   if (kpasscnt != 0) printf ("# of unknown successes\t\t%d\n", kpasscnt) | ||||
|   if (kfailcnt != 0) printf ("# of known failures\t\t%d\n", kfailcnt) | ||||
|   if (untstcnt != 0) printf ("# of untested testcases\t\t%d\n", untstcnt) | ||||
|   if (unrescnt != 0) printf ("# of unresolved testcases\t%d\n", unrescnt) | ||||
|   if (unsupcnt != 0) printf ("# of unsupported tests\t\t%d\n", unsupcnt) | ||||
| } | ||||
| EOF | ||||
| 
 | ||||
| # Find the total summaries for the tool and add to the end of the output. | ||||
| cat ${TMP}/var-* | $AWK -f $TOTAL_AWK | ||||
| 
 | ||||
| # This is ugly, but if there's version output from the compiler under test | ||||
| # at the end of the file, we want it.  The other thing that might be there | ||||
| # is the final summary counts. | ||||
| tail -2 $FIRST_SUM | $GREP '^#' > /dev/null || tail -2 $FIRST_SUM | ||||
| 
 | ||||
| exit 0 | ||||
| @ -1,49 +0,0 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| TEMPDIR=$( mktemp -d ) | ||||
| ORIGPWD=$( pwd )  | ||||
| 
 | ||||
| cp /mnt/scratch/mcermak/testlogs/systemtap.upstream/*tar.xz $TEMPDIR/ | ||||
| 
 | ||||
| 
 | ||||
| pushd $TEMPDIR || exit 1 | ||||
| 
 | ||||
| # rename files so that identical commit hashes get identical (lowest possible) timestamp for sorting purposes | ||||
| HASHES=$(ls systemtap*mcermak*tar.xz | awk -F\. '{print $4}' | sort -u) | ||||
| for h in $HASHES; do | ||||
|     echo Processing hash $h | ||||
|     MINSTAMP4HASH=$( ls *$h* | tr '-' '.' | awk -F\. '{print $9}' | sort -n | grep '[0-9]\+' | head -n 1  ) | ||||
|     echo Min stamp for hash is: $MINSTAMP4HASH | ||||
|     PKG4HASH=$( ls *$h* ) | ||||
|     for p in $PKG4HASH; do | ||||
|         echo Processing pkg $p | ||||
|         PKGSTAMP=$( echo $p | tr '-' '.' | awk -F\. '{print $9}' ) | ||||
|         rename 'systemtap' "$MINSTAMP4HASH" $p | ||||
|     done | ||||
| done | ||||
| 
 | ||||
| # extract systemtap.sum files and rename them | ||||
| for f in $( ls *tar.xz ); do | ||||
|     tar xJf $f systemtap.sum | ||||
|     mv systemtap.sum $f.sum | ||||
|     rename 'tar.xz.sum' 'log' $f.sum | ||||
| done | ||||
| 
 | ||||
| sh $ORIGPWD/report-helper.sh | tee wiki.out | ||||
| 
 | ||||
| sed -i 's/UNKNOWN/?/g' wiki.out | ||||
| sed -i 's/UNTESTED/-/g' wiki.out | ||||
| sed -i 's/PASS/P/g' wiki.out | ||||
| sed -i 's/FAIL/F/g' wiki.out | ||||
| sed -i 's/ERROR/E/g' wiki.out | ||||
| 
 | ||||
| 
 | ||||
| echo uploading logs to scratch... | ||||
| OUT=/mnt/scratch/mcermak/testlogs/out | ||||
| rm -rf $OUT && mkdir -p $OUT && chmod a+rwx $OUT && cp -v *tar.xz $OUT/ | ||||
| 
 | ||||
| echo uploading to wiki... | ||||
| cat wiki.out | $ORIGPWD/wikiup 'mcermak/systemtap.upstream' | ||||
| 
 | ||||
| popd # $TEMPDIR | ||||
| rm -rf $TEMPDIR | ||||
| @ -1,130 +0,0 @@ | ||||
| #!/bin/bash | ||||
| 
 | ||||
| HASHES=$( ls | awk -F\. '{print $4}' | sort -u ) | ||||
| ARCHES=$( ls *log | awk -F- '{print  $(NF-1)  }' | awk -F. '{print $NF}' | sort -u ) | ||||
| 
 | ||||
| declare -A MAXTESTS | ||||
| 
 | ||||
| for p in $HASHES; do | ||||
|     MAXTESTS[$p]=0 | ||||
|     for a in $ARCHES; do | ||||
|         c=$( ls *log | grep $p | grep $a | wc -l ) | ||||
|         test $c -gt ${MAXTESTS[$p]} && MAXTESTS[$p]=$c | ||||
|     done | ||||
| done | ||||
| 
 | ||||
| TESTCASES=$( cat *log | awk '/^Running\ \.\/systemtap/ {print $2}' | sort -u ) | ||||
| 
 | ||||
| TEMPFILE=$( mktemp ) | ||||
| 
 | ||||
| function getCaseResults() { | ||||
|     casename=$1 | ||||
|     logfile=$2 | ||||
|     casename=$( echo $casename | tr "/" "." ) | ||||
|     cmd="cat $logfile | sed -e '/$casename/,/^Running/ !d'" | ||||
|     eval "$cmd" | head -n -1 | ||||
| } | ||||
| 
 | ||||
| function getWorstResult() { | ||||
|     results="$1" | ||||
|     retval='UNKNOWN' | ||||
|     echo "$results" | grep -q '^PASS' && retval='PASS' | ||||
|     echo "$results" | grep -q '^KPASS' && retval='KPASS' | ||||
|     echo "$results" | grep -q '^XPASS' && retval='XPASS' | ||||
|     echo "$results" | grep -q '^UNTESTED' && retval='UNTESTED' | ||||
|     echo "$results" | grep -q '^KFAIL' && retval='KFAIL' | ||||
|     echo "$results" | grep -q '^XFAIL' && retval='XFAIL' | ||||
|     echo "$results" | grep -q '^FAIL' && retval='FAIL' | ||||
|     echo "$results" | grep -q '^ERROR' && retval='ERROR' | ||||
|     echo $retval | ||||
| } | ||||
| 
 | ||||
| function getResult() { | ||||
|     casename=$1 | ||||
|     logfile=$2 | ||||
|     worstResult=$( getWorstResult "$( getCaseResults "$casename" "$logfile" )" ) | ||||
|     if test -s $logfile; then | ||||
|         loglink="http://nfs.englab.brq.redhat.com/scratch/mcermak/testlogs/out/$( echo $logfile | sed 's/log/tar\.xz/' )" | ||||
|         echo "[[$loglink|$worstResult]]" | ||||
|     else | ||||
|         echo $worstResult | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| function getLogs() { | ||||
|     package=$1 | ||||
|     arch=$2 | ||||
|     logcnt=$3 | ||||
|     availogcont=$( ls *log | grep $package | grep $arch | wc -l ) | ||||
|     remainlogcnt=$(( $logcnt - $availogcont )) | ||||
|     logs=$( ls *log | grep $package | grep $arch ) | ||||
|     for i in $( seq 1 $remainlogcnt ); do | ||||
|         logs="$logs $TEMPFILE" | ||||
|     done | ||||
|     echo $logs | ||||
| } | ||||
| 
 | ||||
| function colorizeResult() { | ||||
|     result=$1 | ||||
|     if echo $result | egrep -q '(KFAIL|XFAIL)'; then | ||||
|         echo "<#a2eea2> $result" | ||||
|     elif echo $result | egrep -q '(FAIL|ERROR)'; then | ||||
|         echo "<#f30000> $result" | ||||
|     elif echo $result | egrep -q '(UNKNOWN)'; then | ||||
|         echo "<#ffffff> $result" | ||||
|     else | ||||
|         echo "<#a2eea2> $result" | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| function getResultSet() { | ||||
|     package=$1 | ||||
|     arch=$2 | ||||
|     testcase=$3 | ||||
|     #echo -n "|| $package ($arch) " | ||||
|     echo -n "|| '''$arch''' " | ||||
|     for logfile in $( getLogs "$package" "$arch" ${MAXTESTS[$package]} ); do | ||||
|         result=$( getResult "$testcase" "$logfile" ) | ||||
|         echo -n "||$( colorizeResult "$result" ) " | ||||
|     done | ||||
| } | ||||
| 
 | ||||
| function getBugsForTestcase() { | ||||
|     testcase=$1 | ||||
|     testcase=$( echo $testcase | sed 's/^\.\///' | tr "/" "." ) | ||||
|     cmd="awk '/$testcase/ {print \$2}' bugs.txt" | ||||
|     eval "$cmd" | ||||
| } | ||||
| 
 | ||||
| function getBugLinksForTestcase() { | ||||
|     bznos="$1" | ||||
|     if ! test -z "$bznos"; then | ||||
|         echo | ||||
|         for bzno in $bznos; do | ||||
|             echo -e "[[https://bugzilla.redhat.com/show_bug.cgi?id=$bzno|bz$bzno]]" | ||||
|         done | ||||
|         echo | ||||
|     fi | ||||
| } | ||||
| 
 | ||||
| echo -n "== " | ||||
| first=1 | ||||
| for package in $HASHES; do | ||||
|     test $first -eq 0 && echo -n "<-> " | ||||
|     echo -n "$package " | ||||
|     first=0 | ||||
| done | ||||
| echo " ==" | ||||
| 
 | ||||
| for testcase in $TESTCASES; do | ||||
|     echo -e "\n=== $testcase ===\n" | ||||
|     getBugLinksForTestcase "$( getBugsForTestcase "$testcase" )" | ||||
|     for arch in $ARCHES; do | ||||
|         for __hash in $HASHES; do | ||||
|             getResultSet $__hash $arch $testcase | ||||
|         done | ||||
|         echo " ||" | ||||
|     done | ||||
| done | ||||
| 
 | ||||
| 
 | ||||
| @ -1,22 +0,0 @@ | ||||
| #!/usr/bin/python | ||||
| 
 | ||||
| import sys | ||||
| import xmlrpclib | ||||
| 
 | ||||
| wikilocation = sys.argv[1] | ||||
| wikicontent = sys.stdin.read() | ||||
| 
 | ||||
| if not wikilocation.startswith("mcermak/"): | ||||
|     print "wiki location must start with mcermak/" | ||||
|     sys.exit(1) | ||||
| 
 | ||||
| user = 'xmlrpc2' | ||||
| password = 'fo0m4nchU+' | ||||
| url='http://wiki.test.redhat.com/' | ||||
| wiki = xmlrpclib.ServerProxy(url + '?action=xmlrpc2', allow_none=False) | ||||
| auth_token = wiki.getAuthToken(user, password) | ||||
| mc = xmlrpclib.MultiCall(wiki) | ||||
| mc.applyAuthToken(auth_token) | ||||
| mc.putPage(wikilocation, wikicontent) | ||||
| result = mc() | ||||
| 
 | ||||
| @ -1,21 +0,0 @@ | ||||
| #/bin/bash | ||||
| 
 | ||||
| test -x | ||||
| __TRESHOLD=$(( 240 * 60 )) | ||||
| __SLEEP=$(( 15 * 60 )) | ||||
| __LOG="$1" | ||||
| test -z $__LOG && exit 1 | ||||
| test +x | ||||
| 
 | ||||
| echo "`date` internal watchdog $$ starting." >> $__LOG | ||||
| while true; do | ||||
|     sleep $__SLEEP | ||||
|     __DELTA=$(( `date +'%s'` - `stat -c '%Y' $__LOG` )) | ||||
|     if [[ $__DELTA -gt $__TRESHOLD ]]; then | ||||
|         echo "`date` internal watchdog $$ rebooting due to inactivity." >> $__LOG | ||||
| 	sync | ||||
|         sleep 1m | ||||
|         reboot -f | ||||
|         sleep 5m | ||||
|     fi | ||||
| done | ||||
| @ -1,50 +0,0 @@ | ||||
| summary: testsuite-upstream-raw | ||||
| description: '' | ||||
| contact: Martin Cermak <mcermak@redhat.com> | ||||
| component: | ||||
|   - systemtap | ||||
| test: ./runtest.sh | ||||
| # test: /bin/true | ||||
| framework: beakerlib | ||||
| recommend: | ||||
|   - avahi-debuginfo | ||||
|   - avahi-devel | ||||
|   - boost-devel | ||||
|   - byteman | ||||
|   - coreutils | ||||
|   - coreutils-debuginfo | ||||
|   - crash-devel | ||||
|   - dejagnu | ||||
|   - '@development' | ||||
|   - '@development-tools' | ||||
|   - dyninst-devel | ||||
|   - elfutils-devel | ||||
|   - gcc-c++ | ||||
|   - gettext-devel | ||||
|   - git | ||||
|   - glibc-debuginfo | ||||
|   - glibc-devel | ||||
|   - libselinux-devel | ||||
|   - libstdc++-devel | ||||
|   - m4 | ||||
|   - nss-devel | ||||
|   - pkgconfig | ||||
|   - postgresql-debuginfo | ||||
|   - postgresql-server | ||||
|   - python | ||||
|   - python3-debuginfo | ||||
|   - python-debuginfo | ||||
|   - python-libs-debuginfo | ||||
|   - rpm-devel | ||||
|   - sqlite-devel | ||||
|   - systemtap | ||||
|   - systemtap-testsuite | ||||
|   - tcl | ||||
|   - xz | ||||
|   - zlib-devel | ||||
|   - sqlite | ||||
|   - systemtap-debuginfo | ||||
|   - kernel-headers | ||||
| duration: 72h | ||||
| extra-summary: /tools/systemtap/Regression/testsuite-upstream-raw | ||||
| extra-task: /tools/systemtap/Regression/testsuite-upstream-raw | ||||
| @ -1,282 +0,0 @@ | ||||
| #!/bin/bash | ||||
| # vim: dict=/usr/share/beakerlib/dictionary.vim cpt=.,w,b,u,t,i,k | ||||
| # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
| # | ||||
| #   runtest.sh of /tools/systemtap/Regression/testsuite-upstream-raw | ||||
| #   Description: testsuite-upstream-raw | ||||
| #   Author: Martin Cermak <mcermak@redhat.com> | ||||
| # | ||||
| # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
| # | ||||
| #   Copyright (c) 2014 Red Hat, Inc. | ||||
| # | ||||
| #   This program is free software: you can redistribute it and/or | ||||
| #   modify it under the terms of the GNU General Public License as | ||||
| #   published by the Free Software Foundation, either version 2 of | ||||
| #   the License, or (at your option) any later version. | ||||
| # | ||||
| #   This program is distributed in the hope that it will be | ||||
| #   useful, but WITHOUT ANY WARRANTY; without even the implied | ||||
| #   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR | ||||
| #   PURPOSE.  See the GNU General Public License for more details. | ||||
| # | ||||
| #   You should have received a copy of the GNU General Public License | ||||
| #   along with this program. If not, see http://www.gnu.org/licenses/. | ||||
| # | ||||
| # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||||
| 
 | ||||
| # Include Beaker environment | ||||
| . /usr/share/beakerlib/beakerlib.sh || exit 1 | ||||
| 
 | ||||
| # What part of the testsuite should we run (and then check for errors)? | ||||
| _WHAT=${_WHAT:-DEFAULT} | ||||
| 
 | ||||
| export AVC_ERROR='+no_avc_check' | ||||
| touch /tmp/disable-qe-abrt | ||||
| 
 | ||||
| unset DEBUGINFOD_PROGRESS | ||||
| if test $(rpm --eval "0%{rhel}") -ge 9; then | ||||
|     # Allow use of debuginfod | ||||
|     export DEBUGINFOD_URLS=http://debuginfod.usersys.redhat.com:3632/ | ||||
|     # export DEBUGINFOD_PROGRESS=1 | ||||
| else | ||||
|     unset DEBUGINFOD_URLS | ||||
| fi | ||||
| 
 | ||||
| trap '' SIGHUP SIGINT SIGQUIT SIGABRT | ||||
| 
 | ||||
| ORIGPWD=$( pwd ) | ||||
| 
 | ||||
| PKGMGR="yum --skip-broken --nogpgcheck" | ||||
| rpm -q dnf && PKGMGR="dnf --setopt=strict=0 --nogpgcheck" | ||||
| 
 | ||||
| STARTDATE=$(date +%Y-%m-%d-%H-%M-%S) | ||||
| STAPSRPM=$(rpm -qif `which stap` | awk '/Source RPM/ {print $NF}' | sort -u | sed 's/\.src\.rpm//') | ||||
| SUITERPM=$(rpm --queryformat '%{name}\n' -qf `which stap` | grep -o '.*systemtap' | sort -u)-testsuite | ||||
| SUITELOC=$(rpm -ql $SUITERPM | grep -o '.*systemtap\/testsuite/' | sort -u) | ||||
| 
 | ||||
| test_primary_arch_only () | ||||
| { | ||||
|     echo "=== TESTING PRIMARY ARCH ONLY ===" | ||||
|     sed -i '/^proc arch_compile_flags/,/^}/d' $SUITELOC/lib/compile_flags.exp | ||||
|     echo 'proc arch_compile_flags {} { return 1 }' >> $SUITELOC/lib/compile_flags.exp | ||||
| } | ||||
| 
 | ||||
| # For devtoolset, compat arch support was dropped for non-x86_64 arches.  Ref: bz1493500 | ||||
| if echo $SUITELOC | grep -q toolset && arch | egrep -q '^(ppc64|s390x)$'; then | ||||
|     test_primary_arch_only | ||||
| elif test $(rpm -E '0%{rhel}') -ge 8 -a "$(arch)" != "x86_64"; then | ||||
|     test_primary_arch_only | ||||
| fi | ||||
| 
 | ||||
| # Currently the Makefile overrides what was set in the env via | ||||
| # http://pkgs.devel.redhat.com/cgit/rpms/devtoolset-7/commit/?h=devtoolset-7.1-rhel-7&id=e305f5912a13bd2ca04ac319afca50bfab6f4aea | ||||
| # And actually if the base rhel dyninst is installed, the dts testsuite runs against it rather than agains | ||||
| # the dts-stap - producing irrelevant test results. | ||||
| # | ||||
| # A real fix on the stap side might be: | ||||
| # -LD_LIBRARY_PATH=$(DESTDIR)$(libdir)/systemtap | ||||
| # +LD_LIBRARY_PATH=$(DESTDIR)$(libdir)/systemtap:$(DESTDIR)$(libdir)/dyninst | ||||
| # in the Makefile.am etc, but let's work this around for now in a way that we simply use the | ||||
| # LD_LIBRARY_PATH taken directly from the env: | ||||
| if echo $SUITELOC | grep -q toolset; then | ||||
|     sed -i 's/^LD_LIBRARY_PATH/# LD_LIBRARY_PATH/' $SUITELOC/Makefile | ||||
| fi | ||||
| 
 | ||||
| rlJournalStart | ||||
|     rlPhaseStartSetup | ||||
|         rlLogInfo "SUITERPM=$SUITERPM" | ||||
|         rlLogInfo "SUITELOC=$SUITELOC" | ||||
|         rlRun "pushd $SUITELOC" | ||||
|         rlServiceStop firewalld | ||||
|         rlServiceStop iptables | ||||
|         rlServiceStop ip6tables | ||||
|         rlServiceStart avahi-daemon | ||||
|         rlRun "rpm -qa | grep ^kernel | grep -v `uname -r` | xargs rpm -e --nodeps" 0-255 | ||||
|         # if ! (uname -r | fgrep -q '.rt'); then | ||||
|         #     rlRun "$ORIGPWD/stap-prep" 0,127 || \ | ||||
|         #         rlRun "stap-prep" 0,127 | ||||
|         # fi | ||||
|         rlRun "sysctl -w kernel.panic=1" | ||||
|         rlRun "sysctl -w kernel.panic_on_oops=1" | ||||
|         rlRun "$PKGMGR -y install --setopt=multilib_policy=all libstdc++ dejagnu elfutils-devel gettext libgcc glibc-devel gcc-c++ libstdc++-devel dyninst dyninst-devel" | ||||
|     rlPhaseEnd | ||||
| 
 | ||||
| 
 | ||||
|     MYDMESGDIR=/root/mydmesg | ||||
|     mkdir -p $MYDMESGDIR | ||||
|     if strings $(which dmesg) | fgrep -q -- '-w'; then | ||||
|         rlPhaseStart FAIL "Run dmesg recorder." | ||||
|             MYTIMESTAMP=$(date +%s) | ||||
|             dmesg -wH > $MYDMESGDIR/dmesg$MYTIMESTAMP & | ||||
|             MYDMESGPID=$! | ||||
|             rlLogInfo "Dmesg recorder file: $MYDMESGDIR/dmesg$MYTIMESTAMP" | ||||
|             rlLogInfo "Dmesg PID: $MYDMESGPID" | ||||
|         rlPhaseEnd | ||||
|     fi | ||||
| 
 | ||||
|     rlPhaseStart FAIL "sanity check" | ||||
|         rlRun "stap -vve 'probe kernel.function(\"vfs_read\"){ log(\"hey!\"); exit() } probe timer.s(60){log(\"timeout\"); exit()}'" | ||||
|         rlRun "stap -vvl 'process(\"/usr/sbin/fdisk\").function(\"main\")'" 0-255 | ||||
|     rlPhaseEnd | ||||
| 
 | ||||
|     if ! test -f $SUITELOC/systemtap.log; then | ||||
|         rlPhaseStart WARN "Apply blacklist" | ||||
|             # === RHEL7 === | ||||
|             if rlIsRHEL 7; then | ||||
|                 if arch | grep -q s390; then | ||||
|                     true | ||||
|                     # PR17270 | ||||
|                     #rlRun "rm -f systemtap.onthefly/hrtimer_onthefly.exp" | ||||
|                     #rlRun "rm -f systemtap.onthefly/uprobes_onthefly.exp" | ||||
|                     #rlRun "rm -f systemtap.onthefly/kprobes_onthefly.exp" | ||||
|                     # PR17140 | ||||
|                     #rlRun "rm -f systemtap.examples/profiling/functioncallcount.stp" | ||||
|                 elif arch | grep -q ppc; then | ||||
|                     true | ||||
|                     # PR17270 | ||||
|                     #rlRun "rm -f systemtap.onthefly/hrtimer_onthefly.exp" | ||||
|                     #rlRun "rm -f systemtap.onthefly/uprobes_onthefly.exp" | ||||
|                     #rlRun "rm -f systemtap.onthefly/kprobes_onthefly.exp" | ||||
|                     # PR17126 | ||||
|                     #rlRun "rm -f systemtap.base/tracepoints.exp" | ||||
|                     # BZ1153082 | ||||
|                     #rlRun "rm -f systemtap.clone/main_quiesce.exp" | ||||
|                 #elif rpm -q systemtap | grep -q '2.4-16.el7_0'; then | ||||
|                     # BZ1145958 | ||||
|                     #rlRun "rm -f systemtap.base/process_resume.exp" | ||||
|                 fi | ||||
|             # === FEDORA === | ||||
|             elif grep -qi fedora /etc/redhat-release; then | ||||
|                 # BZ1153082 | ||||
|                 rlRun "rm -f systemtap.clone/main_quiesce.exp" | ||||
|             fi | ||||
| 
 | ||||
|             # Work around problem fixed in https://sourceware.org/git/gitweb.cgi?p=systemtap.git;a=commitdiff;h=a9b0aa4dbd1aa7a1c36eba8102e1445e8f2eb8b8 | ||||
|             rlRun "sed -i 's/exit\ 0/return/' $(fgrep -ril 'exit 0' $(find . -type f -name '*.exp')) ||:" | ||||
|         rlPhaseEnd | ||||
|     else | ||||
|         rlPhaseStart FAIL "Post-process anticipated reboot" | ||||
|             # Sometimes the testsuite crashes the kernel or causes stall. | ||||
|             # In case --ignore-panic is set, the box gets rebooted (bz1155644). | ||||
|             # This shouldn't happen. It'd be nice to report it as FAIL, but that | ||||
|             # appears to be too pedantic.  We'll need this bell to ring when | ||||
|             # too many unexpected failures get reported by the upstream test driver. | ||||
|             # rlRun "false" | ||||
| 
 | ||||
|             # Remove testcases that have already been run | ||||
|             for tc in $( awk '/^Running.*exp\ \.\.\.$/ {print $2}' *systemtap.log ); do | ||||
|                 echo $tc | grep -q 'systemtap/notest.exp' && continue | ||||
|                 test -f $tc && rm -f $tc && rlLog "Removed $tc" | ||||
|             done | ||||
| 
 | ||||
|             #generate random hash | ||||
|             HASH=$(date | md5sum | cut -c 1-32 -) | ||||
| 
 | ||||
|             # save existing logs before creating new ones | ||||
|             rlRun "mv systemtap.log ${HASH}-systemtap.log" | ||||
|             rlRun "mv systemtap.sum ${HASH}-systemtap.sum" | ||||
| 
 | ||||
|             # clean up garbage incl. systemtap.log | ||||
|             rlRun "make clean" | ||||
|         rlPhaseEnd | ||||
|     fi | ||||
| 
 | ||||
|     rlPhaseStartTest | ||||
|         # Start internal watchdog if running in beaker | ||||
|         if test -n $JOBID; then | ||||
|             rlLogInfo "Starting internal watchdog ..." | ||||
|             $ORIGPWD/internal-watchdog.sh "$SUITELOC/systemtap.sum" & | ||||
|             __WATCHDOG_PID=$! | ||||
|             sleep 3 | ||||
|             if ps -p $__WATCHDOG_PID; then | ||||
|                 rlLogInfo "Internal watchdog running (pid $__WATCHDOG_PID)." | ||||
|             else | ||||
|                 rlFail "Problem starting the internal watchdog." | ||||
|             fi | ||||
|         fi | ||||
| 
 | ||||
|         # The _WHAT env var allows the test to only run selected subset of all | ||||
|         # the tests and perform specific checks on the resulting logs. | ||||
|         # | ||||
|         # Accepted values: BPF | ||||
| 
 | ||||
|         # run the testsuite (grab the list of testcases from the respective check* file) | ||||
| 	TESTCASES=$(bash ${ORIGPWD}/check_${_WHAT}.sh TCLIST) | ||||
| 	rlRun "make RUNTESTFLAGS='$TESTCASES' installcheck 2>&1" | ||||
| 
 | ||||
|         # Kill internal watchdog if running in beaker | ||||
|         if ! test -z $JOBID; then | ||||
|             rlLogInfo "Killing internal watchdog ..." | ||||
|             kill -s TERM $__WATCHDOG_PID | ||||
|         fi | ||||
|     rlPhaseEnd | ||||
| 
 | ||||
|     rlPhaseStart FAIL "Put all the log fragments together" | ||||
|         rlRun "$ORIGPWD/dg-extract-results.sh *systemtap.sum > big-systemtap.sum" | ||||
|         rlRun "$ORIGPWD/dg-extract-results.sh -L *systemtap.log > big-systemtap.log" | ||||
|         rlRun "mv --force big-systemtap.sum systemtap.sum" | ||||
|         rlRun "mv --force big-systemtap.log systemtap.log" | ||||
|         # remove the hash-prefixed fragments | ||||
|         # these are needed for the resume mode, but since we got to this point, | ||||
|         # we most likely processed all the testcases somehow, put all the pieces | ||||
|         # together and can start cleaning up and reporting | ||||
|         rlRun "rm -f *-systemtap.{log,sum}" | ||||
|     rlPhaseEnd | ||||
| 
 | ||||
|     rlPhaseStart FAIL "rlFileSubmit logs" | ||||
|         rlRun "xz --keep --force systemtap.log" | ||||
|         rlFileSubmit "systemtap.log.xz" | ||||
|         rlRun "xz --keep --force systemtap.sum" | ||||
|         rlFileSubmit "systemtap.sum.xz" | ||||
|         rlRun "rm systemtap.log.xz systemtap.sum.xz" | ||||
|     rlPhaseEnd | ||||
| 
 | ||||
|     if [[ "$_WHAT" == "DEFAULT" ]]; then | ||||
|     rlPhaseStart FAIL "save logs to /mnt/scratch" | ||||
|         MP=$( mktemp -d ) | ||||
|         # Refer to /tools/systemtap/Install/upstream-head | ||||
|         SD=rhpkg; rpm -q systemtap | grep -q mcermak && SD=upstream | ||||
|         rlRun "echo ${BEAKER}jobs/${JOBID} > job.txt" | ||||
|         rlRun "tar cf mydmesg.tar $MYDMESGDIR" | ||||
|         rlRun "xz mydmesg.tar" | ||||
|         rlRun "mount -o rw,nolock nfs.englab.brq.redhat.com:/scratch/mcermak $MP" | ||||
|         if test $(rpm --eval '0%{rhel}') -eq 8 && (! echo ${STAPSRPM} | grep '\.el8'); then | ||||
|             rlRun "LOGNAME=${MP}/testlogs/systemtap.${SD}/${STAPSRPM}.el8.$(uname -m)-${STARTDATE}" | ||||
|         else | ||||
|             rlRun "LOGNAME=${MP}/testlogs/systemtap.${SD}/${STAPSRPM}.$(uname -m)-${STARTDATE}" | ||||
|         fi | ||||
|         rlRun "mkdir -p $( dirname $LOGNAME )" | ||||
|         rlRun "tar cJf ${LOGNAME}.tar.xz systemtap.log systemtap.sum job.txt mydmesg.tar.xz" | ||||
| 
 | ||||
|         # Upload logs to bunsen instance on tofan if running in beaker | ||||
|         if ! test -z $JOBID; then | ||||
|             LOGFULLNAME="${LOGNAME}.tar.xz" | ||||
|             LOGBASENAME="$(basename $LOGFULLNAME)" | ||||
|             rlLogInfo "Uploading test log to bunsen..." | ||||
|             rlRun "cat $LOGFULLNAME | \ | ||||
|                        curl -X POST -F project=systemtap-qe \ | ||||
|                            -F tarballname=$LOGBASENAME \ | ||||
|                            -F 'tar=@-' \ | ||||
|                            http://tofan.yyz.redhat.com:8013/bunsen-upload.py" | ||||
|         fi | ||||
|         rlRun "umount -l $MP && sleep 3 && rm -rf $MP" | ||||
|     rlPhaseEnd | ||||
|     fi | ||||
| 
 | ||||
|     rlPhaseStart FAIL "Log checks ($_WHAT)" | ||||
|         rlRun "bash ${ORIGPWD}/check_${_WHAT}.sh" | ||||
|     rlPhaseEnd | ||||
| 
 | ||||
|     rlPhaseStartCleanup | ||||
|         rlServiceRestore firewalld | ||||
|         rlServiceRestore iptables | ||||
|         rlServiceRestore ip6tables | ||||
|         rlServiceRestore avahi-daemon | ||||
|         rlRun popd | ||||
|         kill -9 $MYDMESGPID ||: | ||||
|     rlPhaseEnd | ||||
| rlJournalPrintText | ||||
| rlJournalEnd | ||||
| 
 | ||||
| rm -f /tmp/disable-qe-abrt | ||||
| @ -1,150 +0,0 @@ | ||||
| #! /bin/bash | ||||
| LANG=C; export LANG | ||||
| PATH=/usr/sbin:/sbin:/usr/bin:/bin:$PATH; export PATH | ||||
| 
 | ||||
| check_error() { if test $1 != 0; then printf "\n$2\n"; exit $1; fi } | ||||
| 
 | ||||
| prep_rpm_based() { | ||||
| # uname -r can produce different kinds of output: | ||||
| # 2.6.32-30.el6.x86_64 (no variant, but including ".arch") | ||||
| # 2.6.18-194.3.1.el5debug ("variant", without dot, no arch) | ||||
| # 2.6.33.4-95.fc13.i686.PAE (".arch.variant", two dots) | ||||
| # 3.18.6-100.fc20.i686+PAE (".arch+variant", dot, plus) | ||||
| if [ "$#" -lt 1 ]; then | ||||
|     UNAME=`uname -r` # determine the kernel running on the machine | ||||
| else | ||||
|     UNAME=$1 #user passed in uname value | ||||
| fi | ||||
| UNAME=`echo $UNAME | sed "s/ //"` #strip out any whitespace | ||||
| KERNEL="kernel" | ||||
| for VARIANT in debug kdump PAE xen; do | ||||
|   # strip out ".variant" or else "+variant" or else "variant" at end. | ||||
|   TMP=`echo $UNAME | sed "s/[\.\+]\?$VARIANT\$//"` | ||||
|   if [ "$TMP" != "$UNAME" ]; then | ||||
|       UNAME=$TMP; KERNEL="kernel-$VARIANT" | ||||
|   fi | ||||
| done | ||||
| KERN_ARCH=`uname -m` | ||||
| KERN_REV=`echo $UNAME | sed s/.$KERN_ARCH//` # strip arch from uname | ||||
| if [ -x /usr/bin/dnf ]; then | ||||
|     DI="dnf debuginfo-install" | ||||
|     DI_DEPS="" | ||||
|     D="dnf" | ||||
| else | ||||
|     DI="debuginfo-install" | ||||
|     DI_DEPS="yum-utils" | ||||
|     D="yum" | ||||
| fi | ||||
| CANDIDATES="$KERNEL-$KERN_REV.$KERN_ARCH \ | ||||
|   $KERNEL-devel-$KERN_REV.$KERN_ARCH \ | ||||
|   $DI_DEPS" | ||||
| 
 | ||||
| # Can't simply work with /boot/vmlinuz-* below because of | ||||
| # https://sourceware.org/bugzilla/show_bug.cgi?id=26599 | ||||
| _debuginfod_file=$(rpm -ql kernel-core | fgrep $(uname -r) | grep '\.so$' | tail -1) | ||||
| # Now let's assume following to come from outside env... | ||||
| # export DEBUGINFOD_URLS=http://debuginfod.usersys.redhat.com:3632/ | ||||
| # export DEBUGINFOD_PROGRESS=1 | ||||
| debuginfod-find debuginfo $(rpm -ql kernel-core | fgrep $(uname -r) | grep '\.so$' | tail -1) || \ | ||||
|     CANDIDATES="$CANDIDATES $KERNEL-debuginfo-$KERN_REV.$KERN_ARCH" | ||||
| 
 | ||||
| NEEDED=`rpm --qf "%{name}-%{version}-%{release}.%{arch}\n" \ | ||||
|     -q $CANDIDATES | grep "is not installed" | awk '{print $2}'` | ||||
| if [ "$NEEDED" != "" ]; then | ||||
|     echo -e "Need to install the following packages:\n$NEEDED" | ||||
|     if [ `id -u` = "0" ]; then #attempt to install | ||||
|         $D install -y --enablerepo=\* $NEEDED | ||||
|         if expr "$NEEDED" : ".*debuginfo.*" >/dev/null; | ||||
|         then | ||||
|             $DI -y $KERNEL-$KERN_REV.$KERN_ARCH; | ||||
|         fi | ||||
|         rpm -q $NEEDED | ||||
|         rc=$? | ||||
|         check_error $rc "problem installing rpm(s) $NEEDED\nin case of file conflicts, try again after # $D erase $KERNEL-debuginfo" | ||||
|     fi | ||||
| fi | ||||
| } | ||||
| 
 | ||||
| prep_deb_based() { | ||||
| if [ $# -ne 0 ]; then | ||||
|     echo "Specifying kernel version is not yet support on deb based systems." 1>&2 | ||||
|     exit 1 | ||||
| fi | ||||
| 
 | ||||
| # 2.6.32-5-amd64 | ||||
| # 2.6.32-37-generic | ||||
| ABINAME="$(cut -d " " -f 3 /proc/version)" | ||||
| 
 | ||||
| # 2.6.32 | ||||
| BASEVERSION="$(echo "$ABINAME" | cut -d "-" -f 1)" | ||||
| DEBIAN_FRONTEND=noninteractive # don't confirm or chat | ||||
| export DEBIAN_FRONTEND | ||||
| 
 | ||||
| case "$DISTRO" in  | ||||
|     Debian) # 2.6.32-39 | ||||
| 	if uname -v | grep -q Debian; then | ||||
| 	    VERSION="$(uname -v | cut -d " " -f 4)" | ||||
| 	else | ||||
|             VERSION="$(cut -d " " -f 3 /proc/version)" | ||||
| 	fi | ||||
| 	;; | ||||
|     Ubuntu) | ||||
| 	# 2.6.32-37.81 | ||||
|         if [ -f /proc/version_signature ]; then | ||||
|   	    VERSION="$(cut -d " " -f 2 /proc/version_signature | cut -d "-" -f 1-2)" | ||||
|         else # 4.18 | ||||
|             VERSION="$(cut -d " " -f 3 /proc/version)" | ||||
|         fi | ||||
| 	;; | ||||
| esac | ||||
| 
 | ||||
| ( | ||||
|     echo "make >= 0" | ||||
|     echo "linux-image-$ABINAME = $VERSION" | ||||
|     echo "linux-headers-$ABINAME = $VERSION" | ||||
| 	echo "linux-image-$ABINAME-dbgsym = $VERSION" | ||||
| ) | while read package relation requiredversion; do | ||||
|     installedversion="$(dpkg-query -W "$package" 2> /dev/null | cut -f 2)" | ||||
|     if [ "$installedversion" = "" ]; then | ||||
| 	availableversion="$(apt-cache show $package 2> /dev/null | grep ^Version: | cut -d " " -f 2)" | ||||
| 	if [ "$availableversion" = "" -a "$(echo $package | grep dbgsym$)" ]; then | ||||
| 	    echo "You need package $package but it does not seem to be available" | ||||
| 	    if [ "$DISTRO" = "Ubuntu"  ]; then | ||||
| 		echo " Ubuntu -dbgsym packages are typically in a separate repository" | ||||
| 		echo " Follow https://wiki.ubuntu.com/DebuggingProgramCrash to add this repository" | ||||
| 	    elif [ "$DISTRO" = "Debian" ]; then | ||||
| 		echo " Debian -dbgsym packages are typically in a separate repository" | ||||
| 		echo " Follow https://wiki.debian.org/AutomaticDebugPackages to add this repository" | ||||
| 	    fi | ||||
| 	else | ||||
| 	    echo "Need to install $package" | ||||
|             if [ `id -u` = "0" ]; then #attempt to install | ||||
|                 apt-get -y install $package | ||||
|             fi | ||||
| 	fi | ||||
|     elif ! dpkg --compare-versions $installedversion $relation $requiredversion; then | ||||
| 	echo "Package $package version $installedversion does not match version of currently running kernel: $requiredversion" | ||||
| 	echo " Consider apt-get upgrade && reboot" | ||||
|     fi | ||||
| done | ||||
| 
 | ||||
| user="$(id --user --name)" | ||||
| if [ "$user" != "root" ]; then | ||||
|     groups="$(id --groups --name)" | ||||
|     for i in stapusr stapdev; do | ||||
| 	if [ "$(echo $groups | grep $i)" = "" ]; then | ||||
| 	    echo "Be root or adduser $user $i" | ||||
| 	fi | ||||
|     done | ||||
| fi | ||||
| } | ||||
| 
 | ||||
| DISTRO="$(lsb_release --id --short 2> /dev/null)" | ||||
| case "$DISTRO" in | ||||
| Debian|Ubuntu) | ||||
| 	prep_deb_based "$@" | ||||
| 	;; | ||||
| *) | ||||
| 	prep_rpm_based "$@" | ||||
| 	;; | ||||
| esac | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user