244 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
| from __future__ import absolute_import
 | |
| 
 | |
| # System modules
 | |
| import argparse
 | |
| import sys
 | |
| import os
 | |
| import textwrap
 | |
| 
 | |
| # LLDB modules
 | |
| from . import configuration
 | |
| 
 | |
| 
 | |
| def create_parser():
 | |
|     parser = argparse.ArgumentParser(
 | |
|         description='description',
 | |
|         prefix_chars='+-',
 | |
|         add_help=False)
 | |
|     group = None
 | |
| 
 | |
|     # Helper function for boolean options (group will point to the current
 | |
|     # group when executing X)
 | |
|     X = lambda optstr, helpstr, **kwargs: group.add_argument(
 | |
|         optstr, help=helpstr, action='store_true', **kwargs)
 | |
| 
 | |
|     group = parser.add_argument_group('Help')
 | |
|     group.add_argument(
 | |
|         '-h',
 | |
|         '--help',
 | |
|         dest='h',
 | |
|         action='store_true',
 | |
|         help="Print this help message and exit.  Add '-v' for more detailed help.")
 | |
| 
 | |
|     # C and Python toolchain options
 | |
|     group = parser.add_argument_group('Toolchain options')
 | |
|     group.add_argument(
 | |
|         '-A',
 | |
|         '--arch',
 | |
|         metavar='arch',
 | |
|         dest='arch',
 | |
|         help=textwrap.dedent('''Specify the architecture(s) to test. This option can be specified more than once'''))
 | |
|     group.add_argument('-C', '--compiler', metavar='compiler', dest='compiler', help=textwrap.dedent(
 | |
|         '''Specify the compiler(s) used to build the inferior executables. The compiler path can be an executable basename or a full path to a compiler executable. This option can be specified multiple times.'''))
 | |
|     if sys.platform == 'darwin':
 | |
|         group.add_argument('--apple-sdk', metavar='apple_sdk', dest='apple_sdk', default="", help=textwrap.dedent(
 | |
|             '''Specify the name of the Apple SDK (macosx, macosx.internal, iphoneos, iphoneos.internal, or path to SDK) and use the appropriate tools from that SDK's toolchain.'''))
 | |
|     # FIXME? This won't work for different extra flags according to each arch.
 | |
|     group.add_argument(
 | |
|         '-E',
 | |
|         metavar='extra-flags',
 | |
|         help=textwrap.dedent('''Specify the extra flags to be passed to the toolchain when building the inferior programs to be debugged
 | |
|                                                            suggestions: do not lump the "-A arch1 -A arch2" together such that the -E option applies to only one of the architectures'''))
 | |
| 
 | |
|     group.add_argument('--dsymutil', metavar='dsymutil', dest='dsymutil', help=textwrap.dedent('Specify which dsymutil to use.'))
 | |
|     group.add_argument('--llvm-tools-dir', metavar='dir', dest='llvm_tools_dir',
 | |
|             help=textwrap.dedent('The location of llvm tools used for testing (yaml2obj, FileCheck, etc.).'))
 | |
| 
 | |
|     # Test filtering options
 | |
|     group = parser.add_argument_group('Test filtering options')
 | |
|     group.add_argument(
 | |
|         '-f',
 | |
|         metavar='filterspec',
 | |
|         action='append',
 | |
|         help=('Specify a filter, which looks like "TestModule.TestClass.test_name".  '+
 | |
|             'You may also use shortened filters, such as '+
 | |
|             '"TestModule.TestClass", "TestClass.test_name", or just "test_name".'))
 | |
|     group.add_argument(
 | |
|         '-p',
 | |
|         metavar='pattern',
 | |
|         help='Specify a regexp filename pattern for inclusion in the test suite')
 | |
|     group.add_argument('--excluded', metavar='exclusion-file', action='append', help=textwrap.dedent(
 | |
|         '''Specify a file for tests to exclude. File should contain lists of regular expressions for test files or methods,
 | |
|                                 with each list under a matching header (xfail files, xfail methods, skip files, skip methods)'''))
 | |
