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