#!/bin/sh # Runs many iterations of run_net_test.sh in parallel processes, for the # purposes of finding flaky tests. if ! [[ $1 =~ ^[0-9]+$ ]] || ! [[ $2 =~ ^[0-9]+$ ]] || [ -z "$3" ]; then echo "Usage: $0 " >&2 exit 1 fi # A function run by every worker. Runs the tests times. function runtests() { local worker=$1 local runs=$2 local test=$3 local j=0 while ((j < runs)); do $DIR/run_net_test.sh --builder --nobuild $test \ > /dev/null 2> $RESULTSDIR/results.$worker.$j j=$((j + 1)) echo -n "." >&2 done } WORKERS=$1 RUNS=$2 TEST=$3 DIR=$(dirname $0) RESULTSDIR=$(mktemp --tmpdir -d net_test.parallel.XXXXXX) [ -z $RESULTSDIR ] && exit 1 test_file=$DIR/$TEST if [[ ! -x $test_file ]]; then echo "test file '${test_file}' does not exist" exit 1 fi echo "Building kernel..." >&2 $DIR/run_net_test.sh --norun || exit 1 echo "Running $WORKERS worker(s) with $RUNS test run(s) each..." >&2 # Start all the workers. worker=0 while ((worker < WORKERS)); do runtests $worker $RUNS $TEST & worker=$((worker + 1)) done wait echo # Output the results. egrep -h "^ERROR:|^FAIL:|0 failed tests|giving up" $RESULTSDIR/results.* | \ sort | uniq -c | sort -rn >&2 # If there were any failures, leave the results around for examination. if egrep -q "^ERROR|^FAIL" $RESULTSDIR/results.*; then echo "Failures occurred, leaving results in $RESULTSDIR" >&2 else rm -rf $RESULTSDIR fi