xmltest.sh revision 302385
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
25MYDIR="`dirname \"$0\"`"
26cd "$MYDIR"
27MYDIR="`pwd`"
28XMLWF="`dirname \"$MYDIR\"`/xmlwf/xmlwf"
29# XMLWF=/usr/local/bin/xmlwf
30TS="$MYDIR"
31# OUTPUT must terminate with the directory separator.
32OUTPUT="$TS/out/"
33# OUTPUT=/home/tmp/xml-testsuite-out/
34
35
36# RunXmlwfNotWF file reldir
37# reldir includes trailing slash
38RunXmlwfNotWF() {
39  file="$1"
40  reldir="$2"
41  $XMLWF -p "$file" > outfile || return $?
42  read outdata < outfile
43  if test "$outdata" = "" ; then
44      echo "Expected not well-formed: $reldir$file"
45      return 1
46  else
47      return 0
48  fi 
49}
50
51# RunXmlwfWF file reldir
52# reldir includes trailing slash
53RunXmlwfWF() {
54  file="$1"
55  reldir="$2"
56  $XMLWF -p -d "$OUTPUT$reldir" "$file" > outfile || return $?
57  read outdata < outfile 
58  if test "$outdata" = "" ; then 
59      if [ -f "out/$file" ] ; then 
60          diff -u "$OUTPUT$reldir$file" "out/$file" > outfile 
61          if [ -s outfile ] ; then 
62              cp outfile "$OUTPUT$reldir$file.diff"
63              echo "Output differs: $reldir$file"
64              return 1
65          fi 
66      fi 
67      return 0
68  else 
69      echo "In $reldir: $outdata"
70      return 1
71  fi 
72}
73
74SUCCESS=0
75ERROR=0
76
77UpdateStatus() {
78  if [ "$1" -eq 0 ] ; then
79    SUCCESS=`expr $SUCCESS + 1`
80  else
81    ERROR=`expr $ERROR + 1`
82  fi
83}
84
85##########################
86# well-formed test cases #
87##########################
88
89cd "$TS/xmlconf"
90for xmldir in ibm/valid/P* \
91              ibm/invalid/P* \
92              xmltest/valid/ext-sa \
93              xmltest/valid/not-sa \
94              xmltest/invalid \
95              xmltest/invalid/not-sa \
96              xmltest/valid/sa \
97              sun/valid \
98              sun/invalid ; do
99  cd "$TS/xmlconf/$xmldir"
100  mkdir -p "$OUTPUT$xmldir"
101  for xmlfile in *.xml ; do
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
133  rm outfile
134done
135
136cd "$TS/xmlconf/oasis"
137for xmlfile in *fail*.xml ; do
138    RunXmlwfNotWF "$xmlfile" "oasis/"
139    UpdateStatus $?
140done
141rm outfile
142
143echo "Passed: $SUCCESS"
144echo "Failed: $ERROR"
145