838ed8f4c94ca5af15c4d68728e6b76a7bdf4225
[stockfish] / tests / instrumented.sh
1 #!/bin/bash
2 # check for errors under valgrind or sanitizers.
3
4 error()
5 {
6   echo "instrumented testing failed on line $1"
7   exit 1
8 }
9 trap 'error ${LINENO}' ERR
10
11 # define suitable post and prefixes for testing options
12 case $1 in
13   --valgrind)
14     echo "valgrind testing started"
15     prefix=''
16     exeprefix='valgrind --error-exitcode=42'
17     postfix='1>/dev/null'
18     threads="1"
19   ;;
20   --sanitizer-undefined)
21     echo "sanitizer testing started"
22     prefix='!'
23     exeprefix=''
24     postfix='2>&1 | grep "runtime error:"'
25     threads="1"
26   ;;
27   --sanitizer-thread)
28     echo "sanitizer testing started"
29     prefix='!'
30     exeprefix=''
31     postfix='2>&1 | grep "WARNING: ThreadSanitizer:"'
32     threads="2"
33
34 cat << EOF > tsan.supp
35 race:TTEntry::move
36 race:TTEntry::depth
37 race:TTEntry::bound
38 race:TTEntry::save
39 race:TTEntry::value
40 race:TTEntry::eval
41
42 race:TranspositionTable::probe
43 race:TranspositionTable::generation
44 race:TranspositionTable::hashfull
45
46 EOF
47
48     export TSAN_OPTIONS="suppressions=./tsan.supp"
49
50   ;;
51   *)
52     echo "unknown testing started"
53     prefix=''
54     exeprefix=''
55     postfix=''
56     threads="1"
57   ;;
58 esac
59
60 # simple command line testing
61 for args in "eval" \
62             "go nodes 1000" \
63             "go depth 10" \
64             "go movetime 1000" \
65             "go wtime 8000 btime 8000 winc 500 binc 500" \
66             "bench 128 $threads 10 default depth"
67 do
68
69    echo "$prefix $exeprefix ./stockfish $args $postfix"
70    eval "$prefix $exeprefix ./stockfish $args $postfix"
71
72 done
73
74 # more general testing, following an uci protocol exchange
75 cat << EOF > game.exp
76  set timeout 10
77  spawn $exeprefix ./stockfish
78
79  send "uci\n"
80  expect "uciok"
81
82  send "setoption name Threads value $threads\n"
83
84  send "ucinewgame\n"
85  send "position startpos\n"
86  send "go nodes 1000\n"
87  expect "bestmove"
88
89  send "position startpos moves e2e4 e7e6\n"
90  send "go nodes 1000\n"
91  expect "bestmove"
92
93  send "position fen 5rk1/1K4p1/8/8/3B4/8/8/8 b - - 0 1\n"
94  send "go depth 30\n"
95  expect "bestmove"
96
97  send "quit\n"
98  expect eof
99
100  # return error code of the spawned program, useful for valgrind
101  lassign [wait] pid spawnid os_error_flag value
102  exit \$value
103 EOF
104
105 for exps in game.exp
106 do
107
108   echo "$prefix expect $exps $postfix"
109   eval "$prefix expect $exps $postfix"
110
111   rm $exps
112
113 done
114
115 rm -f tsan.supp
116
117 echo "instrumented testing OK"