dvander@2762: #! /bin/sh dvander@2762: dvander@2762: # Run PCRE tests. dvander@2762: dvander@2762: valgrind= dvander@2762: dvander@2762: # Set up a suitable "diff" command for comparison. Some systems dvander@2762: # have a diff that lacks a -u option. Try to deal with this. dvander@2762: dvander@2762: if diff -u /dev/null /dev/null; then cf="diff -u"; else cf="diff"; fi dvander@2762: dvander@2762: # Find the test data dvander@2762: dvander@2762: testdata=testdata dvander@2762: if [ -n "$srcdir" -a -d "$srcdir" ] ; then dvander@2762: testdata="$srcdir/testdata" dvander@2762: fi dvander@2762: dvander@2762: # Find which optional facilities are available dvander@2762: dvander@2762: case `./pcretest -C | ./pcregrep 'Internal link size'` in dvander@2762: *2) link_size=2;; dvander@2762: *3) link_size=3;; dvander@2762: *4) link_size=4;; dvander@2762: *) echo "Failed to find internal link size"; exit 1;; dvander@2762: esac dvander@2762: dvander@2762: ./pcretest -C | ./pcregrep 'No UTF-8 support' >/dev/null dvander@2762: utf8=$? dvander@2762: dvander@2762: ./pcretest -C | ./pcregrep 'No Unicode properties support' >/dev/null dvander@2762: ucp=$? dvander@2762: dvander@2762: # Select which tests to run; for those that are explicitly requested, check dvander@2762: # that the necessary optional facilities are available. dvander@2762: dvander@2762: do1=no dvander@2762: do2=no dvander@2762: do3=no dvander@2762: do4=no dvander@2762: do5=no dvander@2762: do6=no dvander@2762: do7=no dvander@2762: do8=no dvander@2762: do9=no dvander@2762: do10=no dvander@2762: dvander@2762: while [ $# -gt 0 ] ; do dvander@2762: case $1 in dvander@2762: 1) do1=yes;; dvander@2762: 2) do2=yes;; dvander@2762: 3) do3=yes;; dvander@2762: 4) do4=yes;; dvander@2762: 5) do5=yes;; dvander@2762: 6) do6=yes;; dvander@2762: 7) do7=yes;; dvander@2762: 8) do8=yes;; dvander@2762: 9) do9=yes;; dvander@2762: 10) do10=yes;; dvander@2762: valgrind) valgrind="valgrind -q";; dvander@2762: *) echo "Unknown test number $1"; exit 1;; dvander@2762: esac dvander@2762: shift dvander@2762: done dvander@2762: dvander@2762: if [ $utf8 -eq 0 ] ; then dvander@2762: if [ $do4 = yes ] ; then dvander@2762: echo "Can't run test 4 because UTF-8 support is not configured" dvander@2762: exit 1 dvander@2762: fi dvander@2762: if [ $do5 = yes ] ; then dvander@2762: echo "Can't run test 5 because UTF-8 support is not configured" dvander@2762: exit 1 dvander@2762: fi dvander@2762: if [ $do8 = yes ] ; then dvander@2762: echo "Can't run test 8 because UTF-8 support is not configured" dvander@2762: exit 1 dvander@2762: fi dvander@2762: fi dvander@2762: dvander@2762: if [ $ucp -eq 0 ] ; then dvander@2762: if [ $do6 = yes ] ; then dvander@2762: echo "Can't run test 6 because Unicode property support is not configured" dvander@2762: exit 1 dvander@2762: fi dvander@2762: if [ $do9 = yes ] ; then dvander@2762: echo "Can't run test 9 because Unicode property support is not configured" dvander@2762: exit 1 dvander@2762: fi dvander@2762: if [ $do10 = yes ] ; then dvander@2762: echo "Can't run test 10 because Unicode property support is not configured" dvander@2762: exit 1 dvander@2762: fi dvander@2762: fi dvander@2762: dvander@2762: if [ $link_size -ne 2 ] ; then dvander@2762: if [ $do10 = yes ] ; then dvander@2762: echo "Can't run test 10 because the link size ($link_size) is not 2" dvander@2762: exit 1 dvander@2762: fi dvander@2762: fi dvander@2762: dvander@2762: # If no specific tests were requested, select all that are relevant. dvander@2762: dvander@2762: if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a \ dvander@2762: $do5 = no -a $do6 = no -a $do7 = no -a $do8 = no -a \ dvander@2762: $do9 = no -a $do10 = no ] ; then dvander@2762: do1=yes dvander@2762: do2=yes dvander@2762: do3=yes dvander@2762: if [ $utf8 -ne 0 ] ; then do4=yes; fi dvander@2762: if [ $utf8 -ne 0 ] ; then do5=yes; fi dvander@2762: if [ $utf8 -ne 0 -a $ucp -ne 0 ] ; then do6=yes; fi dvander@2762: do7=yes dvander@2762: if [ $utf8 -ne 0 ] ; then do8=yes; fi dvander@2762: if [ $utf8 -ne 0 -a $ucp -ne 0 ] ; then do9=yes; fi dvander@2762: if [ $link_size -eq 2 -a $ucp -ne 0 ] ; then do10=yes; fi dvander@2762: fi dvander@2762: dvander@2762: # Show which release dvander@2762: dvander@2762: echo "" dvander@2762: echo PCRE C library tests dvander@2762: ./pcretest /dev/null dvander@2762: dvander@2762: # Primary test, Perl-compatible dvander@2762: dvander@2762: if [ $do1 = yes ] ; then dvander@2762: echo "Test 1: main functionality (Perl compatible)" dvander@2762: $valgrind ./pcretest -q $testdata/testinput1 testtry dvander@2762: if [ $? = 0 ] ; then dvander@2762: $cf $testdata/testoutput1 testtry dvander@2762: if [ $? != 0 ] ; then exit 1; fi dvander@2762: else exit 1 dvander@2762: fi dvander@2762: echo "OK" dvander@2762: fi dvander@2762: dvander@2762: # PCRE tests that are not Perl-compatible - API & error tests, mostly dvander@2762: dvander@2762: if [ $do2 = yes ] ; then dvander@2762: echo "Test 2: API and error handling (not Perl compatible)" dvander@2762: $valgrind ./pcretest -q $testdata/testinput2 testtry dvander@2762: if [ $? = 0 ] ; then dvander@2762: $cf $testdata/testoutput2 testtry dvander@2762: if [ $? != 0 ] ; then exit 1; fi dvander@2762: else dvander@2762: echo " " dvander@2762: echo "** Test 2 requires a lot of stack. If it has crashed with a" dvander@2762: echo "** segmentation fault, it may be that you do not have enough" dvander@2762: echo "** stack available by default. Please see the 'pcrestack' man" dvander@2762: echo "** page for a discussion of PCRE's stack usage." dvander@2762: echo " " dvander@2762: exit 1 dvander@2762: fi dvander@2762: echo "OK" dvander@2762: fi dvander@2762: dvander@2762: # Locale-specific tests, provided that either the "fr_FR" or the "french" dvander@2762: # locale is available. The former is the Unix-like standard; the latter is dvander@2762: # for Windows. dvander@2762: dvander@2762: if [ $do3 = yes ] ; then dvander@2762: locale -a | grep '^fr_FR$' >/dev/null dvander@2762: if [ $? -eq 0 ] ; then dvander@2762: locale=fr_FR dvander@2762: infile=$testdata/testinput3 dvander@2762: outfile=$testdata/testoutput3 dvander@2762: else dvander@2762: locale -a | grep '^french$' >/dev/null dvander@2762: if [ $? -eq 0 ] ; then dvander@2762: locale=french dvander@2762: sed 's/fr_FR/french/' $testdata/testinput3 >test3input dvander@2762: sed 's/fr_FR/french/' $testdata/testoutput3 >test3output dvander@2762: infile=test3input dvander@2762: outfile=test3output dvander@2762: else dvander@2762: locale= dvander@2762: fi dvander@2762: fi dvander@2762: dvander@2762: if [ "$locale" != "" ] ; then dvander@2762: echo "Test 3: locale-specific features (using '$locale' locale)" dvander@2762: $valgrind ./pcretest -q $infile testtry dvander@2762: if [ $? = 0 ] ; then dvander@2762: $cf $outfile testtry dvander@2762: if [ $? != 0 ] ; then dvander@2762: echo " " dvander@2762: echo "Locale test did not run entirely successfully." dvander@2762: echo "This usually means that there is a problem with the locale" dvander@2762: echo "settings rather than a bug in PCRE." dvander@2762: else dvander@2762: echo "OK" dvander@2762: fi dvander@2762: else exit 1 dvander@2762: fi dvander@2762: else dvander@2762: echo "Cannot test locale-specific features - neither the 'fr_FR' nor the" dvander@2762: echo "'french' locale exists, or the \"locale\" command is not available" dvander@2762: echo "to check for them." dvander@2762: echo " " dvander@2762: fi dvander@2762: fi dvander@2762: dvander@2762: # Additional tests for UTF8 support dvander@2762: dvander@2762: if [ $do4 = yes ] ; then dvander@2762: echo "Test 4: UTF-8 support (Perl compatible)" dvander@2762: $valgrind ./pcretest -q $testdata/testinput4 testtry dvander@2762: if [ $? = 0 ] ; then dvander@2762: $cf $testdata/testoutput4 testtry dvander@2762: if [ $? != 0 ] ; then exit 1; fi dvander@2762: else exit 1 dvander@2762: fi dvander@2762: echo "OK" dvander@2762: fi dvander@2762: dvander@2762: if [ $do5 = yes ] ; then dvander@2762: echo "Test 5: API and internals for UTF-8 support (not Perl compatible)" dvander@2762: $valgrind ./pcretest -q $testdata/testinput5 testtry dvander@2762: if [ $? = 0 ] ; then dvander@2762: $cf $testdata/testoutput5 testtry dvander@2762: if [ $? != 0 ] ; then exit 1; fi dvander@2762: else exit 1 dvander@2762: fi dvander@2762: echo "OK" dvander@2762: fi dvander@2762: dvander@2762: if [ $do6 = yes ] ; then dvander@2762: echo "Test 6: Unicode property support" dvander@2762: $valgrind ./pcretest -q $testdata/testinput6 testtry dvander@2762: if [ $? = 0 ] ; then dvander@2762: $cf $testdata/testoutput6 testtry dvander@2762: if [ $? != 0 ] ; then exit 1; fi dvander@2762: else exit 1 dvander@2762: fi dvander@2762: echo "OK" dvander@2762: fi dvander@2762: dvander@2762: # Tests for DFA matching support dvander@2762: dvander@2762: if [ $do7 = yes ] ; then dvander@2762: echo "Test 7: DFA matching" dvander@2762: $valgrind ./pcretest -q -dfa $testdata/testinput7 testtry dvander@2762: if [ $? = 0 ] ; then dvander@2762: $cf $testdata/testoutput7 testtry dvander@2762: if [ $? != 0 ] ; then exit 1; fi dvander@2762: else exit 1 dvander@2762: fi dvander@2762: echo "OK" dvander@2762: fi dvander@2762: dvander@2762: if [ $do8 = yes ] ; then dvander@2762: echo "Test 8: DFA matching with UTF-8" dvander@2762: $valgrind ./pcretest -q -dfa $testdata/testinput8 testtry dvander@2762: if [ $? = 0 ] ; then dvander@2762: $cf $testdata/testoutput8 testtry dvander@2762: if [ $? != 0 ] ; then exit 1; fi dvander@2762: else exit 1 dvander@2762: fi dvander@2762: echo "OK" dvander@2762: fi dvander@2762: dvander@2762: if [ $do9 = yes ] ; then dvander@2762: echo "Test 9: DFA matching with Unicode properties" dvander@2762: $valgrind ./pcretest -q -dfa $testdata/testinput9 testtry dvander@2762: if [ $? = 0 ] ; then dvander@2762: $cf $testdata/testoutput9 testtry dvander@2762: if [ $? != 0 ] ; then exit 1; fi dvander@2762: else exit 1 dvander@2762: fi dvander@2762: echo "OK" dvander@2762: fi dvander@2762: dvander@2762: # Test of internal offsets and code sizes. This test is run only when there dvander@2762: # is Unicode property support and the link size is 2. The actual tests are dvander@2762: # mostly the same as in some of the above, but in this test we inspect some dvander@2762: # offsets and sizes that require a known link size. This is a doublecheck for dvander@2762: # the maintainer, just in case something changes unexpectely. dvander@2762: dvander@2762: if [ $do10 = yes ] ; then dvander@2762: echo "Test 10: Internal offsets and code size tests" dvander@2762: $valgrind ./pcretest -q $testdata/testinput10 testtry dvander@2762: if [ $? = 0 ] ; then dvander@2762: $cf $testdata/testoutput10 testtry dvander@2762: if [ $? != 0 ] ; then exit 1; fi dvander@2762: else exit 1 dvander@2762: fi dvander@2762: echo "OK" dvander@2762: fi dvander@2762: dvander@2762: # End