File: parallelize-testsuite

package info (click to toggle)
ghdl 2.0.0%2Bdfsg-6.2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 72,852 kB
  • sloc: ada: 238,924; vhdl: 196,551; ansic: 24,457; python: 17,483; sh: 11,399; cpp: 2,283; makefile: 1,440; pascal: 516; exp: 40; asm: 25
file content (132 lines) | stat: -rw-r--r-- 3,725 bytes parent folder | download
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
Description: Parallelize suite_driver with xargs -P
 The vests suite is still sequential since it doesn't seem to go through
 suite_driver which is still limiting the speedup.
 .
 Retrieved from upstream git, where it was added after the 2.0 release. Changed
 to not print informational messages on stderr which would cause autopkgtest to
 never succeed as all output on stderr is considered failure.
Author: Daniel Gröber <dxld@darkboxed.org>
Origin: upstream, https://github.com/ghdl/ghdl/commit/8d9af3c5b52ba0ac814f2a5f4cda99ea306e813a
Last-Update: 2022-11-27
---
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
--- a/testsuite/suite_driver.sh
+++ b/testsuite/suite_driver.sh
@@ -9,31 +9,35 @@
 ANSI_RED="\033[31m"
 ANSI_NOCOLOR="\033[0m"
 
-_suite="$1"
-shift
+parse_cmdline () {
+  _suite="$1"
+  shift
+
+  # This is the only place where test dirs are specified.
+  #Do not duplicate this line
+  dirs="*[0-9]*"
+
+  full=n
+
+  for opt; do
+    case "$opt" in
+    -k | --keep-going)  full=y ;;
+    -j*) NPROC=${opt#-j} ;;
+    --dir=*) dirs="$(echo "$opt" | sed -e 's/--dir=//')" ;;
+    --skip=*) d="$(echo "$opt" | sed -e 's/--skip=//')"
+              dirs="$(echo "" "$dirs" | sed -e "s/ $d//")" ;;
+    --start-at=*) d="$(echo "$opt" | sed -e 's/--start-at=//')"
+		  dirs="$(echo "" "$dirs" | sed -e "s/^.* $d//")"
+		  dirs="$d $dirs" ;;
+    --list-tests) echo "$dirs"; exit 0;;
+    *) echo "Unknown option $opt"
+       exit 2
+       ;;
+    esac
+  done
 
-# This is the only place where test dirs are specified.
-#Do not duplicate this line
-dirs="*[0-9]*"
-
-failures=""
-full=n
-
-for opt; do
-  case "$opt" in
-  -k | --keep-going)  full=y ;;
-  --dir=*) dirs="$(echo "$opt" | sed -e 's/--dir=//')" ;;
-  --skip=*) d="$(echo "$opt" | sed -e 's/--skip=//')"
-            dirs="$(echo "" "$dirs" | sed -e "s/ $d//")" ;;
-  --start-at=*) d="$(echo "$opt" | sed -e 's/--start-at=//')"
-            dirs="$(echo "" "$dirs" | sed -e "s/^.* $d//")"
-            dirs="$d $dirs" ;;
-  --list-tests) echo "$dirs"; exit 0;;
-  *) echo "Unknown option $opt"
-     exit 2
-     ;;
-  esac
-done
+  NPROC=${NPROC:-$(nproc || echo 1)}
+}
 
 singlerun() {
   cd "$1"
@@ -41,21 +45,49 @@
     printf "$_suite $1: ${ANSI_GREEN}ok${ANSI_NOCOLOR}\n"
     # Don't disp log
   else
-    printf "$_suite $1: ${ANSI_RED}failed${ANSI_NOCOLOR}\n"
-    cat test.log
-    if [ x"$2" = x"y" ]; then
-      failures="$failures $1"
-    else
+    printf '%s ' "$1" >> ../failures.log
+    if [ x"$2" = x"n" ]; then
       exit 1;
     fi
   fi
   cd ..
 }
 
-for i in $dirs; do singlerun "$i" "$full"; done
+allrun () {
+  printf '' > failures.log
+
+  if command -v xargs >/dev/null 2>&1 && [ "$NPROC" != 1 ]; then
+    echo "..Running with $NPROC test workers."
+    ndirs=$(printf '%s\n' $dirs | wc -l)
+    echo $dirs | DO_ALLRUN=0 xargs -P"$NPROC" -n$((1 + ndirs / NPROC)) sh -c \
+      's=$1; _suite=$2 full=$3; shift 3; . "$s";
+       for i in "$@"; do singlerun "$i" "$full" || true; done' \
+      \
+      sh "$0" "$_suite" "$full" || true
+  else
+    for i in $dirs; do singlerun "$i" "$full"; done
+  fi
+
+  if [ ! -e failures.log ]; then
+    echo "error: Couldn't find test driver generated failures.log!">&2
+    exit 1
+  fi
 
-if [ x"$failures" = x"" ]; then
+  failures="$(cat failures.log)"
+  if [ x"$failures" = x"" ]; then
     echo "$_suite tests are successful" && exit 0
-else
+  else
+    for failed in $failures; do
+      printf "$_suite $failed: ${ANSI_RED}failed${ANSI_NOCOLOR}\n"
+      cat "$failed"/test.log
+      printf '\n\n'
+    done
+
     echo "$_suite test failed ($failures)" && exit 1
+  fi
+}
+
+if [ "$DO_ALLRUN" != 0 ]; then
+  parse_cmdline "$@"
+  allrun
 fi