|     group.add_argument(
 | |
|         '-G',
 | |
|         '--category',
 | |
|         metavar='category',
 | |
|         action='append',
 | |
|         dest='categories_list',
 | |
|         help=textwrap.dedent('''Specify categories of test cases of interest. Can be specified more than once.'''))
 | |
|     group.add_argument(
 | |
|         '--skip-category',
 | |
|         metavar='category',
 | |
|         action='append',
 | |
|         dest='skip_categories',
 | |
|         help=textwrap.dedent('''Specify categories of test cases to skip. Takes precedence over -G. Can be specified more than once.'''))
 | |
|     group.add_argument(
 | |
|         '--xfail-category',
 | |
|         metavar='category',
 | |
|         action='append',
 | |
|         dest='xfail_categories',
 | |
|         help=textwrap.dedent('''Specify categories of test cases that are expected to fail. Can be specified more than once.'''))
 | |
| 
 | |
|     # Configuration options
 | |
|     group = parser.add_argument_group('Configuration options')
 | |
|     group.add_argument(
 | |
|         '--framework',
 | |
|         metavar='framework-path',
 | |
|         help='The path to LLDB.framework')
 | |
|     group.add_argument(
 | |
|         '--executable',
 | |
|         metavar='executable-path',
 | |
|         help='The path to the lldb executable')
 | |
|     group.add_argument(
 | |
|         '--out-of-tree-debugserver',
 | |
|         dest='out_of_tree_debugserver',
 | |
|         action='store_true',
 | |
|         help='A flag to indicate an out-of-tree debug server is being used')
 | |
|     group.add_argument(
 | |
|         '--dwarf-version',
 | |
|         metavar='dwarf_version',
 | |
|         dest='dwarf_version',
 | |
|         type=int,
 | |
|         help='Override the DWARF version.')
 | |
|     group.add_argument(
 | |
|         '--setting',
 | |
|         metavar='SETTING=VALUE',
 | |
|         dest='settings',
 | |
|         type=str,
 | |
|         nargs=1,
 | |
|         action='append',
 | |
|         help='Run "setting set SETTING VALUE" before executing any test.')
 | |
|     group.add_argument(
 | |
|         '-y',
 | |
|         type=int,
 | |
|         metavar='count',
 | |
|         help="Specify the iteration count used to collect our benchmarks. An example is the number of times to do 'thread step-over' to measure stepping speed.")
 | |
|     group.add_argument(
 | |
|         '-#',
 | |
|         type=int,
 | |
|         metavar='sharp',
 | |
|         dest='sharp',
 | |
|         help='Repeat the test suite for a specified number of times')
 | |
|     group.add_argument('--channel', metavar='channel', dest='channels', action='append', help=textwrap.dedent(
 | |
|         "Specify the log channels (and optional categories) e.g. 'lldb all' or 'gdb-remote packets' if no categories are specified, 'default' is used"))
 | |
|     group.add_argument(
 | |
|         '--log-success',
 | |
|         dest='log_success',
 | |
|         action='store_true',
 | |
|         help="Leave logs/traces even for successful test runs (useful for creating reference log files during debugging.)")
 | |
|     group.add_argument(
 | |
|         '--codesign-identity',
 | |
|         metavar='Codesigning identity',
 | |
|         default='lldb_codesign',
 | |
|         help='The codesigning identity to use')
 | |
|     group.add_argument(
 | |
|         '--build-dir',
 | |
|         dest='test_build_dir',
 | |
|         metavar='Test build directory',
 | |
|         default='lldb-test-build.noindex',
 | |
|         help='The root build directory for the tests. It will be removed before running.')
 | |
|     group.add_argument(
 | |
|         '--lldb-module-cache-dir',
 | |
|         dest='lldb_module_cache_dir',
 | |
|         metavar='The clang module cache directory used by LLDB',
 | |
|         help='The clang module cache directory used by LLDB. Defaults to <test build directory>/module-cache-lldb.')
 | |
|     group.add_argument(
 | |
|         '--clang-module-cache-dir',
 | |
|         dest='clang_module_cache_dir',
 | |
|         metavar='The clang module cache directory used by Clang',
 | |
|         help='The clang module cache directory used in the Make files by Clang while building tests. Defaults to <test build directory>/module-cache-clang.')
 | |
