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