OILS / opy / TEST.sh View on Github | oilshell.org

270 lines, 149 significant
1#!/usr/bin/env bash
2#
3# Usage:
4# ./TEST.sh <function name>
5#
6# These are mostly run from this dir.
7
8set -o nounset
9set -o pipefail
10set -o errexit
11
12readonly THIS_DIR=$(cd $(dirname $0) && pwd)
13
14source $THIS_DIR/common.sh
15
16# We have to invoke opyc like this because byterun uses __import__, which
17# respects PYTHONPATH. If we use ../bin/opyc, it will use the CPython-compiled
18# bytecode in the repo, rather than the OPy-compiled bytecode in _tmp/oil-opy.
19opyc() {
20 python bin/opy_.pyc opyc "$@"
21}
22
23oil-opy() {
24 _tmp/oil-opy/bin/oil "$@"
25}
26
27# TODO:
28# - Run with oil.ovm{,-dbg}
29
30# 3/2018 byterun results:
31#
32# Ran 28 tests, 4 failures
33# asdl/arith_parse_test.pyc core/glob_test.pyc core/lexer_gen_test.pyc osh/lex_test.pyc
34#
35
36oil-unit() {
37 local dir=${1:-_tmp/repo-with-opy}
38 local vm=${2:-cpython} # byterun or cpython
39
40 pushd $dir
41
42 #$OPYC run core/cmd_exec_test.pyc
43
44 local n=0
45 local -a failures=()
46
47 # TODO: Share with test/unit.sh.
48 #for t in {build,test,native,asdl,core,osh,test,tools}/*_test.py; do
49 for t in {asdl,core,frontend,osh,ysh}/*_test.pyc; do
50
51 echo $t
52 if test $vm = byterun; then
53
54 set +o errexit
55 set +o nounset # for empty array!
56
57 # Note: adding PYTHONPATH screws things up, I guess because it's the HOST
58 # interpreter pythonpath.
59 opyc run $t
60 status=$?
61
62 if test $status -ne 0; then
63 failures=("${failures[@]}" $t)
64 fi
65 (( n++ ))
66
67 elif test $vm = cpython; then
68 PYTHONPATH=. python $t
69 #(( n++ ))
70
71 else
72 die "Invalid VM $vm"
73 fi
74 done
75 popd
76
77 if test $vm = byterun; then
78 echo "Ran $n tests, ${#failures[@]} failures"
79 echo "${failures[@]}"
80 fi
81}
82
83oil-unit-byterun() {
84 oil-unit '' byterun
85}
86
87readonly -a FAILED=(
88 asdl/demo_asdl_test.pyc
89)
90
91oil-byterun-failed() {
92 #set +o errexit
93
94 for t in "${FAILED[@]}"; do
95
96 echo
97 echo ---
98 echo --- $t
99 echo ---
100
101 pushd _tmp/repo-with-opy
102 opyc run $t
103 popd
104 done
105}
106
107byterun-unit() {
108 pushd $THIS_DIR/..
109 for t in opy/byterun/test_*.py; do
110 echo
111 echo "*** $t"
112 echo
113 PYTHONPATH=. $t
114 done
115 popd
116}
117
118
119# TODO: Fix this!
120opy-unit() {
121 for t in compiler2/*_test.py; do
122 echo $t
123 $t
124 done
125}
126
127# Isolated failures.
128
129# File "/home/andy/git/oilshell/oil/bin/../opy/byterun/pyvm2.py", line 288, in manage_block_stack
130# block = self.frame.block_stack[-1]
131# IndexError: list index out of range
132
133generator-exception() {
134 testdata/generator_exception.py
135 ../bin/opyc run testdata/generator_exception.py
136}
137
138generator-exception-diff() {
139 rm -f -v testdata/generator_exception.pyc
140 testdata/generator_exception.py
141
142 pushd testdata
143 python -c 'import generator_exception'
144 popd
145
146 echo ---
147 ../bin/opyc compile testdata/generator_exception.py _tmp/ge-opy.pyc
148
149 ../bin/opyc dis testdata/generator_exception.pyc > _tmp/ge-cpython.txt
150 ../bin/opyc dis _tmp/ge-opy.pyc > _tmp/ge-opy.txt
151
152 diff -u _tmp/ge-{cpython,opy}.txt
153}
154
155# TypeError: unbound method append() must be called with SubPattern instance as
156# first argument (got tuple instance instead)
157
158regex-compile() {
159 testdata/regex_compile.py
160 echo ---
161 ../bin/opyc run testdata/regex_compile.py
162}
163
164re-dis() {
165 ../bin/opyc dis /usr/lib/python2.7/sre_parse.pyc
166}
167
168# Spec tests under byterun.
169spec() {
170 local action=$1 # e.g. 'smoke' or 'all'
171 shift
172
173 pushd $THIS_DIR/..
174
175 # TODO: Should be OSH_ALT instead of OSH_OVM?
176 # Usually it is dev build vs. release build, but here it is CPython vs.
177 # byterun.
178
179 # HACK to get around __import__ problem with byterun.
180
181 OSH_LIST="bin/osh $OSH_BYTERUN" test/spec.sh $action "$@"
182 popd
183}
184
185# The way to tickle the 'import' bug. We need to wrap SOME functions in
186# pyobj.Function. Otherwise it will run too fast!
187
188opy-speed-test() {
189 opyc-compile testdata/speed.py _tmp/speed.pyc
190 opyc-compile testdata/speed_main.py _tmp/speed_main.pyc
191
192 cp _tmp/speed.pyc _tmp/speed.opyc
193
194 # For logging
195 local n=10000
196 #local n=10
197
198 # 7 ms
199 echo PYTHON
200 time python _tmp/speed.opyc $n
201
202 # 205 ms. So it's 30x slower. Makes sense.
203 echo OPY
204 time opyc-run _tmp/speed.opyc $n
205
206 #
207 # byterun Import bug regression test!
208 #
209
210 # 7 ms
211 echo PYTHON
212 time python _tmp/speed_main.pyc $n
213
214 # 205 ms. So it's 30x slower. Makes sense.
215 echo OPY
216 time opyc-run _tmp/speed_main.pyc $n
217}
218
219# Compare execution.
220# Although some of these are mostly there for disassembly.
221gold() {
222 set +o errexit
223
224 mkdir -p _tmp
225
226 for script in gold/*.py; do
227
228 $script > _tmp/gold-cpython.txt 2>&1
229
230 # As a test, disable LOAD_FAST, etc. The output should still be the same.
231 ../bin/opyc run --fast-ops=0 $script > _tmp/gold-opy-byterun.txt 2>&1
232
233 if diff -u _tmp/gold-{cpython,opy-byterun}.txt; then
234 echo "OK $script"
235 else
236 echo "FAIL $script"
237 return 1
238 fi
239 done
240}
241
242compile-with-cpython() {
243 local path=${1:-gold/with_statement.py}
244 local pyc=${path}c
245 rm --verbose -f $pyc
246 pushd $(dirname $path)
247 python -c "import $(basename $path .py)"
248 popd
249 ls -l $pyc
250
251 ../bin/opyc dis $pyc
252}
253
254# Print something 99 parentheses deep! It causes a MemoryError in the parser,
255# but 98 doesn't. I noticed MAXSTACK = 1500 in Parser/parser.h.
256pgen-stack() {
257 python -c '
258import sys
259n = int(sys.argv[1])
260print "(" * n
261print "42"
262print ")" * n
263' 99 > _tmp/deep.py
264
265 python _tmp/deep.py
266}
267
268if test $(basename $0) = 'TEST.sh'; then
269 "$@"
270fi