1#! /bin/sh
2
3# Run PCRE tests.
4
5valgrind=
6
7# Set up a suitable "diff" command for comparison. Some systems
8# have a diff that lacks a -u option. Try to deal with this.
9
10if diff -u /dev/null /dev/null; then cf="diff -u"; else cf="diff"; fi
11
12# Find the test data
13
14testdata=testdata
15if [ -n "$srcdir" -a -d "$srcdir" ] ; then
16  testdata="$srcdir/testdata"
17fi
18
19# Find which optional facilities are available
20
21case `./pcretest -C | ./pcregrep 'Internal link size'` in
22  *2) link_size=2;;
23  *3) link_size=3;;
24  *4) link_size=4;;
25   *) echo "Failed to find internal link size"; exit 1;;
26esac
27
28./pcretest -C | ./pcregrep 'No UTF-8 support' >/dev/null
29utf8=$?
30
31./pcretest -C | ./pcregrep 'No Unicode properties support' >/dev/null
32ucp=$?
33
34# Select which tests to run; for those that are explicitly requested, check
35# that the necessary optional facilities are available.
36
37do1=no
38do2=no
39do3=no
40do4=no
41do5=no
42do6=no
43do7=no
44do8=no
45do9=no
46do10=no
47do11=no
48do12=no
49
50while [ $# -gt 0 ] ; do
51  case $1 in
52    1) do1=yes;;
53    2) do2=yes;;
54    3) do3=yes;;
55    4) do4=yes;;
56    5) do5=yes;;
57    6) do6=yes;;
58    7) do7=yes;;
59    8) do8=yes;;
60    9) do9=yes;;
61   10) do10=yes;;
62   11) do11=yes;;
63   12) do12=yes;;
64   valgrind) valgrind="valgrind -q";;
65    *) echo "Unknown test number $1"; exit 1;;
66  esac
67  shift
68done
69
70if [ $utf8 -eq 0 ] ; then
71  if [ $do4 = yes ] ; then
72    echo "Can't run test 4 because UTF-8 support is not configured"
73    exit 1
74  fi
75  if [ $do5 = yes ] ; then
76    echo "Can't run test 5 because UTF-8 support is not configured"
77    exit 1
78  fi
79  if [ $do8 = yes ] ; then
80    echo "Can't run test 8 because UTF-8 support is not configured"
81    exit 1
82  fi
83fi
84
85if [ $ucp -eq 0 ] ; then
86  if [ $do6 = yes ] ; then
87    echo "Can't run test 6 because Unicode property support is not configured"
88    exit 1
89  fi
90  if [ $do9 = yes ] ; then
91    echo "Can't run test 9 because Unicode property support is not configured"
92    exit 1
93  fi
94  if [ $do10 = yes ] ; then
95    echo "Can't run test 10 because Unicode property support is not configured"
96    exit 1
97  fi
98  if [ $do12 = yes ] ; then
99    echo "Can't run test 12 because Unicode property support is not configured"
100    exit 1
101  fi
102fi
103
104if [ $link_size -ne 2 ] ; then
105  if [ $do10 = yes ] ; then
106    echo "Can't run test 10 because the link size ($link_size) is not 2"
107    exit 1
108  fi
109fi
110
111# If no specific tests were requested, select all that are relevant.
112
113if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a \
114     $do5 = no -a $do6 = no -a $do7 = no -a $do8 = no -a \
115     $do9 = no -a $do10 = no -a $do11 = no -a $do12 = no ] ; then
116  do1=yes
117  do2=yes
118  do3=yes
119  if [ $utf8 -ne 0 ] ; then do4=yes; fi
120  if [ $utf8 -ne 0 ] ; then do5=yes; fi
121  if [ $utf8 -ne 0 -a $ucp -ne 0 ] ; then do6=yes; fi
122  do7=yes
123  if [ $utf8 -ne 0 ] ; then do8=yes; fi
124  if [ $utf8 -ne 0 -a $ucp -ne 0 ] ; then do9=yes; fi
125  if [ $link_size -eq 2 -a $ucp -ne 0 ] ; then do10=yes; fi
126  do11=yes
127  if [ $utf8 -ne 0 -a $ucp -ne 0 ] ; then do12=yes; fi
128fi
129
130# Show which release
131
132echo ""
133echo PCRE C library tests
134./pcretest /dev/null
135
136# Primary test, compatible with Perl 5.8, 5.10, 5.11
137
138if [ $do1 = yes ] ; then
139  echo "Test 1: main functionality (Perl 5.8, 5.10, 5.11 compatible)"
140  $valgrind ./pcretest -q $testdata/testinput1 testtry
141  if [ $? = 0 ] ; then
142    $cf $testdata/testoutput1 testtry
143    if [ $? != 0 ] ; then exit 1; fi
144  else exit 1
145  fi
146  echo "OK"
147fi
148
149# PCRE tests that are not Perl-compatible - API, errors, internals
150
151if [ $do2 = yes ] ; then
152  echo "Test 2: API, errors, internals, and non-Perl stuff"
153  $valgrind ./pcretest -q $testdata/testinput2 testtry
154  if [ $? = 0 ] ; then
155    $cf $testdata/testoutput2 testtry
156    if [ $? != 0 ] ; then exit 1; fi
157  else
158    echo " "
159    echo "** Test 2 requires a lot of stack. If it has crashed with a"
160    echo "** segmentation fault, it may be that you do not have enough"
161    echo "** stack available by default. Please see the 'pcrestack' man"
162    echo "** page for a discussion of PCRE's stack usage."
163    echo " "
164    exit 1
165  fi
166  echo "OK"
167fi
168
169# Locale-specific tests, provided that either the "fr_FR" or the "french"
170# locale is available. The former is the Unix-like standard; the latter is
171# for Windows.
172
173if [ $do3 = yes ] ; then
174  locale -a | grep '^fr_FR$' >/dev/null
175  if [ $? -eq 0 ] ; then
176    locale=fr_FR
177    infile=$testdata/testinput3
178    outfile=$testdata/testoutput3
179  else
180    locale -a | grep '^french$' >/dev/null
181    if [ $? -eq 0 ] ; then
182      locale=french
183      sed 's/fr_FR/french/' $testdata/testinput3 >test3input
184      sed 's/fr_FR/french/' $testdata/testoutput3 >test3output
185      infile=test3input
186      outfile=test3output
187    else
188      locale=
189    fi
190  fi
191
192  if [ "$locale" != "" ] ; then
193    echo "Test 3: locale-specific features (using '$locale' locale)"
194    $valgrind ./pcretest -q $infile testtry
195    if [ $? = 0 ] ; then
196      $cf $outfile testtry
197      if [ $? != 0 ] ; then
198        echo " "
199        echo "Locale test did not run entirely successfully."
200        echo "This usually means that there is a problem with the locale"
201        echo "settings rather than a bug in PCRE."
202      else
203      echo "OK"
204      fi
205    else exit 1
206    fi
207  else
208    echo "Cannot test locale-specific features - neither the 'fr_FR' nor the"
209    echo "'french' locale exists, or the \"locale\" command is not available"
210    echo "to check for them."
211    echo " "
212  fi
213fi
214
215# Additional tests for UTF8 support
216
217if [ $do4 = yes ] ; then
218  echo "Test 4: UTF-8 support (Perl 5.8, 5.10, 5.11 compatible)"
219  $valgrind ./pcretest -q $testdata/testinput4 testtry
220  if [ $? = 0 ] ; then
221    $cf $testdata/testoutput4 testtry
222    if [ $? != 0 ] ; then exit 1; fi
223  else exit 1
224  fi
225  echo "OK"
226fi
227
228if [ $do5 = yes ] ; then
229  echo "Test 5: API, internals, and non-Perl stuff for UTF-8 support"
230  $valgrind ./pcretest -q $testdata/testinput5 testtry
231  if [ $? = 0 ] ; then
232    $cf $testdata/testoutput5 testtry
233    if [ $? != 0 ] ; then exit 1; fi
234  else exit 1
235  fi
236  echo "OK"
237fi
238
239if [ $do6 = yes ] ; then
240  echo "Test 6: Unicode property support (Perl 5.10, 5.11 compatible)"
241  $valgrind ./pcretest -q $testdata/testinput6 testtry
242  if [ $? = 0 ] ; then
243    $cf $testdata/testoutput6 testtry
244    if [ $? != 0 ] ; then exit 1; fi
245  else exit 1
246  fi
247  echo "OK"
248fi
249
250# Tests for DFA matching support
251
252if [ $do7 = yes ] ; then
253  echo "Test 7: DFA matching"
254  $valgrind ./pcretest -q -dfa $testdata/testinput7 testtry
255  if [ $? = 0 ] ; then
256    $cf $testdata/testoutput7 testtry
257    if [ $? != 0 ] ; then exit 1; fi
258  else exit 1
259  fi
260  echo "OK"
261fi
262
263if [ $do8 = yes ] ; then
264  echo "Test 8: DFA matching with UTF-8"
265  $valgrind ./pcretest -q -dfa $testdata/testinput8 testtry
266  if [ $? = 0 ] ; then
267    $cf $testdata/testoutput8 testtry
268    if [ $? != 0 ] ; then exit 1; fi
269  else exit 1
270  fi
271  echo "OK"
272fi
273
274if [ $do9 = yes ] ; then
275  echo "Test 9: DFA matching with Unicode properties"
276  $valgrind ./pcretest -q -dfa $testdata/testinput9 testtry
277  if [ $? = 0 ] ; then
278    $cf $testdata/testoutput9 testtry
279    if [ $? != 0 ] ; then exit 1; fi
280  else exit 1
281  fi
282  echo "OK"
283fi
284
285# Test of internal offsets and code sizes. This test is run only when there
286# is Unicode property support and the link size is 2. The actual tests are
287# mostly the same as in some of the above, but in this test we inspect some
288# offsets and sizes that require a known link size. This is a doublecheck for
289# the maintainer, just in case something changes unexpectely.
290
291if [ $do10 = yes ] ; then
292  echo "Test 10: Internal offsets and code size tests"
293  $valgrind ./pcretest -q $testdata/testinput10 testtry
294  if [ $? = 0 ] ; then
295    $cf $testdata/testoutput10 testtry
296    if [ $? != 0 ] ; then exit 1; fi
297  else exit 1
298  fi
299  echo "OK"
300fi
301
302# Test of Perl 5.10, 5.11 features
303
304if [ $do11 = yes ] ; then
305  echo "Test 11: Perl 5.10, 5.11 features"
306  $valgrind ./pcretest -q $testdata/testinput11 testtry
307  if [ $? = 0 ] ; then
308    $cf $testdata/testoutput11 testtry
309    if [ $? != 0 ] ; then exit 1; fi
310  else exit 1
311  fi
312  echo "OK"
313fi
314
315# Test non-Perl-compatible Unicode property support
316
317if [ $do12 = yes ] ; then
318  echo "Test 12: API, internals, and non-Perl stuff for Unicode property support"
319  $valgrind ./pcretest -q $testdata/testinput12 testtry
320  if [ $? = 0 ] ; then
321    $cf $testdata/testoutput12 testtry
322    if [ $? != 0 ] ; then exit 1; fi
323  else exit 1
324  fi
325  echo "OK"
326fi
327
328# End
329