debian-xmlschema/xmlschema/tests/test_factory/arguments.py

101 lines
3.9 KiB
Python

# -*- coding: utf-8 -*-
#
# Copyright (c), 2016-2019, SISSA (International School for Advanced Studies).
# All rights reserved.
# This file is distributed under the terms of the MIT License.
# See the file 'LICENSE' in the root directory of the present
# distribution, or http://opensource.org/licenses/MIT.
#
# @author Davide Brunato <brunato@sissa.it>
#
"""
Test factory for creating test cases from lists of paths to XSD or XML files.
The list of cases can be defined within files named "testfiles". These are text files
that contain a list of relative paths to XSD or XML files, that are used to dinamically
build a set of test classes. Each path is followed by a list of options that defines a
custom setting for each test.
"""
import sys
import re
import argparse
TEST_FACTORY_OPTIONS = {
'extra_cases': '-x' in sys.argv or '--extra' in sys.argv, # Include extra test cases
'check_with_lxml': '-l' in sys.argv or '--lxml' in sys.argv, # Check with lxml.etree.XMLSchema (for XSD 1.0)
}
"""Command line options for test factory."""
RUN_W3C_TEST_SUITE = '-w' in sys.argv or '--w3c' in sys.argv
sys.argv = [a for a in sys.argv if a not in {'-x', '--extra', '-l', '--lxml'}] # Clean sys.argv for unittest
def get_test_args(args_line):
"""Returns the list of arguments from provided text line."""
try:
args_line, _ = args_line.split('#', 1) # Strip optional ending comment
except ValueError:
pass
return re.split(r'(?<!\\) ', args_line.strip())
def xsd_version_number(value):
if value not in ('1.0', '1.1'):
msg = "%r is not an XSD version." % value
raise argparse.ArgumentTypeError(msg)
return value
def defuse_data(value):
if value not in ('always', 'remote', 'never'):
msg = "%r is not a valid value." % value
raise argparse.ArgumentTypeError(msg)
return value
def create_test_line_args_parser():
"""Creates an arguments parser for uncommented on not blank "testfiles" lines."""
parser = argparse.ArgumentParser(add_help=True)
parser.usage = "TEST_FILE [OPTIONS]\nTry 'TEST_FILE --help' for more information."
parser.add_argument('filename', metavar='TEST_FILE', type=str, help="Test filename (relative path).")
parser.add_argument(
'-L', dest='locations', nargs=2, type=str, default=None, action='append',
metavar="URI-URL", help="Schema location hint overrides."
)
parser.add_argument(
'--version', dest='version', metavar='VERSION', type=xsd_version_number, default='1.0',
help="XSD schema version to use for the test case (default is 1.0)."
)
parser.add_argument(
'--errors', type=int, default=0, metavar='NUM', help="Number of errors expected (default=0)."
)
parser.add_argument(
'--warnings', type=int, default=0, metavar='NUM', help="Number of warnings expected (default=0)."
)
parser.add_argument(
'--inspect', action="store_true", default=False, help="Inspect using an observed custom schema class."
)
parser.add_argument(
'--defuse', metavar='(always, remote, never)', type=defuse_data, default='remote',
help="Define when to use the defused XML data loaders."
)
parser.add_argument(
'--timeout', type=int, default=300, metavar='SEC', help="Timeout for fetching resources (default=300)."
)
parser.add_argument(
'--defaults', action="store_true", default=False,
help="Test data uses default or fixed values (skip strict encoding checks).",
)
parser.add_argument(
'--skip', action="store_true", default=False,
help="Skip strict encoding checks (for cases where test data uses default or "
"fixed values or some test data are skipped by wildcards processContents)."
)
parser.add_argument(
'--debug', action="store_true", default=False,
help="Activate the debug mode (only the cases with --debug are executed).",
)
return parser