]> git.sesse.net Git - stockfish/blob - tests/instrumented.sh
Add network export to CI
[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 --errors-for-leak-kinds=all --leak-check=full'
17     postfix='1>/dev/null'
18     threads="1"
19   ;;
20   --valgrind-thread)
21     echo "valgrind-thread testing started"
22     prefix=''
23     exeprefix='valgrind --fair-sched=try --error-exitcode=42'
24     postfix='1>/dev/null'
25     threads="2"
26   ;;
27   --sanitizer-undefined)
28     echo "sanitizer-undefined testing started"
29     prefix='!'
30     exeprefix=''
31     postfix='2>&1 | grep -A50 "runtime error:"'
32     threads="1"
33   ;;
34   --sanitizer-thread)
35     echo "sanitizer-thread testing started"
36     prefix='!'
37     exeprefix=''
38     postfix='2>&1 | grep -A50 "WARNING: ThreadSanitizer:"'
39     threads="2"
40
41 cat << EOF > tsan.supp
42 race:Stockfish::TTEntry::move
43 race:Stockfish::TTEntry::depth
44 race:Stockfish::TTEntry::bound
45 race:Stockfish::TTEntry::save
46 race:Stockfish::TTEntry::value
47 race:Stockfish::TTEntry::eval
48 race:Stockfish::TTEntry::is_pv
49
50 race:Stockfish::TranspositionTable::probe
51 race:Stockfish::TranspositionTable::hashfull
52
53 EOF
54
55     export TSAN_OPTIONS="suppressions=./tsan.supp"
56
57   ;;
58   *)
59     echo "unknown testing started"
60     prefix=''
61     exeprefix=''
62     postfix=''
63     threads="1"
64   ;;
65 esac
66
67 # simple command line testing
68 for args in "eval" \
69             "go nodes 1000" \
70             "go depth 10" \
71             "go movetime 1000" \
72             "go wtime 8000 btime 8000 winc 500 binc 500" \
73             "bench 128 $threads 8 default depth" \
74             "export_net verify.nnue"
75 do
76
77    echo "$prefix $exeprefix ./stockfish $args $postfix"
78    eval "$prefix $exeprefix ./stockfish $args $postfix"
79
80 done
81
82 # verify the generated net equals the base net
83 network=`./stockfish uci | grep 'option name EvalFile type string default' | awk '{print $NF}'`
84 echo "Comparing $network to the written verify.nnue"
85 diff $network verify.nnue
86
87 # more general testing, following an uci protocol exchange
88 cat << EOF > game.exp
89  set timeout 240
90  spawn $exeprefix ./stockfish
91
92  send "uci\n"
93  expect "uciok"
94
95  send "setoption name Threads value $threads\n"
96
97  send "ucinewgame\n"
98  send "position startpos\n"
99  send "go nodes 1000\n"
100  expect "bestmove"
101
102  send "position startpos moves e2e4 e7e6\n"
103  send "go nodes 1000\n"
104  expect "bestmove"
105
106  send "position fen 5rk1/1K4p1/8/8/3B4/8/8/8 b - - 0 1\n"
107  send "go depth 10\n"
108  expect "bestmove"
109
110  send "quit\n"
111  expect eof
112
113  # return error code of the spawned program, useful for valgrind
114  lassign [wait] pid spawnid os_error_flag value
115  exit \$value
116 EOF
117
118 #download TB as needed
119 if [ ! -d ../tests/syzygy ]; then
120    curl -sL https://api.github.com/repos/niklasf/python-chess/tarball/9b9aa13f9f36d08aadfabff872882f4ab1494e95 | tar -xzf -
121    mv niklasf-python-chess-9b9aa13 ../tests/syzygy
122 fi
123
124 cat << EOF > syzygy.exp
125  set timeout 240
126  spawn $exeprefix ./stockfish
127  send "uci\n"
128  send "setoption name SyzygyPath value ../tests/syzygy/\n"
129  expect "info string Found 35 tablebases" {} timeout {exit 1}
130  send "bench 128 1 8 default depth\n"
131  send "quit\n"
132  expect eof
133
134  # return error code of the spawned program, useful for valgrind
135  lassign [wait] pid spawnid os_error_flag value
136  exit \$value
137 EOF
138
139 for exp in game.exp syzygy.exp
140 do
141
142   echo "$prefix expect $exp $postfix"
143   eval "$prefix expect $exp $postfix"
144
145   rm $exp
146
147 done
148
149 rm -f tsan.supp
150
151 echo "instrumented testing OK"