xmltest.sh revision 355604
1#! /usr/bin/env bash
2
3#   EXPAT TEST SCRIPT FOR W3C XML TEST SUITE
4
5# This script can be used to exercise Expat against the
6# w3c.org xml test suite, available from
7# http://www.w3.org/XML/Test/xmlts20020606.zip.
8
9# To run this script, first set XMLWF below so that xmlwf can be
10# found, then set the output directory with OUTPUT.
11
12# The script lists all test cases where Expat shows a discrepancy
13# from the expected result. Test cases where only the canonical
14# output differs are prefixed with "Output differs:", and a diff file
15# is generated in the appropriate subdirectory under $OUTPUT.
16
17# If there are output files provided, the script will use
18# output from xmlwf and compare the desired output against it.
19# However, one has to take into account that the canonical output
20# produced by xmlwf conforms to an older definition of canonical XML
21# and does not generate notation declarations.
22
23shopt -s nullglob
24
25# Note: OUTPUT must terminate with the directory separator.
26OUTPUT="$PWD/tests/out/"
27TS="$PWD/tests/"
28
29MYDIR="`dirname \"$0\"`"
30cd "$MYDIR"
31MYDIR="`pwd`"
32XMLWF="${1:-`dirname \"$MYDIR\"`/xmlwf/xmlwf}"
33# Unicode-aware diff utility
34DIFF="${MYDIR}/udiffer.py"
35
36
37# RunXmlwfNotWF file reldir
38# reldir includes trailing slash
39RunXmlwfNotWF() {
40  file="$1"
41  reldir="$2"
42  if $XMLWF -p "$file" > /dev/null; then
43      echo "Expected not well-formed: $reldir$file"
44      return 1
45  else
46      return 0
47  fi 
48}
49
50# RunXmlwfWF file reldir
51# reldir includes trailing slash
52RunXmlwfWF() {
53  file="$1"
54  reldir="$2"
55  $XMLWF -p -N -d "$OUTPUT$reldir" "$file" > outfile || return $?
56  read outdata < outfile 
57  if test "$outdata" = "" ; then 
58      if [ -f "out/$file" ] ; then 
59          $DIFF "$OUTPUT$reldir$file" "out/$file" > outfile 
60          if [ -s outfile ] ; then 
61              cp outfile "$OUTPUT$reldir$file.diff"
62              echo "Output differs: $reldir$file"
63              return 1
64          fi 
65      fi 
66      return 0
67  else 
68      echo "In $reldir: $outdata"
69      return 1
70  fi 
71}
72
73SUCCESS=0
74ERROR=0
75
76UpdateStatus() {
77  if [ "$1" -eq 0 ] ; then
78    SUCCESS=`expr $SUCCESS + 1`
79  else
80    ERROR=`expr $ERROR + 1`
81  fi
82}
83
84##########################
85# well-formed test cases #
86##########################
87
88cd "$TS/xmlconf"
89for xmldir in ibm/valid/P* \
90              ibm/invalid/P* \
91              xmltest/valid/ext-sa \
92              xmltest/valid/not-sa \
93              xmltest/invalid \
94              xmltest/invalid/not-sa \
95              xmltest/valid/sa \
96              sun/valid \
97              sun/invalid ; do
98  cd "$TS/xmlconf/$xmldir"
99  mkdir -p "$OUTPUT$xmldir"
100  for xmlfile in $(ls -1 *.xml | sort -d) ; do
101      [[ -f "$xmlfile" ]] || continue
102      RunXmlwfWF "$xmlfile" "$xmldir/"
103      UpdateStatus $?
104  done
105  rm -f outfile
106done
107
108cd "$TS/xmlconf/oasis"
109mkdir -p "$OUTPUT"oasis
110for xmlfile in *pass*.xml ; do
111    RunXmlwfWF "$xmlfile" "oasis/"
112    UpdateStatus $?
113done
114rm outfile
115
116##############################
117# not well-formed test cases #
118##############################
119
120cd "$TS/xmlconf"
121for xmldir in ibm/not-wf/P* \
122              ibm/not-wf/p28a \
123              ibm/not-wf/misc \
124              xmltest/not-wf/ext-sa \
125              xmltest/not-wf/not-sa \
126              xmltest/not-wf/sa \
127              sun/not-wf ; do
128  cd "$TS/xmlconf/$xmldir"
129  for xmlfile in *.xml ; do
130      RunXmlwfNotWF "$xmlfile" "$xmldir/"
131      UpdateStatus $?
132  done
133done
134
135cd "$TS/xmlconf/oasis"
136for xmlfile in *fail*.xml ; do
137    RunXmlwfNotWF "$xmlfile" "oasis/"
138    UpdateStatus $?
139done
140
141echo "Passed: $SUCCESS"
142echo "Failed: $ERROR"
143