blob: b98bb96ea83c5339ccb9a8393fa926faf472f3c5 [file] [log] [blame]
Tristan Matthews04616462013-11-14 16:09:34 -05001#! /bin/sh
2
3# Run the PCRE tests using the pcretest program. The appropriate tests are
4# selected, depending on which build-time options were used.
5
6# All tests are now run both with and without -s, to ensure that everything is
7# tested with and without studying. However, there are some tests that produce
8# different output after studying, typically when we are tracing the actual
9# matching process (for example, using auto-callouts). In these few cases, the
10# tests are duplicated in the files, one with /S to force studying always, and
11# one with /SS to force *not* studying always. The use of -s doesn't then make
12# any difference to their output. There is also one test which compiles invalid
13# UTF-8 with the UTF-8 check turned off; for this, studying must also be
14# disabled with /SS.
15
16# When JIT support is available, all the tests are also run with -s+ to test
17# (again, almost) everything with studying and the JIT option. There are also
18# two tests for JIT-specific features, one to be run when JIT support is
19# available, and one when it is not.
20
21# The arguments for this script can be individual test numbers, or the word
22# "valgrind", or "sim" followed by an argument to run cross-compiled
23# executables under a simulator, for example:
24#
25# RunTest 3 sim "qemu-arm -s 8388608"
26
27valgrind=
28sim=
29
30# Select which tests to run; for those that are explicitly requested, check
31# that the necessary optional facilities are available.
32
33do1=no
34do2=no
35do3=no
36do4=no
37do5=no
38do6=no
39do7=no
40do8=no
41do9=no
42do10=no
43do11=no
44do12=no
45do13=no
46do14=no
47do15=no
48
49while [ $# -gt 0 ] ; do
50 case $1 in
51 1) do1=yes;;
52 2) do2=yes;;
53 3) do3=yes;;
54 4) do4=yes;;
55 5) do5=yes;;
56 6) do6=yes;;
57 7) do7=yes;;
58 8) do8=yes;;
59 9) do9=yes;;
60 10) do10=yes;;
61 11) do11=yes;;
62 12) do12=yes;;
63 13) do13=yes;;
64 14) do14=yes;;
65 15) do15=yes;;
66 valgrind) valgrind="valgrind -q --smc-check=all";;
67 sim) shift; sim=$1;;
68 *) echo "Unknown test number $1"; exit 1;;
69 esac
70 shift
71done
72
73# Set up a suitable "diff" command for comparison. Some systems
74# have a diff that lacks a -u option. Try to deal with this.
75
76if diff -u /dev/null /dev/null; then cf="diff -u"; else cf="diff"; fi
77
78# Find the test data
79
80if [ -n "$srcdir" -a -d "$srcdir" ] ; then
81 testdata="$srcdir/testdata"
82elif [ -d "./testdata" ] ; then
83 testdata=./testdata
84elif [ -d "../testdata" ] ; then
85 testdata=../testdata
86else
87 echo "Cannot find the testdata directory"
88 exit 1
89fi
90
91# Find which optional facilities are available. In some Windows environments
92# the output of pcretest -C has CRLF at the end of each line, but the shell
93# strips only linefeeds from the output of a `backquoted` command. Hence the
94# alternative patterns.
95
96case `$sim ./pcretest -C | $sim ./pcregrep 'Internal link size'` in
97 *2|*2[[:space:]]) link_size=2;;
98 *3|*3[[:space:]]) link_size=3;;
99 *4|*4[[:space:]]) link_size=4;;
100 *) echo "Failed to find internal link size"; exit 1;;
101esac
102
103$sim ./pcretest -C | $sim ./pcregrep 'No UTF-8 support' >/dev/null
104utf8=$?
105
106$sim ./pcretest -C | $sim ./pcregrep 'No Unicode properties support' >/dev/null
107ucp=$?
108
109jitopt=
110$sim ./pcretest -C | $sim ./pcregrep 'No just-in-time compiler support' \
111 >/dev/null
112jit=$?
113if [ $jit -ne 0 ] ; then
114 jitopt=-s+
115fi
116
117if [ $utf8 -eq 0 ] ; then
118 if [ $do4 = yes ] ; then
119 echo "Can't run test 4 because UTF-8 support is not configured"
120 exit 1
121 fi
122 if [ $do5 = yes ] ; then
123 echo "Can't run test 5 because UTF-8 support is not configured"
124 exit 1
125 fi
126 if [ $do8 = yes ] ; then
127 echo "Can't run test 8 because UTF-8 support is not configured"
128 exit 1
129 fi
130 if [ $do12 = yes ] ; then
131 echo "Can't run test 12 because UTF-8 support is not configured"
132 exit 1
133 fi
134fi
135
136if [ $ucp -eq 0 ] ; then
137 if [ $do6 = yes ] ; then
138 echo "Can't run test 6 because Unicode property support is not configured"
139 exit 1
140 fi
141 if [ $do9 = yes ] ; then
142 echo "Can't run test 9 because Unicode property support is not configured"
143 exit 1
144 fi
145 if [ $do10 = yes ] ; then
146 echo "Can't run test 10 because Unicode property support is not configured"
147 exit 1
148 fi
149 if [ $do13 = yes ] ; then
150 echo "Can't run test 12 because Unicode property support is not configured"
151 exit 1
152 fi
153fi
154
155if [ $link_size -ne 2 ] ; then
156 if [ $do10 = yes ] ; then
157 echo "Can't run test 10 because the link size ($link_size) is not 2"
158 exit 1
159 fi
160fi
161
162if [ $jit -eq 0 ] ; then
163 if [ $do14 = "yes" ] ; then
164 echo "Can't run test 14 because JIT support is not configured"
165 exit 1
166 fi
167else
168 if [ $do15 = "yes" ] ; then
169 echo "Can't run test 15 because JIT support is configured"
170 exit 1
171 fi
172fi
173
174# If no specific tests were requested, select all. Those that are not
175# relevant will be skipped.
176
177if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a \
178 $do5 = no -a $do6 = no -a $do7 = no -a $do8 = no -a \
179 $do9 = no -a $do10 = no -a $do11 = no -a $do12 = no -a \
180 $do13 = no -a $do14 = no -a $do15 = no ] ; then
181 do1=yes
182 do2=yes
183 do3=yes
184 do4=yes
185 do5=yes
186 do6=yes
187 do7=yes
188 do8=yes
189 do9=yes
190 do10=yes
191 do11=yes
192 do12=yes
193 do13=yes
194 do14=yes
195 do15=yes
196fi
197
198# Show which release and which test data
199
200echo ""
201echo PCRE C library tests using test data from $testdata
202$sim ./pcretest /dev/null
203
204# Primary test, compatible with JIT and all versions of Perl >= 5.8
205
206if [ $do1 = yes ] ; then
207 echo "Test 1: main functionality (Compatible with Perl >= 5.8)"
208 for opt in "" "-s" $jitopt; do
209 $sim $valgrind ./pcretest -q $opt $testdata/testinput1 testtry
210 if [ $? = 0 ] ; then
211 $cf $testdata/testoutput1 testtry
212 if [ $? != 0 ] ; then exit 1; fi
213 else exit 1
214 fi
215 if [ "$opt" = "-s" ] ; then echo " OK with study"
216 elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study"
217 else echo " OK"
218 fi
219 done
220fi
221
222# PCRE tests that are not JIT or Perl-compatible: API, errors, internals
223
224if [ $do2 = yes ] ; then
225 echo "Test 2: API, errors, internals, and non-Perl stuff (not UTF-8)"
226 for opt in "" "-s" $jitopt; do
227 $sim $valgrind ./pcretest -q $opt $testdata/testinput2 testtry
228 if [ $? = 0 ] ; then
229 $cf $testdata/testoutput2 testtry
230 if [ $? != 0 ] ; then exit 1; fi
231 else
232 echo " "
233 echo "** Test 2 requires a lot of stack. If it has crashed with a"
234 echo "** segmentation fault, it may be that you do not have enough"
235 echo "** stack available by default. Please see the 'pcrestack' man"
236 echo "** page for a discussion of PCRE's stack usage."
237 echo " "
238 exit 1
239 fi
240 if [ "$opt" = "-s" ] ; then echo " OK with study"
241 elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study"
242 else echo " OK"
243 fi
244 done
245fi
246
247# Locale-specific tests, provided that either the "fr_FR" or the "french"
248# locale is available. The former is the Unix-like standard; the latter is
249# for Windows. Another possibility is "fr", which needs to be run against
250# the Windows-specific input and output files.
251
252if [ $do3 = yes ] ; then
253 locale -a | grep '^fr_FR$' >/dev/null
254 if [ $? -eq 0 ] ; then
255 locale=fr_FR
256 infile=$testdata/testinput3
257 outfile=$testdata/testoutput3
258 else
259 infile=test3input
260 outfile=test3output
261 locale -a | grep '^french$' >/dev/null
262 if [ $? -eq 0 ] ; then
263 locale=french
264 sed 's/fr_FR/french/' $testdata/testinput3 >test3input
265 sed 's/fr_FR/french/' $testdata/testoutput3 >test3output
266 else
267 locale -a | grep '^fr$' >/dev/null
268 if [ $? -eq 0 ] ; then
269 locale=fr
270 sed 's/fr_FR/fr/' $testdata/wintestinput3 >test3input
271 sed 's/fr_FR/fr/' $testdata/wintestoutput3 >test3output
272 else
273 locale=
274 fi
275 fi
276 fi
277
278 if [ "$locale" != "" ] ; then
279 echo "Test 3: locale-specific features (using '$locale' locale)"
280 for opt in "" "-s" $jitopt; do
281 $sim $valgrind ./pcretest -q $opt $infile testtry
282 if [ $? = 0 ] ; then
283 $cf $outfile testtry
284 if [ $? != 0 ] ; then
285 echo " "
286 echo "Locale test did not run entirely successfully."
287 echo "This usually means that there is a problem with the locale"
288 echo "settings rather than a bug in PCRE."
289 break;
290 else
291 if [ "$opt" = "-s" ] ; then echo " OK with study"
292 elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study"
293 else echo " OK"
294 fi
295 fi
296 else exit 1
297 fi
298 done
299 else
300 echo "Cannot test locale-specific features - none of the 'fr_FR', 'fr' or"
301 echo "'french' locales exist, or the \"locale\" command is not available"
302 echo "to check for them."
303 echo " "
304 fi
305fi
306
307# Additional tests for UTF8 support
308
309if [ $do4 = yes ] ; then
310 echo "Test 4: UTF-8 support (Compatible with Perl >= 5.8)"
311 if [ $utf8 -eq 0 ] ; then
312 echo " Skipped because UTF-8 support is not available"
313 else
314 for opt in "" "-s" $jitopt; do
315 $sim $valgrind ./pcretest -q $opt $testdata/testinput4 testtry
316 if [ $? = 0 ] ; then
317 $cf $testdata/testoutput4 testtry
318 if [ $? != 0 ] ; then exit 1; fi
319 else exit 1
320 fi
321 if [ "$opt" = "-s" ] ; then echo " OK with study"
322 elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study"
323 else echo " OK"
324 fi
325 done
326 fi
327fi
328
329if [ $do5 = yes ] ; then
330 echo "Test 5: API, internals, and non-Perl stuff for UTF-8 support"
331 if [ $utf8 -eq 0 ] ; then
332 echo " Skipped because UTF-8 support is not available"
333 else
334 for opt in "" "-s" $jitopt; do
335 $sim $valgrind ./pcretest -q $opt $testdata/testinput5 testtry
336 if [ $? = 0 ] ; then
337 $cf $testdata/testoutput5 testtry
338 if [ $? != 0 ] ; then exit 1; fi
339 else exit 1
340 fi
341 if [ "$opt" = "-s" ] ; then echo " OK with study"
342 elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study"
343 else echo " OK"
344 fi
345 done
346 fi
347fi
348
349if [ $do6 = yes ] ; then
350 echo "Test 6: Unicode property support (Compatible with Perl >= 5.10)"
351 if [ $utf8 -eq 0 -o $ucp -eq 0 ] ; then
352 echo " Skipped because Unicode property support is not available"
353 else
354 for opt in "" "-s" $jitopt; do
355 $sim $valgrind ./pcretest -q $opt $testdata/testinput6 testtry
356 if [ $? = 0 ] ; then
357 $cf $testdata/testoutput6 testtry
358 if [ $? != 0 ] ; then exit 1; fi
359 else exit 1
360 fi
361 if [ "$opt" = "-s" ] ; then echo " OK with study"
362 elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study"
363 else echo " OK"
364 fi
365 done
366 fi
367fi
368
369# Tests for DFA matching support
370
371if [ $do7 = yes ] ; then
372 echo "Test 7: DFA matching"
373 for opt in "" "-s"; do
374 $sim $valgrind ./pcretest -q $opt -dfa $testdata/testinput7 testtry
375 if [ $? = 0 ] ; then
376 $cf $testdata/testoutput7 testtry
377 if [ $? != 0 ] ; then exit 1; fi
378 else exit 1
379 fi
380 if [ "$opt" = "-s" ] ; then echo " OK with study" ; else echo " OK"; fi
381 done
382fi
383
384if [ $do8 = yes ] ; then
385 echo "Test 8: DFA matching with UTF-8"
386 if [ $utf8 -eq 0 ] ; then
387 echo " Skipped because UTF-8 support is not available"
388 else
389 for opt in "" "-s"; do
390 $sim $valgrind ./pcretest -q $opt -dfa $testdata/testinput8 testtry
391 if [ $? = 0 ] ; then
392 $cf $testdata/testoutput8 testtry
393 if [ $? != 0 ] ; then exit 1; fi
394 else exit 1
395 fi
396 if [ "$opt" = "-s" ] ; then echo " OK with study" ; else echo " OK"; fi
397 done
398 fi
399fi
400
401if [ $do9 = yes ] ; then
402 echo "Test 9: DFA matching with Unicode properties"
403 if [ $utf8 -eq 0 -o $ucp -eq 0 ] ; then
404 echo " Skipped because Unicode property support is not available"
405 else
406 for opt in "" "-s"; do
407 $sim $valgrind ./pcretest -q $opt -dfa $testdata/testinput9 testtry
408 if [ $? = 0 ] ; then
409 $cf $testdata/testoutput9 testtry
410 if [ $? != 0 ] ; then exit 1; fi
411 else exit 1
412 fi
413 if [ "$opt" = "-s" ] ; then echo " OK with study" ; else echo " OK"; fi
414 done
415 fi
416fi
417
418# Test of internal offsets and code sizes. This test is run only when there
419# is Unicode property support and the link size is 2. The actual tests are
420# mostly the same as in some of the above, but in this test we inspect some
421# offsets and sizes that require a known link size. This is a doublecheck for
422# the maintainer, just in case something changes unexpectely.
423
424if [ $do10 = yes ] ; then
425 echo "Test 10: Internal offsets and code size tests"
426 if [ $link_size -ne 2 ] ; then
427 echo " Skipped because link size is not 2"
428 elif [ $ucp -eq 0 ] ; then
429 echo " Skipped because Unicode property support is not available"
430 else
431 for opt in "" "-s"; do
432 $sim $valgrind ./pcretest -q $opt $testdata/testinput10 testtry
433 if [ $? = 0 ] ; then
434 $cf $testdata/testoutput10 testtry
435 if [ $? != 0 ] ; then exit 1; fi
436 else exit 1
437 fi
438 if [ "$opt" = "-s" ] ; then echo " OK with study" ; else echo " OK"; fi
439 done
440 fi
441fi
442
443# Test of Perl >= 5.10 features without UTF8 support
444
445if [ $do11 = yes ] ; then
446 echo "Test 11: Features from Perl >= 5.10 without UTF8 support"
447 for opt in "" "-s" $jitopt; do
448 $sim $valgrind ./pcretest -q $opt $testdata/testinput11 testtry
449 if [ $? = 0 ] ; then
450 $cf $testdata/testoutput11 testtry
451 if [ $? != 0 ] ; then exit 1; fi
452 else exit 1
453 fi
454 if [ "$opt" = "-s" ] ; then echo " OK with study"
455 elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study"
456 else echo " OK"
457 fi
458 done
459fi
460
461# Test of Perl >= 5.10 features with UTF8 support
462
463if [ $do12 = yes ] ; then
464 echo "Test 12: Features from Perl >= 5.10 with UTF8 support"
465 if [ $utf8 -eq 0 ] ; then
466 echo " Skipped because UTF-8 support is not available"
467 else
468 for opt in "" "-s" $jitopt; do
469 $sim $valgrind ./pcretest -q $opt $testdata/testinput12 testtry
470 if [ $? = 0 ] ; then
471 $cf $testdata/testoutput12 testtry
472 if [ $? != 0 ] ; then exit 1; fi
473 else exit 1
474 fi
475 if [ "$opt" = "-s" ] ; then echo " OK with study"
476 elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study"
477 else echo " OK"
478 fi
479 done
480 fi
481fi
482
483# Test non-Perl-compatible Unicode property support
484
485if [ $do13 = yes ] ; then
486 echo "Test 13: API, internals, and non-Perl stuff for Unicode property support"
487 if [ $utf8 -eq 0 -o $ucp -eq 0 ] ; then
488 echo " Skipped because Unicode property support is not available"
489 else
490 for opt in "" "-s" $jitopt; do
491 $sim $valgrind ./pcretest -q $opt $testdata/testinput13 testtry
492 if [ $? = 0 ] ; then
493 $cf $testdata/testoutput13 testtry
494 if [ $? != 0 ] ; then exit 1; fi
495 else exit 1
496 fi
497 if [ "$opt" = "-s" ] ; then echo " OK with study"
498 elif [ "$opt" = "-s+" ] ; then echo " OK with JIT study"
499 else echo " OK"
500 fi
501 done
502 fi
503fi
504
505# Test JIT-specific features when JIT is available
506
507if [ $do14 = yes ] ; then
508 echo "Test 14: JIT-specific features (JIT available)"
509 if [ $jit -eq 0 ] ; then
510 echo " Skipped because JIT is not available or not usable"
511 else
512 $sim $valgrind ./pcretest -q $testdata/testinput14 testtry
513 if [ $? = 0 ] ; then
514 $cf $testdata/testoutput14 testtry
515 if [ $? != 0 ] ; then exit 1; fi
516 else exit 1
517 fi
518 echo " OK"
519 fi
520fi
521
522# Test JIT-specific features when JIT is not available
523
524if [ $do15 = yes ] ; then
525 echo "Test 15: JIT-specific features (JIT not available)"
526 if [ $jit -ne 0 ] ; then
527 echo " Skipped because JIT is available"
528 else
529 $sim $valgrind ./pcretest -q $testdata/testinput15 testtry
530 if [ $? = 0 ] ; then
531 $cf $testdata/testoutput15 testtry
532 if [ $? != 0 ] ; then exit 1; fi
533 else exit 1
534 fi
535 echo " OK"
536 fi
537fi
538
539# End