Home | History | Annotate | Line # | Download | only in tests
      1  1.2       spz #! /usr/bin/env bash
      2  1.5  christos # EXPAT TEST SCRIPT FOR W3C XML TEST SUITE
      3  1.5  christos #
      4  1.1      tron # This script can be used to exercise Expat against the
      5  1.6       wiz # w3c.org xml test suite, available from:
      6  1.6       wiz # https://www.w3.org/XML/Test/xmlts20020606.zip
      7  1.5  christos #
      8  1.2       spz # To run this script, first set XMLWF below so that xmlwf can be
      9  1.1      tron # found, then set the output directory with OUTPUT.
     10  1.5  christos #
     11  1.1      tron # The script lists all test cases where Expat shows a discrepancy
     12  1.1      tron # from the expected result. Test cases where only the canonical
     13  1.1      tron # output differs are prefixed with "Output differs:", and a diff file
     14  1.1      tron # is generated in the appropriate subdirectory under $OUTPUT.
     15  1.5  christos #
     16  1.1      tron # If there are output files provided, the script will use
     17  1.1      tron # output from xmlwf and compare the desired output against it.
     18  1.1      tron # However, one has to take into account that the canonical output
     19  1.1      tron # produced by xmlwf conforms to an older definition of canonical XML
     20  1.1      tron # and does not generate notation declarations.
     21  1.5  christos #
     22  1.5  christos #                          __  __            _
     23  1.5  christos #                       ___\ \/ /_ __   __ _| |_
     24  1.5  christos #                      / _ \\  /| '_ \ / _` | __|
     25  1.5  christos #                     |  __//  \| |_) | (_| | |_
     26  1.5  christos #                      \___/_/\_\ .__/ \__,_|\__|
     27  1.5  christos #                               |_| XML parser
     28  1.5  christos #
     29  1.5  christos # Copyright (c) 2002-2004 Fred L. Drake, Jr. <fdrake (at] users.sourceforge.net>
     30  1.5  christos # Copyright (c) 2002      Karl Waclawek <karl (at] waclawek.net>
     31  1.5  christos # Copyright (c) 2008-2019 Sebastian Pipping <sebastian (at] pipping.org>
     32  1.5  christos # Copyright (c) 2017      Rhodri James <rhodri (at] wildebeest.org.uk>
     33  1.6       wiz # Copyright (c) 2025      Hanno Bck <hanno (at] gentoo.org>
     34  1.5  christos # Licensed under the MIT license:
     35  1.5  christos #
     36  1.5  christos # Permission is  hereby granted,  free of charge,  to any  person obtaining
     37  1.5  christos # a  copy  of  this  software   and  associated  documentation  files  (the
     38  1.5  christos # "Software"),  to  deal in  the  Software  without restriction,  including
     39  1.5  christos # without  limitation the  rights  to use,  copy,  modify, merge,  publish,
     40  1.5  christos # distribute, sublicense, and/or sell copies of the Software, and to permit
     41  1.5  christos # persons  to whom  the Software  is  furnished to  do so,  subject to  the
     42  1.5  christos # following conditions:
     43  1.5  christos #
     44  1.5  christos # The above copyright  notice and this permission notice  shall be included
     45  1.5  christos # in all copies or substantial portions of the Software.
     46  1.5  christos #
     47  1.5  christos # THE  SOFTWARE  IS  PROVIDED  "AS  IS",  WITHOUT  WARRANTY  OF  ANY  KIND,
     48  1.5  christos # EXPRESS  OR IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO  THE WARRANTIES  OF
     49  1.5  christos # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
     50  1.5  christos # NO EVENT SHALL THE AUTHORS OR  COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
     51  1.5  christos # DAMAGES OR  OTHER LIABILITY, WHETHER  IN AN  ACTION OF CONTRACT,  TORT OR
     52  1.5  christos # OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     53  1.5  christos # USE OR OTHER DEALINGS IN THE SOFTWARE.
     54  1.1      tron 
     55  1.2       spz shopt -s nullglob
     56  1.2       spz 
     57  1.4      maya # Note: OUTPUT must terminate with the directory separator.
     58  1.4      maya OUTPUT="$PWD/tests/out/"
     59  1.4      maya TS="$PWD/tests/"
     60  1.4      maya 
     61  1.1      tron MYDIR="`dirname \"$0\"`"
     62  1.1      tron cd "$MYDIR"
     63  1.1      tron MYDIR="`pwd`"
     64  1.3  christos #XMLWF="${1:-`dirname \"$MYDIR\"`/xmlwf/xmlwf}"
     65  1.2       spz XMLWF=/usr/bin/xmlwf
     66  1.4      maya # Unicode-aware diff utility
     67  1.4      maya DIFF="${MYDIR}/udiffer.py"
     68  1.1      tron 
     69  1.1      tron 
     70  1.1      tron # RunXmlwfNotWF file reldir
     71  1.1      tron # reldir includes trailing slash
     72  1.1      tron RunXmlwfNotWF() {
     73  1.1      tron   file="$1"
     74  1.1      tron   reldir="$2"
     75  1.4      maya   if $XMLWF -p "$file" > /dev/null; then
     76  1.2       spz       echo "Expected not well-formed: $reldir$file"
     77  1.1      tron       return 1
     78  1.1      tron   else
     79  1.1      tron       return 0
     80  1.1      tron   fi 
     81  1.1      tron }
     82  1.1      tron 
     83  1.1      tron # RunXmlwfWF file reldir
     84  1.1      tron # reldir includes trailing slash
     85  1.1      tron RunXmlwfWF() {
     86  1.1      tron   file="$1"
     87  1.1      tron   reldir="$2"
     88  1.4      maya   $XMLWF -p -N -d "$OUTPUT$reldir" "$file" > outfile || return $?
     89  1.1      tron   read outdata < outfile 
     90  1.1      tron   if test "$outdata" = "" ; then 
     91  1.1      tron       if [ -f "out/$file" ] ; then 
     92  1.4      maya           $DIFF "$OUTPUT$reldir$file" "out/$file" > outfile 
     93  1.1      tron           if [ -s outfile ] ; then 
     94  1.1      tron               cp outfile "$OUTPUT$reldir$file.diff"
     95  1.1      tron               echo "Output differs: $reldir$file"
     96  1.1      tron               return 1
     97  1.1      tron           fi 
     98  1.1      tron       fi 
     99  1.1      tron       return 0
    100  1.1      tron   else 
    101  1.1      tron       echo "In $reldir: $outdata"
    102  1.1      tron       return 1
    103  1.1      tron   fi 
    104  1.1      tron }
    105  1.1      tron 
    106  1.1      tron SUCCESS=0
    107  1.1      tron ERROR=0
    108  1.1      tron 
    109  1.1      tron UpdateStatus() {
    110  1.1      tron   if [ "$1" -eq 0 ] ; then
    111  1.1      tron     SUCCESS=`expr $SUCCESS + 1`
    112  1.1      tron   else
    113  1.1      tron     ERROR=`expr $ERROR + 1`
    114  1.1      tron   fi
    115  1.1      tron }
    116  1.1      tron 
    117  1.1      tron ##########################
    118  1.1      tron # well-formed test cases #
    119  1.1      tron ##########################
    120  1.1      tron 
    121  1.1      tron cd "$TS/xmlconf"
    122  1.1      tron for xmldir in ibm/valid/P* \
    123  1.1      tron               ibm/invalid/P* \
    124  1.1      tron               xmltest/valid/ext-sa \
    125  1.1      tron               xmltest/valid/not-sa \
    126  1.1      tron               xmltest/invalid \
    127  1.1      tron               xmltest/invalid/not-sa \
    128  1.1      tron               xmltest/valid/sa \
    129  1.1      tron               sun/valid \
    130  1.1      tron               sun/invalid ; do
    131  1.1      tron   cd "$TS/xmlconf/$xmldir"
    132  1.1      tron   mkdir -p "$OUTPUT$xmldir"
    133  1.3  christos   for xmlfile in $(ls -1 *.xml | sort -d) ; do
    134  1.3  christos       [[ -f "$xmlfile" ]] || continue
    135  1.1      tron       RunXmlwfWF "$xmlfile" "$xmldir/"
    136  1.1      tron       UpdateStatus $?
    137  1.1      tron   done
    138  1.2       spz   rm -f outfile
    139  1.1      tron done
    140  1.1      tron 
    141  1.1      tron cd "$TS/xmlconf/oasis"
    142  1.1      tron mkdir -p "$OUTPUT"oasis
    143  1.1      tron for xmlfile in *pass*.xml ; do
    144  1.1      tron     RunXmlwfWF "$xmlfile" "oasis/"
    145  1.1      tron     UpdateStatus $?
    146  1.1      tron done
    147  1.1      tron rm outfile
    148  1.1      tron 
    149  1.1      tron ##############################
    150  1.1      tron # not well-formed test cases #
    151  1.1      tron ##############################
    152  1.1      tron 
    153  1.1      tron cd "$TS/xmlconf"
    154  1.1      tron for xmldir in ibm/not-wf/P* \
    155  1.2       spz               ibm/not-wf/p28a \
    156  1.1      tron               ibm/not-wf/misc \
    157  1.1      tron               xmltest/not-wf/ext-sa \
    158  1.1      tron               xmltest/not-wf/not-sa \
    159  1.1      tron               xmltest/not-wf/sa \
    160  1.1      tron               sun/not-wf ; do
    161  1.1      tron   cd "$TS/xmlconf/$xmldir"
    162  1.1      tron   for xmlfile in *.xml ; do
    163  1.1      tron       RunXmlwfNotWF "$xmlfile" "$xmldir/"
    164  1.1      tron       UpdateStatus $?
    165  1.1      tron   done
    166  1.1      tron done
    167  1.1      tron 
    168  1.1      tron cd "$TS/xmlconf/oasis"
    169  1.1      tron for xmlfile in *fail*.xml ; do
    170  1.1      tron     RunXmlwfNotWF "$xmlfile" "oasis/"
    171  1.1      tron     UpdateStatus $?
    172  1.1      tron done
    173  1.1      tron 
    174  1.1      tron echo "Passed: $SUCCESS"
    175  1.1      tron echo "Failed: $ERROR"
    176