summaryrefslogtreecommitdiff
path: root/tests/basic_all_hwfeature_combinations.sh
blob: 138719047c77f1860137e197f26434fa7ca849ce (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
#!/bin/bash
# Run basic tests with all HW feature combinations
# Copyright 2017 Jussi Kivilinna <jussi.kivilinna@iki.fi>
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
# modifications, as long as this notice is preserved.
#
# This file is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#

# Use BINEXT to set executable extension
#  For example for Windows executables: BINEXT=.exe
if [ "x$BINEXT" != "x" ] && [ -e "tests/version$BINEXT" ]; then
	binext="$BINEXT"
else
	binext=""
fi

# Use BINPRE to set executable prefix
#  For example to run Windows executable with WINE: BINPRE="wine "
if [ "x$BINPRE" != "x" ]; then
	binpre="$BINPRE"
else
	binpre=""
fi

# Use NJOBS to define number of parallel tasks
if [ "x$NJOBS" != "x" ]; then
	njobs="$NJOBS"
else
	# default to cpu count
	ncpus=$(nproc --all)
	if [ "x@cpus" != "x" ]; then
		njobs=$ncpus
	else
		# could not get cpu count, use 4 parallel tasks instead
		njobs=4
	fi
fi

get_supported_hwfeatures() {
	$binpre "tests/version$binext" 2>&1 | \
		grep "hwflist" | \
		sed -e 's/hwflist://' -e 's/:/ /g' -e 's/\x0d/\x0a/g'
}

hwfs=($(get_supported_hwfeatures))
retcodes=()
optslist=()
echo "Total HW-feature combinations: $((1<<${#hwfs[@]}))"
for ((cbits=0; cbits < (1<<${#hwfs[@]}); cbits++)); do
  for ((mask=0; mask < ${#hwfs[@]}; mask++)); do
    match=$(((1<<mask) & cbits))
    if [ "x$match" != "x0" ]; then
      echo -n "--disable-hwf ${hwfs[$mask]} "
    fi
  done
  echo ""
done | sort | (
  # Run all combinations
  nbasic=0
  nwait=0
  failed=0
  output=""
  while read opts; do
    currn=$nbasic
    curr_jobs=($(jobs -p))
    while [ "${#curr_jobs[@]}" -ge "$njobs" ]; do
      # Wait for one job to complete
      wait ${retcodes[$nwait]}
      retval=$?
      if [ "x$retval" != "x0" ]; then
        output="$output\nERROR: HWF disable failed: [${optslist[$nwait]}]"
        failed=1
      else
        output="$output\nSUCCESS: HWF disable OK: [${optslist[$nwait]}]"
      fi
      nwait=$((nwait+1))
      curr_jobs=($(jobs -p))
      if [ $failed != 0 ]; then
        break
      fi
    done
    if [ $failed != 0 ]; then
      break
    fi
    nbasic=$((nbasic+1))
    echo "[$nbasic/$((1<<${#hwfs[@]}))] Basic test with '$opts'"
    optslist[$currn]="$opts"
    nice nice $binpre "tests/basic$binext" $opts & retcodes[$currn]=$!
  done

  # Fetch remaining return codes
  for ((; nwait < nbasic; nwait++)); do
    # Wait for one job to complete
    wait ${retcodes[$nwait]}
    retval=$?
    if [ "x$retval" != "x0" ]; then
      output="$output\nERROR: HWF disable failed: [${optslist[$nwait]}]"
      failed=1
    else
      output="$output\nSUCCESS: HWF disable OK: [${optslist[$nwait]}]"
    fi
  done

  echo -e "$output"
  exit $failed
)