diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2015-10-19 15:37:26 +0300 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2015-10-19 15:37:26 +0300 |
commit | 6c6e567eb34ad0f5a3bd90f6585c521543106401 (patch) | |
tree | 7f8dc62f12dd2b720ffdc738d393cd1a8f82921c /xstc | |
parent | 7421ae696c1ef2fb48adc73ba8564ef2f276d618 (diff) | |
parent | 218d404f34d79a8837f9c0230dd9d9f1180b4068 (diff) | |
download | libxml2-pristine-tar.tar.gz |
Merge branch 'pristine-tar' of git://anonscm.debian.org/debian-xml-sgml/libxml2 into pristine-tarpristine-tar
Diffstat (limited to 'xstc')
-rw-r--r-- | xstc/Makefile.am | 132 | ||||
-rw-r--r-- | xstc/Makefile.in | 668 | ||||
-rwxr-xr-x | xstc/xstc-to-python.xsl | 114 | ||||
-rwxr-xr-x | xstc/xstc.py | 693 |
4 files changed, 1607 insertions, 0 deletions
diff --git a/xstc/Makefile.am b/xstc/Makefile.am new file mode 100644 index 0000000..5ef1819 --- /dev/null +++ b/xstc/Makefile.am @@ -0,0 +1,132 @@ +# +# Definition for the tests from W3C +# +PYSCRIPTS=nist-test.py ms-test.py sun-test.py +TESTDIR=Tests +TESTDIRS=$(TESTDIR)/msxsdtest $(TESTDIR)/suntest $(TESTDIR)/Datatypes +TARBALL=xsts-2002-01-16.tar.gz +TARBALL_2=xsts-2004-01-14.tar.gz +TSNAME=xmlschema2002-01-16 +TSNAME_2=xmlschema2004-01-14 +TARBALLURL=http://www.w3.org/XML/2004/xml-schema-test-suite/$(TSNAME)/$(TARBALL) +TARBALLURL_2=http://www.w3.org/XML/2004/xml-schema-test-suite/$(TSNAME_2)/$(TARBALL_2) +MSTESTDEF=MSXMLSchema1-0-20020116.testSet +SUNTESTDEF=SunXMLSchema1-0-20020116.testSet +NISTTESTDEF=NISTXMLSchema1-0-20020116.testSet +NISTTESTDEF_2=NISTXMLSchemaDatatypes.testSet + +# +# The local data and scripts +# +EXTRA_DIST=xstc.py xstc-to-python.xsl +# +# Nothing is done by make, only make tests and +# only if Python and Schemas are enabled. +# +all: + +# +# Rule to load the test description and extract the informations +# +$(TESTDIRS) Tests/Metadata/$(NISTTESTDEF_2) Tests/Metadata/$(MSTTESTDEF) Tests/Metadata/$(SUNTESTDEF): + -@(if [ ! -d Tests ] ; then \ + mkdir Tests ; \ + fi) + -@(if [ ! -f $(TARBALL_2) ] ; then \ + if [ -f $(srcdir)/$(TARBALL_2) ] ; then \ + $(LN_S) $(srcdir)/$(TARBALL_2) $(TARBALL_2) ; else \ + echo "Missing the test suite description (2004-01-14), trying to fetch it" ;\ + if [ -x "$(WGET)" ] ; then \ + $(WGET) $(TARBALLURL_2) ; \ + else echo "Dont' know how to fetch $(TARBALLURL_2)" ; fi ; fi ; fi) + -@(if [ -f $(TARBALL_2) ] ; then \ + echo -n "extracting test data (NIST)..." ; \ + $(TAR) -xzf $(TARBALL_2) --wildcards '*/Datatypes' '*/Metadata/$(NISTTESTDEF_2)' ; \ + echo "done" ; \ + fi) + -@(if [ ! -f $(TARBALL) ] ; then \ + if [ -f $(srcdir)/$(TARBALL) ] ; then \ + $(LN_S) $(srcdir)/$(TARBALL) $(TARBALL) ; else \ + echo "Missing the test suite description (2002-01-16), trying to fetch it" ;\ + if [ -x "$(WGET)" ] ; then \ + $(WGET) $(TARBALLURL) ; \ + else echo "Dont' know how to fetch $(TARBALLURL)" ; fi ; fi ; fi) + -@(if [ -f $(TARBALL) ] ; then \ + echo -n "extracting test data (Sun, Microsoft)..." ; \ + $(TAR) -C Tests -xzf $(TARBALL) --wildcards '*/suntest' '*/msxsdtest' '*/$(MSTESTDEF)' '*/$(SUNTESTDEF)' ; \ + if [ -d Tests/suntest ] ; then rm -r Tests/suntest ; fi ; \ + if [ -d Tests/msxsdtest ] ; then rm -r Tests/msxsdtest ; fi ; \ + mv Tests/xmlschema2002-01-16/* Tests ; \ + mv Tests/*.testSet Tests/Metadata ; \ + rm -r Tests/xmlschema2002-01-16 ; \ + echo "done" ; \ + fi) + +# +# The python tests are generated via XSLT +# +nist-test.py: Tests/Metadata/$(NISTTESTDEF_2) xstc-to-python.xsl + -@(if [ -x $(XSLTPROC) ] ; then \ + echo "Rebuilding script (NIST)" $@ ; \ + $(XSLTPROC) --nonet --stringparam vendor NIST-2 \ + $(srcdir)/xstc-to-python.xsl \ + $(srcdir)/Tests/Metadata/$(NISTTESTDEF_2) > $@ ; \ + chmod +x $@ ; fi ) + +ms-test.py: Tests/Metadata/$(MSTTESTDEF) xstc-to-python.xsl + -@(if [ -x $(XSLTPROC) ] ; then \ + echo "Rebuilding script (Microsoft)" $@ ; \ + $(XSLTPROC) --nonet --stringparam vendor MS \ + $(srcdir)/xstc-to-python.xsl \ + $(srcdir)/Tests/Metadata/$(MSTESTDEF) > $@ ; \ + chmod +x $@ ; fi ) + +sun-test.py: Tests/Metadata/$(SUNTESTDEF) xstc-to-python.xsl + -@(if [ -x $(XSLTPROC) ] ; then \ + echo "Rebuilding script (Sun)" $@ ; \ + $(XSLTPROC) --nonet --stringparam vendor SUN \ + $(srcdir)/xstc-to-python.xsl \ + $(srcdir)/Tests/Metadata/$(SUNTESTDEF) > $@ ; \ + chmod +x $@ ; fi ) + +# +# The actual test run if present. PYTHONPATH is updated to make sure +# we run the version from the loacl build and not preinstalled bindings +# +pytests: $(PYSCRIPTS) $(TESTDIRS) + -@(if [ -x nist-test.py -a -d $(TESTDIR)/Datatypes ] ; then \ + echo "## Running XML Schema tests (NIST)"; \ + PYTHONPATH="../python:../python/.libs:..:../.libs:$$PYTHONPATH" ;\ + export PYTHONPATH; \ + LD_LIBRARY_PATH="$(top_builddir)/.libs:$$LD_LIBRARY_PATH" ; \ + export LD_LIBRARY_PATH; \ + $(CHECKER) $(PYTHON) nist-test.py -s -b $(srcdir) ; fi) + -@(if [ -x sun-test.py -a -d $(TESTDIR)/suntest ] ; then \ + echo "## Running Schema tests (Sun)"; \ + PYTHONPATH="../python:../python/.libs:..:../.libs:$$PYTHONPATH" ;\ + export PYTHONPATH; \ + LD_LIBRARY_PATH="$(top_builddir)/.libs:$$LD_LIBRARY_PATH" ; \ + export LD_LIBRARY_PATH; \ + $(CHECKER) $(PYTHON) sun-test.py -s -b $(srcdir) ; fi) + -@(if [ -x ms-test.py -a -d $(TESTDIR)/msxsdtest ] ; then \ + echo "## Running Schema tests (Microsoft)"; \ + PYTHONPATH="../python:../python/.libs:..:../.libs:$$PYTHONPATH" ;\ + export PYTHONPATH; \ + LD_LIBRARY_PATH="$(top_builddir)/.libs:$$LD_LIBRARY_PATH" ; \ + export LD_LIBRARY_PATH; \ + $(CHECKER) $(PYTHON) ms-test.py -s -b $(srcdir) ; fi) + +tests: + -@(if [ -x $(PYTHON) ] ; then \ + $(MAKE) pytests ; fi); + +# +# Heavy, works well only on RHEL3 +# +valgrind: + -@(if [ -x $(PYTHON) ] ; then \ + echo '## Running the regression tests under Valgrind' ; \ + $(MAKE) CHECKER='valgrind -q' pytests ; fi); + +CLEANFILES=$(PYSCRIPTS) test.log + diff --git a/xstc/Makefile.in b/xstc/Makefile.in new file mode 100644 index 0000000..2a9f034 --- /dev/null +++ b/xstc/Makefile.in @@ -0,0 +1,668 @@ +# Makefile.in generated by automake 1.13.4 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2013 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = xstc +DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BASE_THREAD_LIBS = @BASE_THREAD_LIBS@ +C14N_OBJ = @C14N_OBJ@ +CATALOG_OBJ = @CATALOG_OBJ@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +CYGWIN_EXTRA_LDFLAGS = @CYGWIN_EXTRA_LDFLAGS@ +CYGWIN_EXTRA_PYTHON_LIBADD = @CYGWIN_EXTRA_PYTHON_LIBADD@ +DEBUG_OBJ = @DEBUG_OBJ@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DOCB_OBJ = @DOCB_OBJ@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FTP_OBJ = @FTP_OBJ@ +GREP = @GREP@ +HAVE_ISINF = @HAVE_ISINF@ +HAVE_ISNAN = @HAVE_ISNAN@ +HTML_DIR = @HTML_DIR@ +HTML_OBJ = @HTML_OBJ@ +HTTP_OBJ = @HTTP_OBJ@ +ICONV_LIBS = @ICONV_LIBS@ +ICU_LIBS = @ICU_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBXML_MAJOR_VERSION = @LIBXML_MAJOR_VERSION@ +LIBXML_MICRO_VERSION = @LIBXML_MICRO_VERSION@ +LIBXML_MINOR_VERSION = @LIBXML_MINOR_VERSION@ +LIBXML_VERSION = @LIBXML_VERSION@ +LIBXML_VERSION_EXTRA = @LIBXML_VERSION_EXTRA@ +LIBXML_VERSION_INFO = @LIBXML_VERSION_INFO@ +LIBXML_VERSION_NUMBER = @LIBXML_VERSION_NUMBER@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LZMA_CFLAGS = @LZMA_CFLAGS@ +LZMA_LIBS = @LZMA_LIBS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MODULE_EXTENSION = @MODULE_EXTENSION@ +MODULE_PLATFORM_LIBS = @MODULE_PLATFORM_LIBS@ +MV = @MV@ +M_LIBS = @M_LIBS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PYTHON = @PYTHON@ +PYTHON_INCLUDES = @PYTHON_INCLUDES@ +PYTHON_LIBS = @PYTHON_LIBS@ +PYTHON_SITE_PACKAGES = @PYTHON_SITE_PACKAGES@ +PYTHON_SUBDIR = @PYTHON_SUBDIR@ +PYTHON_TESTS = @PYTHON_TESTS@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +RDL_LIBS = @RDL_LIBS@ +READER_TEST = @READER_TEST@ +RELDATE = @RELDATE@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STATIC_BINARIES = @STATIC_BINARIES@ +STRIP = @STRIP@ +TAR = @TAR@ +TEST_C14N = @TEST_C14N@ +TEST_CATALOG = @TEST_CATALOG@ +TEST_DEBUG = @TEST_DEBUG@ +TEST_HTML = @TEST_HTML@ +TEST_MODULES = @TEST_MODULES@ +TEST_PATTERN = @TEST_PATTERN@ +TEST_PHTML = @TEST_PHTML@ +TEST_PUSH = @TEST_PUSH@ +TEST_REGEXPS = @TEST_REGEXPS@ +TEST_SAX = @TEST_SAX@ +TEST_SCHEMAS = @TEST_SCHEMAS@ +TEST_SCHEMATRON = @TEST_SCHEMATRON@ +TEST_THREADS = @TEST_THREADS@ +TEST_VALID = @TEST_VALID@ +TEST_VTIME = @TEST_VTIME@ +TEST_XINCLUDE = @TEST_XINCLUDE@ +TEST_XPATH = @TEST_XPATH@ +TEST_XPTR = @TEST_XPTR@ +THREAD_CFLAGS = @THREAD_CFLAGS@ +THREAD_LIBS = @THREAD_LIBS@ +VERSION = @VERSION@ +VERSION_SCRIPT_FLAGS = @VERSION_SCRIPT_FLAGS@ +WGET = @WGET@ +WIN32_EXTRA_LDFLAGS = @WIN32_EXTRA_LDFLAGS@ +WIN32_EXTRA_LIBADD = @WIN32_EXTRA_LIBADD@ +WIN32_EXTRA_PYTHON_LIBADD = @WIN32_EXTRA_PYTHON_LIBADD@ +WITH_C14N = @WITH_C14N@ +WITH_CATALOG = @WITH_CATALOG@ +WITH_DEBUG = @WITH_DEBUG@ +WITH_DOCB = @WITH_DOCB@ +WITH_FTP = @WITH_FTP@ +WITH_HTML = @WITH_HTML@ +WITH_HTTP = @WITH_HTTP@ +WITH_ICONV = @WITH_ICONV@ +WITH_ICU = @WITH_ICU@ +WITH_ISO8859X = @WITH_ISO8859X@ +WITH_LEGACY = @WITH_LEGACY@ +WITH_LZMA = @WITH_LZMA@ +WITH_MEM_DEBUG = @WITH_MEM_DEBUG@ +WITH_MODULES = @WITH_MODULES@ +WITH_OUTPUT = @WITH_OUTPUT@ +WITH_PATTERN = @WITH_PATTERN@ +WITH_PUSH = @WITH_PUSH@ +WITH_READER = @WITH_READER@ +WITH_REGEXPS = @WITH_REGEXPS@ +WITH_RUN_DEBUG = @WITH_RUN_DEBUG@ +WITH_SAX1 = @WITH_SAX1@ +WITH_SCHEMAS = @WITH_SCHEMAS@ +WITH_SCHEMATRON = @WITH_SCHEMATRON@ +WITH_THREADS = @WITH_THREADS@ +WITH_THREAD_ALLOC = @WITH_THREAD_ALLOC@ +WITH_TREE = @WITH_TREE@ +WITH_TRIO = @WITH_TRIO@ +WITH_VALID = @WITH_VALID@ +WITH_WRITER = @WITH_WRITER@ +WITH_XINCLUDE = @WITH_XINCLUDE@ +WITH_XPATH = @WITH_XPATH@ +WITH_XPTR = @WITH_XPTR@ +WITH_ZLIB = @WITH_ZLIB@ +XINCLUDE_OBJ = @XINCLUDE_OBJ@ +XMLLINT = @XMLLINT@ +XML_CFLAGS = @XML_CFLAGS@ +XML_INCLUDEDIR = @XML_INCLUDEDIR@ +XML_LIBDIR = @XML_LIBDIR@ +XML_LIBS = @XML_LIBS@ +XML_LIBTOOLLIBS = @XML_LIBTOOLLIBS@ +XPATH_OBJ = @XPATH_OBJ@ +XPTR_OBJ = @XPTR_OBJ@ +XSLTPROC = @XSLTPROC@ +Z_CFLAGS = @Z_CFLAGS@ +Z_LIBS = @Z_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# +# Definition for the tests from W3C +# +PYSCRIPTS = nist-test.py ms-test.py sun-test.py +TESTDIR = Tests +TESTDIRS = $(TESTDIR)/msxsdtest $(TESTDIR)/suntest $(TESTDIR)/Datatypes +TARBALL = xsts-2002-01-16.tar.gz +TARBALL_2 = xsts-2004-01-14.tar.gz +TSNAME = xmlschema2002-01-16 +TSNAME_2 = xmlschema2004-01-14 +TARBALLURL = http://www.w3.org/XML/2004/xml-schema-test-suite/$(TSNAME)/$(TARBALL) +TARBALLURL_2 = http://www.w3.org/XML/2004/xml-schema-test-suite/$(TSNAME_2)/$(TARBALL_2) +MSTESTDEF = MSXMLSchema1-0-20020116.testSet +SUNTESTDEF = SunXMLSchema1-0-20020116.testSet +NISTTESTDEF = NISTXMLSchema1-0-20020116.testSet +NISTTESTDEF_2 = NISTXMLSchemaDatatypes.testSet + +# +# The local data and scripts +# +EXTRA_DIST = xstc.py xstc-to-python.xsl +CLEANFILES = $(PYSCRIPTS) test.log +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu xstc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu xstc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +tags TAGS: + +ctags CTAGS: + +cscope cscopelist: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + cscopelist-am ctags-am distclean distclean-generic \ + distclean-libtool distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags-am uninstall uninstall-am + +# +# Nothing is done by make, only make tests and +# only if Python and Schemas are enabled. +# +all: + +# +# Rule to load the test description and extract the informations +# +$(TESTDIRS) Tests/Metadata/$(NISTTESTDEF_2) Tests/Metadata/$(MSTTESTDEF) Tests/Metadata/$(SUNTESTDEF): + -@(if [ ! -d Tests ] ; then \ + mkdir Tests ; \ + fi) + -@(if [ ! -f $(TARBALL_2) ] ; then \ + if [ -f $(srcdir)/$(TARBALL_2) ] ; then \ + $(LN_S) $(srcdir)/$(TARBALL_2) $(TARBALL_2) ; else \ + echo "Missing the test suite description (2004-01-14), trying to fetch it" ;\ + if [ -x "$(WGET)" ] ; then \ + $(WGET) $(TARBALLURL_2) ; \ + else echo "Dont' know how to fetch $(TARBALLURL_2)" ; fi ; fi ; fi) + -@(if [ -f $(TARBALL_2) ] ; then \ + echo -n "extracting test data (NIST)..." ; \ + $(TAR) -xzf $(TARBALL_2) --wildcards '*/Datatypes' '*/Metadata/$(NISTTESTDEF_2)' ; \ + echo "done" ; \ + fi) + -@(if [ ! -f $(TARBALL) ] ; then \ + if [ -f $(srcdir)/$(TARBALL) ] ; then \ + $(LN_S) $(srcdir)/$(TARBALL) $(TARBALL) ; else \ + echo "Missing the test suite description (2002-01-16), trying to fetch it" ;\ + if [ -x "$(WGET)" ] ; then \ + $(WGET) $(TARBALLURL) ; \ + else echo "Dont' know how to fetch $(TARBALLURL)" ; fi ; fi ; fi) + -@(if [ -f $(TARBALL) ] ; then \ + echo -n "extracting test data (Sun, Microsoft)..." ; \ + $(TAR) -C Tests -xzf $(TARBALL) --wildcards '*/suntest' '*/msxsdtest' '*/$(MSTESTDEF)' '*/$(SUNTESTDEF)' ; \ + if [ -d Tests/suntest ] ; then rm -r Tests/suntest ; fi ; \ + if [ -d Tests/msxsdtest ] ; then rm -r Tests/msxsdtest ; fi ; \ + mv Tests/xmlschema2002-01-16/* Tests ; \ + mv Tests/*.testSet Tests/Metadata ; \ + rm -r Tests/xmlschema2002-01-16 ; \ + echo "done" ; \ + fi) + +# +# The python tests are generated via XSLT +# +nist-test.py: Tests/Metadata/$(NISTTESTDEF_2) xstc-to-python.xsl + -@(if [ -x $(XSLTPROC) ] ; then \ + echo "Rebuilding script (NIST)" $@ ; \ + $(XSLTPROC) --nonet --stringparam vendor NIST-2 \ + $(srcdir)/xstc-to-python.xsl \ + $(srcdir)/Tests/Metadata/$(NISTTESTDEF_2) > $@ ; \ + chmod +x $@ ; fi ) + +ms-test.py: Tests/Metadata/$(MSTTESTDEF) xstc-to-python.xsl + -@(if [ -x $(XSLTPROC) ] ; then \ + echo "Rebuilding script (Microsoft)" $@ ; \ + $(XSLTPROC) --nonet --stringparam vendor MS \ + $(srcdir)/xstc-to-python.xsl \ + $(srcdir)/Tests/Metadata/$(MSTESTDEF) > $@ ; \ + chmod +x $@ ; fi ) + +sun-test.py: Tests/Metadata/$(SUNTESTDEF) xstc-to-python.xsl + -@(if [ -x $(XSLTPROC) ] ; then \ + echo "Rebuilding script (Sun)" $@ ; \ + $(XSLTPROC) --nonet --stringparam vendor SUN \ + $(srcdir)/xstc-to-python.xsl \ + $(srcdir)/Tests/Metadata/$(SUNTESTDEF) > $@ ; \ + chmod +x $@ ; fi ) + +# +# The actual test run if present. PYTHONPATH is updated to make sure +# we run the version from the loacl build and not preinstalled bindings +# +pytests: $(PYSCRIPTS) $(TESTDIRS) + -@(if [ -x nist-test.py -a -d $(TESTDIR)/Datatypes ] ; then \ + echo "## Running XML Schema tests (NIST)"; \ + PYTHONPATH="../python:../python/.libs:..:../.libs:$$PYTHONPATH" ;\ + export PYTHONPATH; \ + LD_LIBRARY_PATH="$(top_builddir)/.libs:$$LD_LIBRARY_PATH" ; \ + export LD_LIBRARY_PATH; \ + $(CHECKER) $(PYTHON) nist-test.py -s -b $(srcdir) ; fi) + -@(if [ -x sun-test.py -a -d $(TESTDIR)/suntest ] ; then \ + echo "## Running Schema tests (Sun)"; \ + PYTHONPATH="../python:../python/.libs:..:../.libs:$$PYTHONPATH" ;\ + export PYTHONPATH; \ + LD_LIBRARY_PATH="$(top_builddir)/.libs:$$LD_LIBRARY_PATH" ; \ + export LD_LIBRARY_PATH; \ + $(CHECKER) $(PYTHON) sun-test.py -s -b $(srcdir) ; fi) + -@(if [ -x ms-test.py -a -d $(TESTDIR)/msxsdtest ] ; then \ + echo "## Running Schema tests (Microsoft)"; \ + PYTHONPATH="../python:../python/.libs:..:../.libs:$$PYTHONPATH" ;\ + export PYTHONPATH; \ + LD_LIBRARY_PATH="$(top_builddir)/.libs:$$LD_LIBRARY_PATH" ; \ + export LD_LIBRARY_PATH; \ + $(CHECKER) $(PYTHON) ms-test.py -s -b $(srcdir) ; fi) + +tests: + -@(if [ -x $(PYTHON) ] ; then \ + $(MAKE) pytests ; fi); + +# +# Heavy, works well only on RHEL3 +# +valgrind: + -@(if [ -x $(PYTHON) ] ; then \ + echo '## Running the regression tests under Valgrind' ; \ + $(MAKE) CHECKER='valgrind -q' pytests ; fi); + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/xstc/xstc-to-python.xsl b/xstc/xstc-to-python.xsl new file mode 100755 index 0000000..78d55cd --- /dev/null +++ b/xstc/xstc-to-python.xsl @@ -0,0 +1,114 @@ +<?xml version="1.0" encoding="UTF-8" ?>
+<xsl:stylesheet
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:ts="TestSuite" version="1.0"
+ xmlns:xl="http://www.w3.org/1999/xlink">
+ <xsl:param name="vendor" select="'NIST'"/>
+ <xsl:output method="text"/>
+
+ <xsl:template match="/">
+ <xsl:text>#!/usr/bin/python -u
+# -*- coding: UTF-8 -*-
+#
+# This file is generated from the W3C test suite description file.
+#
+
+import xstc
+from xstc import XSTCTestRunner, XSTCTestGroup, XSTCSchemaTest, XSTCInstanceTest
+
+xstc.vendor = "</xsl:text><xsl:value-of select="$vendor"/><xsl:text>"
+
+r = XSTCTestRunner()
+
+# Group definitions.
+
+</xsl:text>
+
+ <xsl:apply-templates select="ts:testSet/ts:testGroup" mode="group-def"/>
+<xsl:text>
+
+# Test definitions.
+
+</xsl:text>
+ <xsl:apply-templates select="ts:testSet/ts:testGroup" mode="test-def"/>
+ <xsl:text>
+
+r.run()
+
+</xsl:text>
+
+ </xsl:template>
+
+ <!-- groupName, descr -->
+ <xsl:template match="ts:testGroup" mode="group-def">
+ <xsl:text>r.addGroup(XSTCTestGroup("</xsl:text>
+ <!-- group -->
+ <xsl:value-of select="@name"/><xsl:text>", "</xsl:text>
+ <!-- main schema -->
+ <xsl:value-of select="ts:schemaTest[1]/ts:schemaDocument/@xl:href"/><xsl:text>", """</xsl:text>
+ <!-- group-description -->
+ <xsl:call-template name="str">
+ <xsl:with-param name="str" select="ts:annotation/ts:documentation/text()"/>
+ </xsl:call-template>
+ <xsl:text>"""))
+</xsl:text>
+ </xsl:template>
+
+ <xsl:template name="str">
+ <xsl:param name="str"/>
+ <xsl:choose>
+ <xsl:when test="contains($str, '"')">
+ <xsl:call-template name="str">
+ <xsl:with-param name="str" select="substring-before($str, '"')"/>
+ </xsl:call-template>
+ <xsl:text>'</xsl:text>
+ <xsl:call-template name="str">
+ <xsl:with-param name="str" select="substring-after($str, '"')"/>
+ </xsl:call-template>
+
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$str"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="ts:testGroup" mode="test-def">
+ <xsl:param name="group" select="@name"/>
+ <xsl:for-each select="ts:schemaTest">
+ <!-- groupName, isSchema, Name, Accepted, File, Val, Descr -->
+ <xsl:text>r.addTest(XSTCSchemaTest("</xsl:text>
+ <!-- group -->
+ <xsl:value-of select="$group"/><xsl:text>", "</xsl:text>
+ <!-- test-name -->
+ <xsl:value-of select="@name"/><xsl:text>", </xsl:text>
+ <!-- accepted -->
+ <xsl:value-of select="number(ts:current/@status = 'accepted')"/><xsl:text>, "</xsl:text>
+ <!-- filename -->
+ <xsl:value-of select="ts:schemaDocument/@xl:href"/><xsl:text>", </xsl:text>
+ <!-- validity -->
+ <xsl:value-of select="number(ts:expected/@validity = 'valid')"/><xsl:text>, "</xsl:text>
+ <!-- test-description -->
+ <xsl:value-of select="ts:annotation/ts:documentation/text()"/><xsl:text>"))
+</xsl:text>
+ </xsl:for-each>
+ <xsl:for-each select="ts:instanceTest">
+ <!-- groupName, isSchema, Name, Accepted, File, Val, Descr -->
+ <xsl:text>r.addTest(XSTCInstanceTest("</xsl:text>
+ <!-- group -->
+ <xsl:value-of select="$group"/><xsl:text>", "</xsl:text>
+ <!-- test-name -->
+ <xsl:value-of select="@name"/><xsl:text>", </xsl:text>
+ <!-- accepted -->
+ <xsl:value-of select="number(ts:current/@status = 'accepted')"/><xsl:text>, "</xsl:text>
+ <!-- filename -->
+ <xsl:value-of select="ts:instanceDocument/@xl:href"/><xsl:text>", </xsl:text>
+ <!-- validity -->
+ <xsl:value-of select="number(ts:expected/@validity = 'valid')"/><xsl:text>, "</xsl:text>
+ <!-- test-description -->
+ <xsl:value-of select="ts:annotation/ts:documentation/text()"/><xsl:text>"))
+</xsl:text>
+ </xsl:for-each>
+ </xsl:template>
+
+</xsl:stylesheet>
\ No newline at end of file diff --git a/xstc/xstc.py b/xstc/xstc.py new file mode 100755 index 0000000..ca011bb --- /dev/null +++ b/xstc/xstc.py @@ -0,0 +1,693 @@ +#!/usr/bin/env python + +# +# This is the MS subset of the W3C test suite for XML Schemas. +# This file is generated from the MS W3c test suite description file. +# + +import sys, os +import exceptions, optparse +import libxml2 + +opa = optparse.OptionParser() + +opa.add_option("-b", "--base", action="store", type="string", dest="baseDir", + default="", + help="""The base directory; i.e. the parent folder of the + "nisttest", "suntest" and "msxsdtest" directories.""") + +opa.add_option("-o", "--out", action="store", type="string", dest="logFile", + default="test.log", + help="The filepath of the log file to be created") + +opa.add_option("--log", action="store_true", dest="enableLog", + default=False, + help="Create the log file") + +opa.add_option("--no-test-out", action="store_true", dest="disableTestStdOut", + default=False, + help="Don't output test results") + +opa.add_option("-s", "--silent", action="store_true", dest="silent", default=False, + help="Disables display of all tests") + +opa.add_option("-v", "--verbose", action="store_true", dest="verbose", + default=False, + help="Displays all tests (only if --silent is not set)") + +opa.add_option("-x", "--max", type="int", dest="maxTestCount", + default="-1", + help="The maximum number of tests to be run") + +opa.add_option("-t", "--test", type="string", dest="singleTest", + default=None, + help="Runs the specified test only") + +opa.add_option("--tsw", "--test-starts-with", type="string", dest="testStartsWith", + default=None, + help="Runs the specified test(s), starting with the given string") + +opa.add_option("--rieo", "--report-internal-errors-only", action="store_true", + dest="reportInternalErrOnly", default=False, + help="Display erroneous tests of type 'internal' only") + +opa.add_option("--rueo", "--report-unimplemented-errors-only", action="store_true", + dest="reportUnimplErrOnly", default=False, + help="Display erroneous tests of type 'unimplemented' only") + +opa.add_option("--rmleo", "--report-mem-leak-errors-only", action="store_true", + dest="reportMemLeakErrOnly", default=False, + help="Display erroneous tests of type 'memory leak' only") + +opa.add_option("-c", "--combines", type="string", dest="combines", + default=None, + help="Combines to be run (all if omitted)") + +opa.add_option("--csw", "--csw", type="string", dest="combineStartsWith", + default=None, + help="Combines to be run (all if omitted)") + +opa.add_option("--rc", "--report-combines", action="store_true", + dest="reportCombines", default=False, + help="Display combine reports") + +opa.add_option("--rec", "--report-err-combines", action="store_true", + dest="reportErrCombines", default=False, + help="Display erroneous combine reports only") + +opa.add_option("--debug", action="store_true", + dest="debugEnabled", default=False, + help="Displays debug messages") + +opa.add_option("--info", action="store_true", + dest="info", default=False, + help="Displays info on the suite only. Does not run any test.") +opa.add_option("--sax", action="store_true", + dest="validationSAX", default=False, + help="Use SAX2-driven validation.") +opa.add_option("--tn", action="store_true", + dest="displayTestName", default=False, + help="Display the test name in every case.") + +(options, args) = opa.parse_args() + +if options.combines is not None: + options.combines = options.combines.split() + +################################################ +# The vars below are not intended to be changed. +# + +msgSchemaNotValidButShould = "The schema should be valid." +msgSchemaValidButShouldNot = "The schema should be invalid." +msgInstanceNotValidButShould = "The instance should be valid." +msgInstanceValidButShouldNot = "The instance should be invalid." +vendorNIST = "NIST" +vendorNIST_2 = "NIST-2" +vendorSUN = "SUN" +vendorMS = "MS" + +################### +# Helper functions. +# +vendor = None + +def handleError(test, msg): + global options + if not options.silent: + test.addLibLog("'%s' LIB: %s" % (test.name, msg)) + if msg.find("Unimplemented") > -1: + test.failUnimplemented() + elif msg.find("Internal") > -1: + test.failInternal() + + +def fixFileNames(fileName): + if (fileName is None) or (fileName == ""): + return "" + dirs = fileName.split("/") + if dirs[1] != "Tests": + fileName = os.path.join(".", "Tests") + for dir in dirs[1:]: + fileName = os.path.join(fileName, dir) + return fileName + +class XSTCTestGroup: + def __init__(self, name, schemaFileName, descr): + global vendor, vendorNIST_2 + self.name = name + self.descr = descr + self.mainSchema = True + self.schemaFileName = fixFileNames(schemaFileName) + self.schemaParsed = False + self.schemaTried = False + + def setSchema(self, schemaFileName, parsed): + if not self.mainSchema: + return + self.mainSchema = False + self.schemaParsed = parsed + self.schemaTried = True + +class XSTCTestCase: + + # <!-- groupName, Name, Accepted, File, Val, Descr + def __init__(self, isSchema, groupName, name, accepted, file, val, descr): + global options + # + # Constructor. + # + self.testRunner = None + self.isSchema = isSchema + self.groupName = groupName + self.name = name + self.accepted = accepted + self.fileName = fixFileNames(file) + self.val = val + self.descr = descr + self.failed = False + self.combineName = None + + self.log = [] + self.libLog = [] + self.initialMemUsed = 0 + self.memLeak = 0 + self.excepted = False + self.bad = False + self.unimplemented = False + self.internalErr = False + self.noSchemaErr = False + self.failed = False + # + # Init the log. + # + if not options.silent: + if self.descr is not None: + self.log.append("'%s' descr: %s\n" % (self.name, self.descr)) + self.log.append("'%s' exp validity: %d\n" % (self.name, self.val)) + + def initTest(self, runner): + global vendorNIST, vendorSUN, vendorMS, vendorNIST_2, options, vendor + # + # Get the test-group. + # + self.runner = runner + self.group = runner.getGroup(self.groupName) + if vendor == vendorMS or vendor == vendorSUN: + # + # Use the last given directory for the combine name. + # + dirs = self.fileName.split("/") + self.combineName = dirs[len(dirs) -2] + elif vendor == vendorNIST: + # + # NIST files are named in the following form: + # "NISTSchema-short-pattern-1.xsd" + # + tokens = self.name.split("-") + self.combineName = tokens[1] + elif vendor == vendorNIST_2: + # + # Group-names have the form: "atomic-normalizedString-length-1" + # + tokens = self.groupName.split("-") + self.combineName = "%s-%s" % (tokens[0], tokens[1]) + else: + self.combineName = "unkown" + raise Exception("Could not compute the combine name of a test.") + if (not options.silent) and (self.group.descr is not None): + self.log.append("'%s' group-descr: %s\n" % (self.name, self.group.descr)) + + + def addLibLog(self, msg): + """This one is intended to be used by the error handler + function""" + global options + if not options.silent: + self.libLog.append(msg) + + def fail(self, msg): + global options + self.failed = True + if not options.silent: + self.log.append("'%s' ( FAILED: %s\n" % (self.name, msg)) + + def failNoSchema(self): + global options + self.failed = True + self.noSchemaErr = True + if not options.silent: + self.log.append("'%s' X NO-SCHEMA\n" % (self.name)) + + def failInternal(self): + global options + self.failed = True + self.internalErr = True + if not options.silent: + self.log.append("'%s' * INTERNAL\n" % self.name) + + def failUnimplemented(self): + global options + self.failed = True + self.unimplemented = True + if not options.silent: + self.log.append("'%s' ? UNIMPLEMENTED\n" % self.name) + + def failCritical(self, msg): + global options + self.failed = True + self.bad = True + if not options.silent: + self.log.append("'%s' ! BAD: %s\n" % (self.name, msg)) + + def failExcept(self, e): + global options + self.failed = True + self.excepted = True + if not options.silent: + self.log.append("'%s' # EXCEPTION: %s\n" % (self.name, e.__str__())) + + def setUp(self): + # + # Set up Libxml2. + # + self.initialMemUsed = libxml2.debugMemory(1) + libxml2.initParser() + libxml2.lineNumbersDefault(1) + libxml2.registerErrorHandler(handleError, self) + + def tearDown(self): + libxml2.schemaCleanupTypes() + libxml2.cleanupParser() + self.memLeak = libxml2.debugMemory(1) - self.initialMemUsed + + def isIOError(self, file, docType): + err = None + try: + err = libxml2.lastError() + except: + # Suppress exceptions. + pass + if (err is None): + return False + if err.domain() == libxml2.XML_FROM_IO: + self.failCritical("failed to access the %s resource '%s'\n" % (docType, file)) + + def debugMsg(self, msg): + global options + if options.debugEnabled: + sys.stdout.write("'%s' DEBUG: %s\n" % (self.name, msg)) + + def finalize(self): + global options + """Adds additional info to the log.""" + # + # Add libxml2 messages. + # + if not options.silent: + self.log.extend(self.libLog) + # + # Add memory leaks. + # + if self.memLeak != 0: + self.log.append("%s + memory leak: %d bytes\n" % (self.name, self.memLeak)) + + def run(self): + """Runs a test.""" + global options + + ##filePath = os.path.join(options.baseDir, self.fileName) + # filePath = "%s/%s/%s/%s" % (options.baseDir, self.test_Folder, self.schema_Folder, self.schema_File) + if options.displayTestName: + sys.stdout.write("'%s'\n" % self.name) + try: + self.validate() + except (Exception, libxml2.parserError, libxml2.treeError), e: + self.failExcept(e) + +def parseSchema(fileName): + schema = None + ctxt = libxml2.schemaNewParserCtxt(fileName) + try: + try: + schema = ctxt.schemaParse() + except: + pass + finally: + del ctxt + return schema + + +class XSTCSchemaTest(XSTCTestCase): + + def __init__(self, groupName, name, accepted, file, val, descr): + XSTCTestCase.__init__(self, 1, groupName, name, accepted, file, val, descr) + + def validate(self): + global msgSchemaNotValidButShould, msgSchemaValidButShouldNot + schema = None + filePath = self.fileName + # os.path.join(options.baseDir, self.fileName) + valid = 0 + try: + # + # Parse the schema. + # + self.debugMsg("loading schema: %s" % filePath) + schema = parseSchema(filePath) + self.debugMsg("after loading schema") + if schema is None: + self.debugMsg("schema is None") + self.debugMsg("checking for IO errors...") + if self.isIOError(file, "schema"): + return + self.debugMsg("checking schema result") + if (schema is None and self.val) or (schema is not None and self.val == 0): + self.debugMsg("schema result is BAD") + if (schema == None): + self.fail(msgSchemaNotValidButShould) + else: + self.fail(msgSchemaValidButShouldNot) + else: + self.debugMsg("schema result is OK") + finally: + self.group.setSchema(self.fileName, schema is not None) + del schema + +class XSTCInstanceTest(XSTCTestCase): + + def __init__(self, groupName, name, accepted, file, val, descr): + XSTCTestCase.__init__(self, 0, groupName, name, accepted, file, val, descr) + + def validate(self): + instance = None + schema = None + filePath = self.fileName + # os.path.join(options.baseDir, self.fileName) + + if not self.group.schemaParsed and self.group.schemaTried: + self.failNoSchema() + return + + self.debugMsg("loading instance: %s" % filePath) + parserCtxt = libxml2.newParserCtxt() + if (parserCtxt is None): + # TODO: Is this one necessary, or will an exception + # be already raised? + raise Exception("Could not create the instance parser context.") + if not options.validationSAX: + try: + try: + instance = parserCtxt.ctxtReadFile(filePath, None, libxml2.XML_PARSE_NOWARNING) + except: + # Suppress exceptions. + pass + finally: + del parserCtxt + self.debugMsg("after loading instance") + if instance is None: + self.debugMsg("instance is None") + self.failCritical("Failed to parse the instance for unknown reasons.") + return + try: + # + # Validate the instance. + # + self.debugMsg("loading schema: %s" % self.group.schemaFileName) + schema = parseSchema(self.group.schemaFileName) + try: + validationCtxt = schema.schemaNewValidCtxt() + #validationCtxt = libxml2.schemaNewValidCtxt(None) + if (validationCtxt is None): + self.failCritical("Could not create the validation context.") + return + try: + self.debugMsg("validating instance") + if options.validationSAX: + instance_Err = validationCtxt.schemaValidateFile(filePath, 0) + else: + instance_Err = validationCtxt.schemaValidateDoc(instance) + self.debugMsg("after instance validation") + self.debugMsg("instance-err: %d" % instance_Err) + if (instance_Err != 0 and self.val == 1) or (instance_Err == 0 and self.val == 0): + self.debugMsg("instance result is BAD") + if (instance_Err != 0): + self.fail(msgInstanceNotValidButShould) + else: + self.fail(msgInstanceValidButShouldNot) + + else: + self.debugMsg("instance result is OK") + finally: + del validationCtxt + finally: + del schema + finally: + if instance is not None: + instance.freeDoc() + + +#################### +# Test runner class. +# + +class XSTCTestRunner: + + CNT_TOTAL = 0 + CNT_RAN = 1 + CNT_SUCCEEDED = 2 + CNT_FAILED = 3 + CNT_UNIMPLEMENTED = 4 + CNT_INTERNAL = 5 + CNT_BAD = 6 + CNT_EXCEPTED = 7 + CNT_MEMLEAK = 8 + CNT_NOSCHEMA = 9 + CNT_NOTACCEPTED = 10 + CNT_SCHEMA_TEST = 11 + + def __init__(self): + self.logFile = None + self.counters = self.createCounters() + self.testList = [] + self.combinesRan = {} + self.groups = {} + self.curGroup = None + + def createCounters(self): + counters = {self.CNT_TOTAL:0, self.CNT_RAN:0, self.CNT_SUCCEEDED:0, + self.CNT_FAILED:0, self.CNT_UNIMPLEMENTED:0, self.CNT_INTERNAL:0, self.CNT_BAD:0, + self.CNT_EXCEPTED:0, self.CNT_MEMLEAK:0, self.CNT_NOSCHEMA:0, self.CNT_NOTACCEPTED:0, + self.CNT_SCHEMA_TEST:0} + + return counters + + def addTest(self, test): + self.testList.append(test) + test.initTest(self) + + def getGroup(self, groupName): + return self.groups[groupName] + + def addGroup(self, group): + self.groups[group.name] = group + + def updateCounters(self, test, counters): + if test.memLeak != 0: + counters[self.CNT_MEMLEAK] += 1 + if not test.failed: + counters[self.CNT_SUCCEEDED] +=1 + if test.failed: + counters[self.CNT_FAILED] += 1 + if test.bad: + counters[self.CNT_BAD] += 1 + if test.unimplemented: + counters[self.CNT_UNIMPLEMENTED] += 1 + if test.internalErr: + counters[self.CNT_INTERNAL] += 1 + if test.noSchemaErr: + counters[self.CNT_NOSCHEMA] += 1 + if test.excepted: + counters[self.CNT_EXCEPTED] += 1 + if not test.accepted: + counters[self.CNT_NOTACCEPTED] += 1 + if test.isSchema: + counters[self.CNT_SCHEMA_TEST] += 1 + return counters + + def displayResults(self, out, all, combName, counters): + out.write("\n") + if all: + if options.combines is not None: + out.write("combine(s): %s\n" % str(options.combines)) + elif combName is not None: + out.write("combine : %s\n" % combName) + out.write(" total : %d\n" % counters[self.CNT_TOTAL]) + if all or options.combines is not None: + out.write(" ran : %d\n" % counters[self.CNT_RAN]) + out.write(" (schemata) : %d\n" % counters[self.CNT_SCHEMA_TEST]) + # out.write(" succeeded : %d\n" % counters[self.CNT_SUCCEEDED]) + out.write(" not accepted : %d\n" % counters[self.CNT_NOTACCEPTED]) + if counters[self.CNT_FAILED] > 0: + out.write(" failed : %d\n" % counters[self.CNT_FAILED]) + out.write(" -> internal : %d\n" % counters[self.CNT_INTERNAL]) + out.write(" -> unimpl. : %d\n" % counters[self.CNT_UNIMPLEMENTED]) + out.write(" -> skip-invalid-schema : %d\n" % counters[self.CNT_NOSCHEMA]) + out.write(" -> bad : %d\n" % counters[self.CNT_BAD]) + out.write(" -> exceptions : %d\n" % counters[self.CNT_EXCEPTED]) + out.write(" memory leaks : %d\n" % counters[self.CNT_MEMLEAK]) + + def displayShortResults(self, out, all, combName, counters): + out.write("Ran %d of %d tests (%d schemata):" % (counters[self.CNT_RAN], + counters[self.CNT_TOTAL], counters[self.CNT_SCHEMA_TEST])) + # out.write(" succeeded : %d\n" % counters[self.CNT_SUCCEEDED]) + if counters[self.CNT_NOTACCEPTED] > 0: + out.write(" %d not accepted" % (counters[self.CNT_NOTACCEPTED])) + if counters[self.CNT_FAILED] > 0 or counters[self.CNT_MEMLEAK] > 0: + if counters[self.CNT_FAILED] > 0: + out.write(" %d failed" % (counters[self.CNT_FAILED])) + out.write(" (") + if counters[self.CNT_INTERNAL] > 0: + out.write(" %d internal" % (counters[self.CNT_INTERNAL])) + if counters[self.CNT_UNIMPLEMENTED] > 0: + out.write(" %d unimplemented" % (counters[self.CNT_UNIMPLEMENTED])) + if counters[self.CNT_NOSCHEMA] > 0: + out.write(" %d skip-invalid-schema" % (counters[self.CNT_NOSCHEMA])) + if counters[self.CNT_BAD] > 0: + out.write(" %d bad" % (counters[self.CNT_BAD])) + if counters[self.CNT_EXCEPTED] > 0: + out.write(" %d exception" % (counters[self.CNT_EXCEPTED])) + out.write(" )") + if counters[self.CNT_MEMLEAK] > 0: + out.write(" %d leaks" % (counters[self.CNT_MEMLEAK])) + out.write("\n") + else: + out.write(" all passed\n") + + def reportCombine(self, combName): + global options + + counters = self.createCounters() + # + # Compute evaluation counters. + # + for test in self.combinesRan[combName]: + counters[self.CNT_TOTAL] += 1 + counters[self.CNT_RAN] += 1 + counters = self.updateCounters(test, counters) + if options.reportErrCombines and (counters[self.CNT_FAILED] == 0) and (counters[self.CNT_MEMLEAK] == 0): + pass + else: + if options.enableLog: + self.displayResults(self.logFile, False, combName, counters) + self.displayResults(sys.stdout, False, combName, counters) + + def displayTestLog(self, test): + sys.stdout.writelines(test.log) + sys.stdout.write("~~~~~~~~~~\n") + + def reportTest(self, test): + global options + + error = test.failed or test.memLeak != 0 + # + # Only erroneous tests will be written to the log, + # except @verbose is switched on. + # + if options.enableLog and (options.verbose or error): + self.logFile.writelines(test.log) + self.logFile.write("~~~~~~~~~~\n") + # + # if not @silent, only erroneous tests will be + # written to stdout, except @verbose is switched on. + # + if not options.silent: + if options.reportInternalErrOnly and test.internalErr: + self.displayTestLog(test) + if options.reportMemLeakErrOnly and test.memLeak != 0: + self.displayTestLog(test) + if options.reportUnimplErrOnly and test.unimplemented: + self.displayTestLog(test) + if (options.verbose or error) and (not options.reportInternalErrOnly) and (not options.reportMemLeakErrOnly) and (not options.reportUnimplErrOnly): + self.displayTestLog(test) + + + def addToCombines(self, test): + found = False + if self.combinesRan.has_key(test.combineName): + self.combinesRan[test.combineName].append(test) + else: + self.combinesRan[test.combineName] = [test] + + def run(self): + + global options + + if options.info: + for test in self.testList: + self.addToCombines(test) + sys.stdout.write("Combines: %d\n" % len(self.combinesRan)) + sys.stdout.write("%s\n" % self.combinesRan.keys()) + return + + if options.enableLog: + self.logFile = open(options.logFile, "w") + try: + for test in self.testList: + self.counters[self.CNT_TOTAL] += 1 + # + # Filter tests. + # + if options.singleTest is not None and options.singleTest != "": + if (test.name != options.singleTest): + continue + elif options.combines is not None: + if not options.combines.__contains__(test.combineName): + continue + elif options.testStartsWith is not None: + if not test.name.startswith(options.testStartsWith): + continue + elif options.combineStartsWith is not None: + if not test.combineName.startswith(options.combineStartsWith): + continue + + if options.maxTestCount != -1 and self.counters[self.CNT_RAN] >= options.maxTestCount: + break + self.counters[self.CNT_RAN] += 1 + # + # Run the thing, dammit. + # + try: + test.setUp() + try: + test.run() + finally: + test.tearDown() + finally: + # + # Evaluate. + # + test.finalize() + self.reportTest(test) + if options.reportCombines or options.reportErrCombines: + self.addToCombines(test) + self.counters = self.updateCounters(test, self.counters) + finally: + if options.reportCombines or options.reportErrCombines: + # + # Build a report for every single combine. + # + # TODO: How to sort a dict? + # + self.combinesRan.keys().sort(None) + for key in self.combinesRan.keys(): + self.reportCombine(key) + + # + # Display the final report. + # + if options.silent: + self.displayShortResults(sys.stdout, True, None, self.counters) + else: + sys.stdout.write("===========================\n") + self.displayResults(sys.stdout, True, None, self.counters) |