|     group.add_argument(
 | |
|         '--lldb-libs-dir',
 | |
|         dest='lldb_libs_dir',
 | |
|         metavar='path',
 | |
|         help='The path to LLDB library directory (containing liblldb)')
 | |
|     group.add_argument(
 | |
|         '--enable-plugin',
 | |
|         dest='enabled_plugins',
 | |
|         action='append',
 | |
|         type=str,
 | |
|         metavar='A plugin whose tests will be enabled',
 | |
|         help='A plugin whose tests will be enabled. The only currently supported plugin is intel-pt.')
 | |
| 
 | |
|     # Configuration options
 | |
|     group = parser.add_argument_group('Remote platform options')
 | |
|     group.add_argument(
 | |
|         '--platform-name',
 | |
|         dest='lldb_platform_name',
 | |
|         metavar='platform-name',
 | |
|         help='The name of a remote platform to use')
 | |
|     group.add_argument(
 | |
|         '--platform-url',
 | |
|         dest='lldb_platform_url',
 | |
|         metavar='platform-url',
 | |
|         help='A LLDB platform URL to use when connecting to a remote platform to run the test suite')
 | |
|     group.add_argument(
 | |
|         '--platform-working-dir',
 | |
|         dest='lldb_platform_working_dir',
 | |
|         metavar='platform-working-dir',
 | |
|         help='The directory to use on the remote platform.')
 | |
| 
 | |
|     # Reproducer options
 | |
|     group = parser.add_argument_group('Reproducer options')
 | |
|     group.add_argument(
 | |
|         '--capture-path',
 | |
|         metavar='reproducer path',
 | |
|         help='The reproducer capture path')
 | |
|     group.add_argument(
 | |
|         '--replay-path',
 | |
|         metavar='reproducer path',
 | |
|         help='The reproducer replay path')
 | |
| 
 | |
|     # Test-suite behaviour
 | |
|     group = parser.add_argument_group('Runtime behaviour options')
 | |
|     X('-d', 'Suspend the process after launch to wait indefinitely for a debugger to attach')
 | |
|     X('-t', 'Turn on tracing of lldb command and other detailed test executions')
 | |
|     group.add_argument(
 | |
|         '-u',
 | |
|         dest='unset_env_varnames',
 | |
|         metavar='variable',
 | |
|         action='append',
 | |
|         help='Specify an environment variable to unset before running the test cases. e.g., -u DYLD_INSERT_LIBRARIES -u MallocScribble')
 | |
|     group.add_argument(
 | |
|         '--env',
 | |
|         dest='set_env_vars',
 | |
|         metavar='variable',
 | |
|         action='append',
 | |
|         help='Specify an environment variable to set to the given value before running the test cases e.g.: --env CXXFLAGS=-O3 --env DYLD_INSERT_LIBRARIES')
 | |
|     group.add_argument(
 | |
|         '--inferior-env',
 | |
|         dest='set_inferior_env_vars',
 | |
|         metavar='variable',
 | |
|         action='append',
 | |
|         help='Specify an environment variable to set to the given value for the inferior.')
 | |
|     X('-v', 'Do verbose mode of unittest framework (print out each test case invocation)')
 | |
|     group.add_argument(
 | |
|         '--enable-crash-dialog',
 | |
|         dest='disable_crash_dialog',
 | |
|         action='store_false',
 | |
|         help='(Windows only) When LLDB crashes, display the Windows crash dialog.')
 | |
|     group.set_defaults(disable_crash_dialog=True)
 | |
| 
 | |
|     # Remove the reference to our helper function
 | |
|     del X
 | |
| 
 | |
|     group = parser.add_argument_group('Test directories')
 | |
|     group.add_argument(
 | |
|         'args',
 | |
|         metavar='test-dir',
 | |
|         nargs='*',
 | |
|         help='Specify a list of directory names to search for test modules named after Test*.py (test discovery). If empty, search from the current working directory instead.')
 | |
| 
 | |
|     return parser
 |