15bb6a25fSPoul-Henning Kamp#! /usr/bin/env bash 25bb6a25fSPoul-Henning Kamp# EXPAT TEST SCRIPT FOR W3C XML TEST SUITE 35bb6a25fSPoul-Henning Kamp# 45bb6a25fSPoul-Henning Kamp# This script can be used to exercise Expat against the 55bb6a25fSPoul-Henning Kamp# w3c.org xml test suite, available from 65bb6a25fSPoul-Henning Kamp# http://www.w3.org/XML/Test/xmlts20020606.zip. 75bb6a25fSPoul-Henning Kamp# 85bb6a25fSPoul-Henning Kamp# To run this script, first set XMLWF below so that xmlwf can be 95bb6a25fSPoul-Henning Kamp# found, then set the output directory with OUTPUT. 105bb6a25fSPoul-Henning Kamp# 115bb6a25fSPoul-Henning Kamp# The script lists all test cases where Expat shows a discrepancy 125bb6a25fSPoul-Henning Kamp# from the expected result. Test cases where only the canonical 135bb6a25fSPoul-Henning Kamp# output differs are prefixed with "Output differs:", and a diff file 145bb6a25fSPoul-Henning Kamp# is generated in the appropriate subdirectory under $OUTPUT. 155bb6a25fSPoul-Henning Kamp# 165bb6a25fSPoul-Henning Kamp# If there are output files provided, the script will use 175bb6a25fSPoul-Henning Kamp# output from xmlwf and compare the desired output against it. 185bb6a25fSPoul-Henning Kamp# However, one has to take into account that the canonical output 195bb6a25fSPoul-Henning Kamp# produced by xmlwf conforms to an older definition of canonical XML 205bb6a25fSPoul-Henning Kamp# and does not generate notation declarations. 215bb6a25fSPoul-Henning Kamp# 225bb6a25fSPoul-Henning Kamp# __ __ _ 235bb6a25fSPoul-Henning Kamp# ___\ \/ /_ __ __ _| |_ 245bb6a25fSPoul-Henning Kamp# / _ \\ /| '_ \ / _` | __| 255bb6a25fSPoul-Henning Kamp# | __// \| |_) | (_| | |_ 265bb6a25fSPoul-Henning Kamp# \___/_/\_\ .__/ \__,_|\__| 275bb6a25fSPoul-Henning Kamp# |_| XML parser 285bb6a25fSPoul-Henning Kamp# 295bb6a25fSPoul-Henning Kamp# Copyright (c) 2002-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net> 305bb6a25fSPoul-Henning Kamp# Copyright (c) 2002 Karl Waclawek <karl@waclawek.net> 315bb6a25fSPoul-Henning Kamp# Copyright (c) 2008-2019 Sebastian Pipping <sebastian@pipping.org> 325bb6a25fSPoul-Henning Kamp# Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk> 335bb6a25fSPoul-Henning Kamp# Licensed under the MIT license: 34220ed979SColeman Kane# 35220ed979SColeman Kane# Permission is hereby granted, free of charge, to any person obtaining 365bb6a25fSPoul-Henning Kamp# a copy of this software and associated documentation files (the 37220ed979SColeman Kane# "Software"), to deal in the Software without restriction, including 38220ed979SColeman Kane# without limitation the rights to use, copy, modify, merge, publish, 39220ed979SColeman Kane# distribute, sublicense, and/or sell copies of the Software, and to permit 405bb6a25fSPoul-Henning Kamp# persons to whom the Software is furnished to do so, subject to the 415bb6a25fSPoul-Henning Kamp# following conditions: 42220ed979SColeman Kane# 435bb6a25fSPoul-Henning Kamp# The above copyright notice and this permission notice shall be included 445bb6a25fSPoul-Henning Kamp# in all copies or substantial portions of the Software. 455bb6a25fSPoul-Henning Kamp# 465bb6a25fSPoul-Henning Kamp# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 475bb6a25fSPoul-Henning Kamp# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 485bb6a25fSPoul-Henning Kamp# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 49220ed979SColeman Kane# NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 50220ed979SColeman Kane# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 515bb6a25fSPoul-Henning Kamp# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 52220ed979SColeman Kane# USE OR OTHER DEALINGS IN THE SOFTWARE. 53220ed979SColeman Kane 54220ed979SColeman Kaneshopt -s nullglob 555bb6a25fSPoul-Henning Kamp 565bb6a25fSPoul-Henning Kamp# Note: OUTPUT must terminate with the directory separator. 57220ed979SColeman KaneOUTPUT="$PWD/tests/out/" 58220ed979SColeman KaneTS="$PWD/tests/" 595bb6a25fSPoul-Henning Kamp 60220ed979SColeman KaneMYDIR="`dirname \"$0\"`" 61220ed979SColeman Kanecd "$MYDIR" 625bb6a25fSPoul-Henning KampMYDIR="`pwd`" 635bb6a25fSPoul-Henning KampXMLWF="${1:-`dirname \"$MYDIR\"`/xmlwf/xmlwf}" 645bb6a25fSPoul-Henning Kamp# Unicode-aware diff utility 655bb6a25fSPoul-Henning KampDIFF="${MYDIR}/udiffer.py" 665bb6a25fSPoul-Henning Kamp 67220ed979SColeman Kane 685bb6a25fSPoul-Henning Kamp# RunXmlwfNotWF file reldir 695bb6a25fSPoul-Henning Kamp# reldir includes trailing slash 705bb6a25fSPoul-Henning KampRunXmlwfNotWF() { 715bb6a25fSPoul-Henning Kamp file="$1" 725bb6a25fSPoul-Henning Kamp reldir="$2" 735bb6a25fSPoul-Henning Kamp if $XMLWF -p "$file" > /dev/null; then 745bb6a25fSPoul-Henning Kamp echo "Expected not well-formed: $reldir$file" 75220ed979SColeman Kane return 1 76220ed979SColeman Kane else 77220ed979SColeman Kane return 0 78220ed979SColeman Kane fi 79220ed979SColeman Kane} 80220ed979SColeman Kane 81220ed979SColeman Kane# RunXmlwfWF file reldir 82220ed979SColeman Kane# reldir includes trailing slash 835bb6a25fSPoul-Henning KampRunXmlwfWF() { 845bb6a25fSPoul-Henning Kamp file="$1" 855bb6a25fSPoul-Henning Kamp reldir="$2" 865bb6a25fSPoul-Henning Kamp $XMLWF -p -N -d "$OUTPUT$reldir" "$file" > outfile || return $? 875bb6a25fSPoul-Henning Kamp read outdata < outfile 88220ed979SColeman Kane if test "$outdata" = "" ; then 89220ed979SColeman Kane if [ -f "out/$file" ] ; then 90220ed979SColeman Kane $DIFF "$OUTPUT$reldir$file" "out/$file" > outfile 91220ed979SColeman Kane if [ -s outfile ] ; then 92220ed979SColeman Kane cp outfile "$OUTPUT$reldir$file.diff" 93220ed979SColeman Kane echo "Output differs: $reldir$file" 94220ed979SColeman Kane return 1 95220ed979SColeman Kane fi 96220ed979SColeman Kane fi 975bb6a25fSPoul-Henning Kamp return 0 985bb6a25fSPoul-Henning Kamp else 995bb6a25fSPoul-Henning Kamp echo "In $reldir: $outdata" 100220ed979SColeman Kane return 1 101220ed979SColeman Kane fi 1025bb6a25fSPoul-Henning Kamp} 1035bb6a25fSPoul-Henning Kamp 1045bb6a25fSPoul-Henning KampSUCCESS=0 1055bb6a25fSPoul-Henning KampERROR=0 1065bb6a25fSPoul-Henning Kamp 107220ed979SColeman KaneUpdateStatus() { 1085bb6a25fSPoul-Henning Kamp if [ "$1" -eq 0 ] ; then 109220ed979SColeman Kane SUCCESS=`expr $SUCCESS + 1` 110220ed979SColeman Kane else 1115bb6a25fSPoul-Henning Kamp ERROR=`expr $ERROR + 1` 1125bb6a25fSPoul-Henning Kamp fi 1135bb6a25fSPoul-Henning Kamp} 1145bb6a25fSPoul-Henning Kamp 1155bb6a25fSPoul-Henning Kamp########################## 1165bb6a25fSPoul-Henning Kamp# well-formed test cases # 1175bb6a25fSPoul-Henning Kamp########################## 1185bb6a25fSPoul-Henning Kamp 119220ed979SColeman Kanecd "$TS/xmlconf" 120220ed979SColeman Kanefor xmldir in ibm/valid/P* \ 121220ed979SColeman Kane ibm/invalid/P* \ 122220ed979SColeman Kane xmltest/valid/ext-sa \ 123220ed979SColeman Kane xmltest/valid/not-sa \ 124220ed979SColeman Kane xmltest/invalid \ 1255bb6a25fSPoul-Henning Kamp xmltest/invalid/not-sa \ 1265bb6a25fSPoul-Henning Kamp xmltest/valid/sa \ 127220ed979SColeman Kane sun/valid \ 128220ed979SColeman Kane sun/invalid ; do 1295bb6a25fSPoul-Henning Kamp cd "$TS/xmlconf/$xmldir" 1305bb6a25fSPoul-Henning Kamp mkdir -p "$OUTPUT$xmldir" 1315bb6a25fSPoul-Henning Kamp for xmlfile in $(ls -1 *.xml | sort -d) ; do 1325bb6a25fSPoul-Henning Kamp [[ -f "$xmlfile" ]] || continue 1335bb6a25fSPoul-Henning Kamp RunXmlwfWF "$xmlfile" "$xmldir/" 1345bb6a25fSPoul-Henning Kamp UpdateStatus $? 135220ed979SColeman Kane done 136220ed979SColeman Kane rm -f outfile 1375bb6a25fSPoul-Henning Kampdone 1385bb6a25fSPoul-Henning Kamp 1395bb6a25fSPoul-Henning Kampcd "$TS/xmlconf/oasis" 1405bb6a25fSPoul-Henning Kampmkdir -p "$OUTPUT"oasis 1415bb6a25fSPoul-Henning Kampfor xmlfile in *pass*.xml ; do 142 RunXmlwfWF "$xmlfile" "oasis/" 143 UpdateStatus $? 144done 145rm outfile 146 147############################## 148# not well-formed test cases # 149############################## 150 151cd "$TS/xmlconf" 152for xmldir in ibm/not-wf/P* \ 153 ibm/not-wf/p28a \ 154 ibm/not-wf/misc \ 155 xmltest/not-wf/ext-sa \ 156 xmltest/not-wf/not-sa \ 157 xmltest/not-wf/sa \ 158 sun/not-wf ; do 159 cd "$TS/xmlconf/$xmldir" 160 for xmlfile in *.xml ; do 161 RunXmlwfNotWF "$xmlfile" "$xmldir/" 162 UpdateStatus $? 163 done 164done 165 166cd "$TS/xmlconf/oasis" 167for xmlfile in *fail*.xml ; do 168 RunXmlwfNotWF "$xmlfile" "oasis/" 169 UpdateStatus $? 170done 171 172echo "Passed: $SUCCESS" 173echo "Failed: $ERROR" 174