[Lldb-commits] [lldb] r251277 - Port the python api decorator to use test categories

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Mon Oct 26 02:28:34 PDT 2015


Author: labath
Date: Mon Oct 26 04:28:32 2015
New Revision: 251277

URL: http://llvm.org/viewvc/llvm-project?rev=251277&view=rev
Log:
Port the python api decorator to use test categories

Summary:
Per discussions on the mailing list, I have implemented a decorator which annotates individual
test methods with categories. I have used this framework to replace the '-a' and '+a'
command-line switches (now '-G pyapi' and '--skip-category pyapi') and the @python_api_test
decorator (now @add_test_categories('pyapi')). The test suite now gives an error message
suggesting the new options if the user specifies the deprecated +/-a switches. If the general
direction is good, I will follow this up with other switches.

Reviewers: tberghammer, tfiala, granata.enrico, zturner

Subscribers: lldb-commits

Differential Revision: http://reviews.llvm.org/D14020

Added:
    lldb/trunk/test/test_categories.py
Modified:
    lldb/trunk/test/dotest.py
    lldb/trunk/test/dotest_args.py
    lldb/trunk/test/expression_command/test/TestExprs.py
    lldb/trunk/test/functionalities/breakpoint/breakpoint_command/TestBreakpointCommandsFromPython.py
    lldb/trunk/test/functionalities/breakpoint/breakpoint_conditions/TestBreakpointConditions.py
    lldb/trunk/test/functionalities/breakpoint/breakpoint_ignore_count/TestBreakpointIgnoreCount.py
    lldb/trunk/test/functionalities/breakpoint/cpp_exception/TestCPPExceptionBreakpoint.py
    lldb/trunk/test/functionalities/command_script/import/TestImport.py
    lldb/trunk/test/functionalities/command_script/import/rdar-12586188/TestRdar12586188.py
    lldb/trunk/test/functionalities/conditional_break/TestConditionalBreak.py
    lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/loop/TestDataFormatterLibcxxListLoop.py
    lldb/trunk/test/functionalities/dynamic_value_child_count/TestDynamicValueChildCount.py
    lldb/trunk/test/functionalities/inferior-assert/TestInferiorAssert.py
    lldb/trunk/test/functionalities/inferior-crashing/TestInferiorCrashing.py
    lldb/trunk/test/functionalities/inferior-crashing/recursive-inferior/TestRecursiveInferior.py
    lldb/trunk/test/functionalities/inline-stepping/TestInlineStepping.py
    lldb/trunk/test/functionalities/return-value/TestReturnValue.py
    lldb/trunk/test/functionalities/step-avoids-no-debug/TestStepNoDebug.py
    lldb/trunk/test/functionalities/thread/thread_specific_break/TestThreadSpecificBreakpoint.py
    lldb/trunk/test/functionalities/watchpoint/watchpoint_events/TestWatchpointEvents.py
    lldb/trunk/test/lang/c/array_types/TestArrayTypes.py
    lldb/trunk/test/lang/c/bitfields/TestBitfields.py
    lldb/trunk/test/lang/c/stepping/TestStepAndBreakpoints.py
    lldb/trunk/test/lang/cpp/class_static/TestStaticVariables.py
    lldb/trunk/test/lang/cpp/class_types/TestClassTypes.py
    lldb/trunk/test/lang/cpp/class_types/TestClassTypesDisassembly.py
    lldb/trunk/test/lang/cpp/dynamic-value/TestCppValueCast.py
    lldb/trunk/test/lang/cpp/dynamic-value/TestDynamicValue.py
    lldb/trunk/test/lang/cpp/stl/TestSTL.py
    lldb/trunk/test/lang/go/goroutines/TestGoroutines.py
    lldb/trunk/test/lang/go/types/TestGoASTContext.py
    lldb/trunk/test/lang/objc/blocks/TestObjCIvarsInBlocks.py
    lldb/trunk/test/lang/objc/foundation/TestObjCMethods.py
    lldb/trunk/test/lang/objc/foundation/TestObjectDescriptionAPI.py
    lldb/trunk/test/lang/objc/foundation/TestSymbolTable.py
    lldb/trunk/test/lang/objc/objc-baseclass-sbtype/TestObjCBaseClassSBType.py
    lldb/trunk/test/lang/objc/objc-builtin-types/TestObjCBuiltinTypes.py
    lldb/trunk/test/lang/objc/objc-checker/TestObjCCheckers.py
    lldb/trunk/test/lang/objc/objc-class-method/TestObjCClassMethod.py
    lldb/trunk/test/lang/objc/objc-dynamic-value/TestObjCDynamicValue.py
    lldb/trunk/test/lang/objc/objc-ivar-offsets/TestObjCIvarOffsets.py
    lldb/trunk/test/lang/objc/objc-ivar-stripped/TestObjCIvarStripped.py
    lldb/trunk/test/lang/objc/objc-property/TestObjCProperty.py
    lldb/trunk/test/lang/objc/objc-static-method-stripped/TestObjCStaticMethodStripped.py
    lldb/trunk/test/lang/objc/objc-static-method/TestObjCStaticMethod.py
    lldb/trunk/test/lang/objc/objc-stepping/TestObjCStepping.py
    lldb/trunk/test/lang/objc/objc-struct-argument/TestObjCStructArgument.py
    lldb/trunk/test/lang/objc/objc-struct-return/TestObjCStructReturn.py
    lldb/trunk/test/lang/objc/objc-super/TestObjCSuper.py
    lldb/trunk/test/lldbtest.py
    lldb/trunk/test/macosx/indirect_symbol/TestIndirectSymbols.py
    lldb/trunk/test/macosx/queues/TestQueues.py
    lldb/trunk/test/macosx/safe-to-func-call/TestSafeFuncCalls.py
    lldb/trunk/test/macosx/universal/TestUniversal.py
    lldb/trunk/test/python_api/breakpoint/TestBreakpointAPI.py
    lldb/trunk/test/python_api/class_members/TestSBTypeClassMembers.py
    lldb/trunk/test/python_api/debugger/TestDebuggerAPI.py
    lldb/trunk/test/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py
    lldb/trunk/test/python_api/disassemble-raw-data/TestDisassembleRawData.py
    lldb/trunk/test/python_api/disassemble-raw-data/TestDisassemble_VST1_64.py
    lldb/trunk/test/python_api/event/TestEvents.py
    lldb/trunk/test/python_api/findvalue_duplist/TestSBFrameFindValue.py
    lldb/trunk/test/python_api/formatters/TestFormattersSBAPI.py
    lldb/trunk/test/python_api/frame/TestFrames.py
    lldb/trunk/test/python_api/frame/inlines/TestInlinedFrame.py
    lldb/trunk/test/python_api/function_symbol/TestDisasmAPI.py
    lldb/trunk/test/python_api/function_symbol/TestSymbolAPI.py
    lldb/trunk/test/python_api/hello_world/TestHelloWorld.py
    lldb/trunk/test/python_api/interpreter/TestCommandInterpreterAPI.py
    lldb/trunk/test/python_api/lldbutil/frame/TestFrameUtils.py
    lldb/trunk/test/python_api/lldbutil/iter/TestLLDBIterator.py
    lldb/trunk/test/python_api/lldbutil/iter/TestRegistersIterator.py
    lldb/trunk/test/python_api/lldbutil/process/TestPrintStackTraces.py
    lldb/trunk/test/python_api/module_section/TestModuleAndSection.py
    lldb/trunk/test/python_api/objc_type/TestObjCType.py
    lldb/trunk/test/python_api/process/TestProcessAPI.py
    lldb/trunk/test/python_api/process/io/TestProcessIO.py
    lldb/trunk/test/python_api/sbdata/TestSBData.py
    lldb/trunk/test/python_api/sbvalue_persist/TestSBValuePersist.py
    lldb/trunk/test/python_api/section/TestSectionAPI.py
    lldb/trunk/test/python_api/signals/TestSignalsAPI.py
    lldb/trunk/test/python_api/symbol-context/TestSymbolContext.py
    lldb/trunk/test/python_api/target/TestTargetAPI.py
    lldb/trunk/test/python_api/thread/TestThreadAPI.py
    lldb/trunk/test/python_api/type/TestTypeList.py
    lldb/trunk/test/python_api/value/TestValueAPI.py
    lldb/trunk/test/python_api/value/change_values/TestChangeValueAPI.py
    lldb/trunk/test/python_api/value/linked_list/TestValueAPILinkedList.py
    lldb/trunk/test/python_api/value_var_update/TestValueVarUpdate.py
    lldb/trunk/test/python_api/watchpoint/TestSetWatchpoint.py
    lldb/trunk/test/python_api/watchpoint/TestWatchpointIgnoreCount.py
    lldb/trunk/test/python_api/watchpoint/TestWatchpointIter.py
    lldb/trunk/test/python_api/watchpoint/watchlocation/TestSetWatchlocation.py
    lldb/trunk/test/python_api/watchpoint/watchlocation/TestTargetWatchAddress.py
    lldb/trunk/test/source-manager/TestSourceManager.py

Modified: lldb/trunk/test/dotest.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/dotest.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/dotest.py (original)
+++ lldb/trunk/test/dotest.py Mon Oct 26 04:28:32 2015
@@ -41,6 +41,7 @@ from test_results import EventBuilder
 import inspect
 import unittest2
 import lldbtest_config
+import test_categories
 
 import six
 
@@ -80,33 +81,9 @@ class _WritelnDecorator(object):
 # Global variables:
 #
 
-# Dictionary of categories
-# When you define a new category for your testcases, be sure to add it here, or the test suite
-# will gladly complain as soon as you try to use it. This allows us to centralize which categories
-# exist, and to provide a description for each one
-validCategories = {
-'dataformatters':'Tests related to the type command and the data formatters subsystem',
-'expression':'Tests related to the expression parser',
-'objc':'Tests related to the Objective-C programming language support',
-'pyapi':'Tests related to the Python API',
-'basic_process': 'Basic process execution sniff tests.',
-'cmdline' : 'Tests related to the LLDB command-line interface',
-'dyntype' : 'Tests related to dynamic type support',
-'stresstest' : 'Tests related to stressing lldb limits',
-'flakey' : 'Flakey test cases, i.e. tests that do not reliably pass at each execution'
-}
-
 # The test suite.
 suite = unittest2.TestSuite()
 
-# By default, both command line and Python API tests are performed.
-# Use @python_api_test decorator, defined in lldbtest.py, to mark a test as
-# a Python API test.
-dont_do_python_api_test = False
-
-# By default, both command line and Python API tests are performed.
-just_do_python_api_test = False
-
 # By default, lldb-mi tests are performed if lldb-mi can be found.
 # Use @lldbmi_test decorator, defined in lldbtest.py, to mark a test as
 # a lldb-mi test.
@@ -389,35 +366,6 @@ o GDB_REMOTE_LOG: if defined, specifies
     sys.exit(0)
 
 
-def unique_string_match(yourentry,list):
-	candidate = None
-	for item in list:
-		if item.startswith(yourentry):
-			if candidate:
-				return None
-			candidate = item
-	return candidate
-
-def validate_categories(categories):
-    """For each category in categories, ensure that it's a valid category (or a prefix thereof).
-       If a category is invalid, print a message and quit.
-       If all categories are valid, return the list of categories. Prefixes are expanded in the
-       returned list.
-    """
-    global validCategories
-    result = []
-    for category in categories:
-        origCategory = category
-        if category not in validCategories:
-            category = unique_string_match(category, validCategories)
-        if (category not in validCategories) or category == None:
-            print("fatal error: category '" + origCategory + "' is not a valid category")
-            print("if you have added a new category, please edit dotest.py, adding your new category to validCategories")
-            print("else, please specify one or more of the following: " + str(list(validCategories.keys())))
-            sys.exit(1)
-        result.append(category)
-    return result
-
 def setCrashInfoHook_Mac(text):
     import crashinfo
     crashinfo.setCrashReporterDescription(text)
@@ -472,8 +420,6 @@ def parseOptionsAndInitTestdirs():
     '-h/--help as the first option prints out usage info and exit the program.
     """
 
-    global dont_do_python_api_test
-    global just_do_python_api_test
     global dont_do_lldbmi_test
     global just_do_lldbmi_test
     global just_do_benchmarks_test
@@ -592,13 +538,13 @@ def parseOptionsAndInitTestdirs():
         archs = [platform_machine]
 
     if args.categoriesList:
-        categoriesList = set(validate_categories(args.categoriesList))
+        categoriesList = set(test_categories.validate(args.categoriesList, False))
         useCategories = True
     else:
         categoriesList = []
 
     if args.skipCategories:
-        skipCategories = validate_categories(args.skipCategories)
+        skipCategories = test_categories.validate(args.skipCategories, False)
 
     if args.D:
         dumpSysPath = True
@@ -615,14 +561,10 @@ def parseOptionsAndInitTestdirs():
     elif args.N == 'dsym':
         dont_do_dsym_test = True
 
-    if args.a:
-        dont_do_python_api_test = True
-
-    if args.plus_a:
-        if dont_do_python_api_test:
-            print("Warning: -a and +a can't both be specified! Using only -a")
-        else:
-            just_do_python_api_test = True
+    if args.a or args.plus_a:
+        print("Options '-a' and '+a' have been deprecated. Please use the test category\n"
+              "functionality (-G pyapi, --skip-category pyapi) instead.")
+        sys.exit(1)
 
     if args.plus_b:
         just_do_benchmarks_test = True
@@ -785,10 +727,6 @@ def parseOptionsAndInitTestdirs():
     if do_help == True:
         usage(parser)
 
-    # Do not specify both '-a' and '+a' at the same time.
-    if dont_do_python_api_test and just_do_python_api_test:
-        usage(parser)
-
     # Do not specify both '-m' and '+m' at the same time.
     if dont_do_lldbmi_test and just_do_lldbmi_test:
         usage(parser)
@@ -1579,8 +1517,6 @@ if __name__ == "__main__":
     lldb.lldbtest_remote_shell_template = lldbtest_remote_shell_template
 
     # Put all these test decorators in the lldb namespace.
-    lldb.dont_do_python_api_test = dont_do_python_api_test
-    lldb.just_do_python_api_test = just_do_python_api_test
     lldb.dont_do_lldbmi_test = dont_do_lldbmi_test
     lldb.just_do_lldbmi_test = just_do_lldbmi_test
     lldb.just_do_benchmarks_test = just_do_benchmarks_test

Modified: lldb/trunk/test/dotest_args.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/dotest_args.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/dotest_args.py (original)
+++ lldb/trunk/test/dotest_args.py Mon Oct 26 04:28:32 2015
@@ -55,8 +55,6 @@ def create_parser():
     # Test filtering options
     group = parser.add_argument_group('Test filtering options')
     group.add_argument('-N', choices=['dwarf', 'dwo', 'dsym'], help="Don't do test cases marked with the @dsym_test/@dwarf_test/@dwo_test decorator by passing dsym/dwarf/dwo as the option arg")
-    X('-a', "Don't do lldb Python API tests")
-    X('+a', "Just do lldb Python API tests. Do not specify along with '-a'", dest='plus_a')
     X('+b', 'Just do benchmark tests', dest='plus_b')
     group.add_argument('-b', metavar='blacklist', help='Read a blacklist file specified after this option')
     group.add_argument('-f', metavar='filterspec', action='append', help='Specify a filter, which consists of the test class name, a dot, followed by the test method, to only admit such test into the test suite')  # FIXME: Example?
@@ -183,6 +181,13 @@ def create_parser():
     # Remove the reference to our helper function
     del X
 
+    D = lambda optstr, **kwargs: group.add_argument(optstr, action='store_true', **kwargs)
+    group = parser.add_argument_group('Deprecated options (do not use)')
+    # Deprecated on 23.10.2015. Remove completely after a grace period.
+    D('-a')
+    D('+a', dest='plus_a')
+    del D
+
     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.')
 

Modified: lldb/trunk/test/expression_command/test/TestExprs.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/expression_command/test/TestExprs.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/expression_command/test/TestExprs.py (original)
+++ lldb/trunk/test/expression_command/test/TestExprs.py Mon Oct 26 04:28:32 2015
@@ -98,7 +98,7 @@ class BasicExprCommandsTestCase(TestBase
                        "a.out"])
         # (const char *) $8 = 0x... "/Volumes/data/lldb/svn/trunk/test/expression_command/test/a.out"
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureAll("llvm.org/pr23139", oslist=["linux"], compiler="gcc", compiler_version=[">=","4.9"], archs=["i386"])
     @expectedFailureWindows # Test crashes
     def test_evaluate_expression_python(self):

Modified: lldb/trunk/test/functionalities/breakpoint/breakpoint_command/TestBreakpointCommandsFromPython.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/breakpoint/breakpoint_command/TestBreakpointCommandsFromPython.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/breakpoint/breakpoint_command/TestBreakpointCommandsFromPython.py (original)
+++ lldb/trunk/test/functionalities/breakpoint/breakpoint_command/TestBreakpointCommandsFromPython.py Mon Oct 26 04:28:32 2015
@@ -17,7 +17,7 @@ class PythonBreakpointCommandSettingTest
     mydir = TestBase.compute_mydir(__file__)
     my_var = 10
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_step_out_python(self):
         """Test stepping out using avoid-no-debug with dsyms."""
         self.build()

Modified: lldb/trunk/test/functionalities/breakpoint/breakpoint_conditions/TestBreakpointConditions.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/breakpoint/breakpoint_conditions/TestBreakpointConditions.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/breakpoint/breakpoint_conditions/TestBreakpointConditions.py (original)
+++ lldb/trunk/test/functionalities/breakpoint/breakpoint_conditions/TestBreakpointConditions.py Mon Oct 26 04:28:32 2015
@@ -28,7 +28,7 @@ class BreakpointConditionsTestCase(TestB
         self.breakpoint_conditions(inline=True)
 
     @skipIfWindows # Requires EE to support COFF on Windows (http://llvm.org/pr22232)
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_breakpoint_condition_and_python_api(self):
         """Use Python APIs to set breakpoint conditions."""
         self.build()

Modified: lldb/trunk/test/functionalities/breakpoint/breakpoint_ignore_count/TestBreakpointIgnoreCount.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/breakpoint/breakpoint_ignore_count/TestBreakpointIgnoreCount.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/breakpoint/breakpoint_ignore_count/TestBreakpointIgnoreCount.py (original)
+++ lldb/trunk/test/functionalities/breakpoint/breakpoint_ignore_count/TestBreakpointIgnoreCount.py Mon Oct 26 04:28:32 2015
@@ -20,7 +20,7 @@ class BreakpointIgnoreCountTestCase(Test
         self.build()
         self.breakpoint_ignore_count()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Use Python APIs to set breakpoint ignore count."""
         self.build()

Modified: lldb/trunk/test/functionalities/breakpoint/cpp_exception/TestCPPExceptionBreakpoint.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/breakpoint/cpp_exception/TestCPPExceptionBreakpoint.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/breakpoint/cpp_exception/TestCPPExceptionBreakpoint.py (original)
+++ lldb/trunk/test/functionalities/breakpoint/cpp_exception/TestCPPExceptionBreakpoint.py Mon Oct 26 04:28:32 2015
@@ -17,7 +17,7 @@ class TestCPPExceptionBreakpoint (TestBa
     mydir = TestBase.compute_mydir(__file__)
     my_var = 10
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureWindows("llvm.org/pr24538") # clang-cl does not support throw or catch
     def test_cpp_exception_breakpoint(self):
         """Test setting and hitting the C++ exception breakpoint."""

Modified: lldb/trunk/test/functionalities/command_script/import/TestImport.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/command_script/import/TestImport.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/command_script/import/TestImport.py (original)
+++ lldb/trunk/test/functionalities/command_script/import/TestImport.py Mon Oct 26 04:28:32 2015
@@ -12,7 +12,7 @@ class ImportTestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_import_command(self):
         """Import some Python scripts by path and test them"""

Modified: lldb/trunk/test/functionalities/command_script/import/rdar-12586188/TestRdar12586188.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/command_script/import/rdar-12586188/TestRdar12586188.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/command_script/import/rdar-12586188/TestRdar12586188.py (original)
+++ lldb/trunk/test/functionalities/command_script/import/rdar-12586188/TestRdar12586188.py Mon Oct 26 04:28:32 2015
@@ -12,7 +12,7 @@ class Rdar12586188TestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_rdar12586188_command(self):
         """Check that we handle an ImportError in a special way when command script importing files."""

Modified: lldb/trunk/test/functionalities/conditional_break/TestConditionalBreak.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/conditional_break/TestConditionalBreak.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/conditional_break/TestConditionalBreak.py (original)
+++ lldb/trunk/test/functionalities/conditional_break/TestConditionalBreak.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class ConditionalBreakTestCase(TestBase)
     mydir = TestBase.compute_mydir(__file__)
 
     @expectedFailureWindows("llvm.org/pr24778")
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python(self):
         """Exercise some thread and frame APIs to break if c() is called by a()."""
         self.build()

Modified: lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/loop/TestDataFormatterLibcxxListLoop.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/loop/TestDataFormatterLibcxxListLoop.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/loop/TestDataFormatterLibcxxListLoop.py (original)
+++ lldb/trunk/test/functionalities/data-formatter/data-formatter-stl/libcxx/list/loop/TestDataFormatterLibcxxListLoop.py Mon Oct 26 04:28:32 2015
@@ -18,6 +18,7 @@ class LibcxxListDataFormatterTestCase(Te
 
     @skipIfGcc
     @skipIfWindows # libc++ not ported to Windows yet
+    @add_test_categories(["pyapi"])
     def test_with_run_command(self):
         self.build()
         exe = os.path.join(os.getcwd(), "a.out")

Modified: lldb/trunk/test/functionalities/dynamic_value_child_count/TestDynamicValueChildCount.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/dynamic_value_child_count/TestDynamicValueChildCount.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/dynamic_value_child_count/TestDynamicValueChildCount.py (original)
+++ lldb/trunk/test/functionalities/dynamic_value_child_count/TestDynamicValueChildCount.py Mon Oct 26 04:28:32 2015
@@ -34,7 +34,7 @@ class DynamicValueChildCountTestCase(Tes
     @expectedFailureFreeBSD("llvm.org/pr19311") # continue at a breakpoint does not work
     @expectedFailureWindows("llvm.org/pr24663")
     @expectedFailurei386("to be figured out")
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_get_dynamic_vals(self):
         """Test fetching C++ dynamic values from pointers & references."""
         """Get argument vals for the call stack when stopped on a breakpoint."""

Modified: lldb/trunk/test/functionalities/inferior-assert/TestInferiorAssert.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/inferior-assert/TestInferiorAssert.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/inferior-assert/TestInferiorAssert.py (original)
+++ lldb/trunk/test/functionalities/inferior-assert/TestInferiorAssert.py Mon Oct 26 04:28:32 2015
@@ -33,7 +33,7 @@ class AssertingInferiorTestCase(TestBase
         self.build()
         self.inferior_asserting_disassemble()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureWindows("llvm.org/pr21793: need to implement support for detecting assertion / abort on Windows")
     def test_inferior_asserting_python(self):
         """Test that lldb reliably catches the inferior asserting (Python API)."""

Modified: lldb/trunk/test/functionalities/inferior-crashing/TestInferiorCrashing.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/inferior-crashing/TestInferiorCrashing.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/inferior-crashing/TestInferiorCrashing.py (original)
+++ lldb/trunk/test/functionalities/inferior-crashing/TestInferiorCrashing.py Mon Oct 26 04:28:32 2015
@@ -25,7 +25,7 @@ class CrashingInferiorTestCase(TestBase)
         self.build()
         self.inferior_crashing_registers()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureWindows("llvm.org/pr24778")
     def test_inferior_crashing_python(self):
         """Test that lldb reliably catches the inferior crashing (Python API)."""

Modified: lldb/trunk/test/functionalities/inferior-crashing/recursive-inferior/TestRecursiveInferior.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/inferior-crashing/recursive-inferior/TestRecursiveInferior.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/inferior-crashing/recursive-inferior/TestRecursiveInferior.py (original)
+++ lldb/trunk/test/functionalities/inferior-crashing/recursive-inferior/TestRecursiveInferior.py Mon Oct 26 04:28:32 2015
@@ -26,7 +26,7 @@ class CrashingRecursiveInferiorTestCase(
         self.build()
         self.recursive_inferior_crashing_registers()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureWindows("llvm.org/pr24778")
     def test_recursive_inferior_crashing_python(self):
         """Test that lldb reliably catches the inferior crashing (Python API)."""

Modified: lldb/trunk/test/functionalities/inline-stepping/TestInlineStepping.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/inline-stepping/TestInlineStepping.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/inline-stepping/TestInlineStepping.py (original)
+++ lldb/trunk/test/functionalities/inline-stepping/TestInlineStepping.py Mon Oct 26 04:28:32 2015
@@ -13,7 +13,7 @@ class TestInlineStepping(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureFreeBSD('llvm.org/pr17214')
     @expectedFailureIcc # Not really a bug.  ICC combines two inlined functions.
     @expectedFailureAll("llvm.org/pr23139", oslist=["linux"], compiler="gcc", compiler_version=[">=","4.9"], archs=["i386"])
@@ -25,14 +25,14 @@ class TestInlineStepping(TestBase):
         self.build()
         self.inline_stepping()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureAll("llvm.org/pr23139", oslist=["linux"], compiler="gcc", compiler_version=[">=","4.9"], archs=["i386"])
     def test_step_over_with_python_api(self):
         """Test stepping over and into inlined functions."""
         self.build()
         self.inline_stepping_step_over()
     
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_step_in_template_with_python_api(self):
         """Test stepping in to templated functions."""
         self.build()

Modified: lldb/trunk/test/functionalities/return-value/TestReturnValue.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/return-value/TestReturnValue.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/return-value/TestReturnValue.py (original)
+++ lldb/trunk/test/functionalities/return-value/TestReturnValue.py Mon Oct 26 04:28:32 2015
@@ -17,7 +17,7 @@ class ReturnValueTestCase(TestBase):
 
     @expectedFailurei386
     @expectedFailureWindows("llvm.org/pr24778")
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python(self):
         """Test getting return values from stepping out."""
         self.build()

Modified: lldb/trunk/test/functionalities/step-avoids-no-debug/TestStepNoDebug.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/step-avoids-no-debug/TestStepNoDebug.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/step-avoids-no-debug/TestStepNoDebug.py (original)
+++ lldb/trunk/test/functionalities/step-avoids-no-debug/TestStepNoDebug.py Mon Oct 26 04:28:32 2015
@@ -16,14 +16,14 @@ class ReturnValueTestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_step_out_with_python(self):
         """Test stepping out using avoid-no-debug with dsyms."""
         self.build()
         self.get_to_starting_point()
         self.do_step_out_past_nodebug()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureGcc("llvm.org/pr19247")
     def test_step_over_with_python(self):
         """Test stepping over using avoid-no-debug with dwarf."""
@@ -31,7 +31,7 @@ class ReturnValueTestCase(TestBase):
         self.get_to_starting_point()
         self.do_step_over_past_nodebug()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureGcc("llvm.org/pr19247")
     def test_step_in_with_python(self):
         """Test stepping in using avoid-no-debug with dwarf."""

Modified: lldb/trunk/test/functionalities/thread/thread_specific_break/TestThreadSpecificBreakpoint.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/thread/thread_specific_break/TestThreadSpecificBreakpoint.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/thread/thread_specific_break/TestThreadSpecificBreakpoint.py (original)
+++ lldb/trunk/test/functionalities/thread/thread_specific_break/TestThreadSpecificBreakpoint.py Mon Oct 26 04:28:32 2015
@@ -18,7 +18,7 @@ class ThreadSpecificBreakTestCase(TestBa
     @skipIfFreeBSD # test frequently times out or hangs
     @expectedFailureFreeBSD('llvm.org/pr18522') # hits break in another thread in testrun
     @expectedFailureWindows("llvm.org/pr24777")
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFlakeyLinux # this test fails 6/100 dosep runs
     def test_python(self):
         """Test that we obey thread conditioned breakpoints."""

Modified: lldb/trunk/test/functionalities/watchpoint/watchpoint_events/TestWatchpointEvents.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/watchpoint/watchpoint_events/TestWatchpointEvents.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/watchpoint/watchpoint_events/TestWatchpointEvents.py (original)
+++ lldb/trunk/test/functionalities/watchpoint/watchpoint_events/TestWatchpointEvents.py Mon Oct 26 04:28:32 2015
@@ -19,7 +19,7 @@ class TestWatchpointEvents (TestBase):
         # Find the line numbers that we will step to in main:
         self.main_source = "main.c"
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureAndroid(archs=['arm', 'aarch64']) # Watchpoints not supported
     @expectedFailureWindows("llvm.org/pr24446") # WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows
     def test_with_python_api(self):

Modified: lldb/trunk/test/lang/c/array_types/TestArrayTypes.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/c/array_types/TestArrayTypes.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/c/array_types/TestArrayTypes.py (original)
+++ lldb/trunk/test/lang/c/array_types/TestArrayTypes.py Mon Oct 26 04:28:32 2015
@@ -68,7 +68,7 @@ class ArrayTypesTestCase(TestBase):
         self.expect("frame variable --show-types long_6", VARIABLES_DISPLAYED_CORRECTLY,
             startstr = '(long [6])')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_and_python_api(self):
         """Use Python APIs to inspect variables with array types."""
         self.build()

Modified: lldb/trunk/test/lang/c/bitfields/TestBitfields.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/c/bitfields/TestBitfields.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/c/bitfields/TestBitfields.py (original)
+++ lldb/trunk/test/lang/c/bitfields/TestBitfields.py Mon Oct 26 04:28:32 2015
@@ -95,7 +95,7 @@ class BitfieldsTestCase(TestBase):
         self.expect("expr (more_bits.d)", VARIABLES_DISPLAYED_CORRECTLY,
             substrs = ['uint8_t', '\\0'])
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @skipIfWindows # BitFields exhibit crashes in record layout on Windows (http://llvm.org/pr21800)
     def test_and_python_api(self):
         """Use Python APIs to inspect a bitfields variable."""

Modified: lldb/trunk/test/lang/c/stepping/TestStepAndBreakpoints.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/c/stepping/TestStepAndBreakpoints.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/c/stepping/TestStepAndBreakpoints.py (original)
+++ lldb/trunk/test/lang/c/stepping/TestStepAndBreakpoints.py Mon Oct 26 04:28:32 2015
@@ -25,7 +25,7 @@ class TestCStepping(TestBase):
     @expectedFailureFreeBSD('llvm.org/pr17932')
     @expectedFailureLinux # llvm.org/pr14437
     @expectedFailureWindows("llvm.org/pr24777")
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_and_python_api(self):
         """Test stepping over vrs. hitting breakpoints & subsequent stepping in various forms."""
         self.build()

Modified: lldb/trunk/test/lang/cpp/class_static/TestStaticVariables.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/cpp/class_static/TestStaticVariables.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/cpp/class_static/TestStaticVariables.py (original)
+++ lldb/trunk/test/lang/cpp/class_static/TestStaticVariables.py Mon Oct 26 04:28:32 2015
@@ -52,7 +52,7 @@ class StaticVariableTestCase(TestBase):
     @expectedFailureClang('Clang emits incomplete debug info.')
     @expectedFailureFreeBSD('llvm.org/pr20550 failing on FreeBSD-11')
     @expectedFailureGcc('GCC emits incomplete debug info.')
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Test Python APIs on file and class static variables."""
         self.build()

Modified: lldb/trunk/test/lang/cpp/class_types/TestClassTypes.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/cpp/class_types/TestClassTypes.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/cpp/class_types/TestClassTypes.py (original)
+++ lldb/trunk/test/lang/cpp/class_types/TestClassTypes.py Mon Oct 26 04:28:32 2015
@@ -52,7 +52,7 @@ class ClassTypesTestCase(TestBase):
             substrs = ['C *',
                        ' this = '])
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Use Python APIs to create a breakpoint by (filespec, line)."""
         self.build()

Modified: lldb/trunk/test/lang/cpp/class_types/TestClassTypesDisassembly.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/cpp/class_types/TestClassTypesDisassembly.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/cpp/class_types/TestClassTypesDisassembly.py (original)
+++ lldb/trunk/test/lang/cpp/class_types/TestClassTypesDisassembly.py Mon Oct 26 04:28:32 2015
@@ -36,7 +36,7 @@ class IterateFrameAndDisassembleTestCase
                 #print("function:", function)
                 self.runCmd("disassemble -n '%s'" % function)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_and_python_api(self):
         """Disassemble each call frame when stopped on C's constructor."""
         self.build()

Modified: lldb/trunk/test/lang/cpp/dynamic-value/TestCppValueCast.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/cpp/dynamic-value/TestCppValueCast.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/cpp/dynamic-value/TestCppValueCast.py (original)
+++ lldb/trunk/test/lang/cpp/dynamic-value/TestCppValueCast.py Mon Oct 26 04:28:32 2015
@@ -17,14 +17,14 @@ class CppValueCastTestCase(TestBase):
     mydir = TestBase.compute_mydir(__file__)
 
     @unittest2.expectedFailure("rdar://problem/10808472 SBValue::Cast test case is failing (virtual inheritance)")
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_value_cast_with_virtual_inheritance(self):
         """Test SBValue::Cast(SBType) API for C++ types with virtual inheritance."""
         self.build(dictionary=self.d_virtual)
         self.setTearDownCleanup(dictionary=self.d_virtual)
         self.do_sbvalue_cast(self.exe_name)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_value_cast_with_regular_inheritance(self):
         """Test SBValue::Cast(SBType) API for C++ types with regular inheritance."""
         self.build(dictionary=self.d_regular)

Modified: lldb/trunk/test/lang/cpp/dynamic-value/TestDynamicValue.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/cpp/dynamic-value/TestDynamicValue.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/cpp/dynamic-value/TestDynamicValue.py (original)
+++ lldb/trunk/test/lang/cpp/dynamic-value/TestDynamicValue.py Mon Oct 26 04:28:32 2015
@@ -29,7 +29,7 @@ class DynamicValueTestCase(TestBase):
 
     @expectedFailureFreeBSD # FIXME: This needs to be root-caused.
     @expectedFailureWindows("llvm.org/pr24663")
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_get_dynamic_vals(self):
         """Test fetching C++ dynamic values from pointers & references."""
         self.build(dictionary=self.getBuildFlags())

Modified: lldb/trunk/test/lang/cpp/stl/TestSTL.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/cpp/stl/TestSTL.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/cpp/stl/TestSTL.py (original)
+++ lldb/trunk/test/lang/cpp/stl/TestSTL.py Mon Oct 26 04:28:32 2015
@@ -68,7 +68,7 @@ class STLTestCase(TestBase):
             substrs = [' = 2'])
 
     @expectedFailureIcc # icc 13.1 and 14-beta do not emit DW_TAG_template_type_parameter
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_SBType_template_aspects(self):
         """Test APIs for getting template arguments from an SBType."""
         self.build()

Modified: lldb/trunk/test/lang/go/goroutines/TestGoroutines.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/go/goroutines/TestGoroutines.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/go/goroutines/TestGoroutines.py (original)
+++ lldb/trunk/test/lang/go/goroutines/TestGoroutines.py Mon Oct 26 04:28:32 2015
@@ -13,7 +13,7 @@ class TestGoASTContext(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @skipIfFreeBSD # llvm.org/pr24895 triggers assertion failure
     @skipIfRemote # Not remote test suite ready
     @no_debug_info_test

Modified: lldb/trunk/test/lang/go/types/TestGoASTContext.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/go/types/TestGoASTContext.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/go/types/TestGoASTContext.py (original)
+++ lldb/trunk/test/lang/go/types/TestGoASTContext.py Mon Oct 26 04:28:32 2015
@@ -13,7 +13,7 @@ class TestGoASTContext(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @skipIfFreeBSD # llvm.org/pr24895 triggers assertion failure
     @skipIfRemote # Not remote test suit ready
     @no_debug_info_test

Modified: lldb/trunk/test/lang/objc/blocks/TestObjCIvarsInBlocks.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/blocks/TestObjCIvarsInBlocks.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/blocks/TestObjCIvarsInBlocks.py (original)
+++ lldb/trunk/test/lang/objc/blocks/TestObjCIvarsInBlocks.py Mon Oct 26 04:28:32 2015
@@ -22,7 +22,7 @@ class TestObjCIvarsInBlocks(TestBase):
         self.class_source_file_spec = lldb.SBFileSpec(self.class_source)
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailurei386 # This test requires the 2.0 runtime, so it will fail on i386.
     def test_with_python_api(self):
         """Test printing the ivars of the self when captured in blocks"""

Modified: lldb/trunk/test/lang/objc/foundation/TestObjCMethods.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/foundation/TestObjCMethods.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/foundation/TestObjCMethods.py (original)
+++ lldb/trunk/test/lang/objc/foundation/TestObjCMethods.py Mon Oct 26 04:28:32 2015
@@ -174,7 +174,7 @@ class FoundationTestCase(TestBase):
         self.expect("expression --object-description -- my", "Object description displayed correctly",
             patterns = ["Hello from.*a.out.*with timestamp: "])
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_print_ivars_correctly (self):
         self.build()
         # See: <rdar://problem/8717050> lldb needs to use the ObjC runtime symbols for ivar offsets

Modified: lldb/trunk/test/lang/objc/foundation/TestObjectDescriptionAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/foundation/TestObjectDescriptionAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/foundation/TestObjectDescriptionAPI.py (original)
+++ lldb/trunk/test/lang/objc/foundation/TestObjectDescriptionAPI.py Mon Oct 26 04:28:32 2015
@@ -24,7 +24,7 @@ class ObjectDescriptionAPITestCase(TestB
 
     # rdar://problem/10857337
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_find_global_variables_then_object_description(self):
         """Exercise SBTarget.FindGlobalVariables() API."""
         d = {'EXE': 'b.out'}

Modified: lldb/trunk/test/lang/objc/foundation/TestSymbolTable.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/foundation/TestSymbolTable.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/foundation/TestSymbolTable.py (original)
+++ lldb/trunk/test/lang/objc/foundation/TestSymbolTable.py Mon Oct 26 04:28:32 2015
@@ -27,7 +27,7 @@ class FoundationSymtabTestCase(TestBase)
                     'main'
                     ]
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Test symbol table access with Python APIs."""
         self.build()

Modified: lldb/trunk/test/lang/objc/objc-baseclass-sbtype/TestObjCBaseClassSBType.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-baseclass-sbtype/TestObjCBaseClassSBType.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-baseclass-sbtype/TestObjCBaseClassSBType.py (original)
+++ lldb/trunk/test/lang/objc/objc-baseclass-sbtype/TestObjCBaseClassSBType.py Mon Oct 26 04:28:32 2015
@@ -22,7 +22,7 @@ class ObjCDynamicValueTestCase(TestBase)
         self.line = line_number('main.m', '// Set breakpoint here.')
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_get_baseclass(self):
         """Test fetching ObjC dynamic values."""
         if self.getArchitecture() == 'i386':

Modified: lldb/trunk/test/lang/objc/objc-builtin-types/TestObjCBuiltinTypes.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-builtin-types/TestObjCBuiltinTypes.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-builtin-types/TestObjCBuiltinTypes.py (original)
+++ lldb/trunk/test/lang/objc/objc-builtin-types/TestObjCBuiltinTypes.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class TestObjCBuiltinTypes(TestBase):
         self.break_line = line_number(self.main_source, '// Set breakpoint here.')
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     #<rdar://problem/10591460> [regression] Can't print ivar value: error: reference to 'id' is ambiguous
     def test_with_python_api(self):
         """Test expression parser respect for ObjC built-in types."""

Modified: lldb/trunk/test/lang/objc/objc-checker/TestObjCCheckers.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-checker/TestObjCCheckers.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-checker/TestObjCCheckers.py (original)
+++ lldb/trunk/test/lang/objc/objc-checker/TestObjCCheckers.py Mon Oct 26 04:28:32 2015
@@ -23,7 +23,7 @@ class ObjCCheckerTestCase(TestBase):
         self.source_name = 'main.m'
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_objc_checker(self):
         """Test that checkers catch unrecognized selectors"""
         if self.getArchitecture() == 'i386':

Modified: lldb/trunk/test/lang/objc/objc-class-method/TestObjCClassMethod.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-class-method/TestObjCClassMethod.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-class-method/TestObjCClassMethod.py (original)
+++ lldb/trunk/test/lang/objc/objc-class-method/TestObjCClassMethod.py Mon Oct 26 04:28:32 2015
@@ -22,7 +22,7 @@ class TestObjCClassMethod(TestBase):
 
     @skipUnlessDarwin
     @expectedFailurei386
-    @python_api_test
+    @add_test_categories(['pyapi'])
     #rdar://problem/9745789 "expression" can't call functions in class methods
     def test_with_python_api(self):
         """Test calling functions in class methods."""

Modified: lldb/trunk/test/lang/objc/objc-dynamic-value/TestObjCDynamicValue.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-dynamic-value/TestObjCDynamicValue.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-dynamic-value/TestObjCDynamicValue.py (original)
+++ lldb/trunk/test/lang/objc/objc-dynamic-value/TestObjCDynamicValue.py Mon Oct 26 04:28:32 2015
@@ -29,7 +29,7 @@ class ObjCDynamicValueTestCase(TestBase)
                                                        '// Break here to see if we can step into real method.')
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureDarwin("llvm.org/pr20271 rdar://18684107")
     def test_get_objc_dynamic_vals(self):
         """Test fetching ObjC dynamic values."""

Modified: lldb/trunk/test/lang/objc/objc-ivar-offsets/TestObjCIvarOffsets.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-ivar-offsets/TestObjCIvarOffsets.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-ivar-offsets/TestObjCIvarOffsets.py (original)
+++ lldb/trunk/test/lang/objc/objc-ivar-offsets/TestObjCIvarOffsets.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class TestObjCIvarOffsets(TestBase):
         self.stop_line = line_number(self.main_source, '// Set breakpoint here.')
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Test printing ObjC objects that use unbacked properties"""
         self.build()

Modified: lldb/trunk/test/lang/objc/objc-ivar-stripped/TestObjCIvarStripped.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-ivar-stripped/TestObjCIvarStripped.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-ivar-stripped/TestObjCIvarStripped.py (original)
+++ lldb/trunk/test/lang/objc/objc-ivar-stripped/TestObjCIvarStripped.py Mon Oct 26 04:28:32 2015
@@ -23,7 +23,7 @@ class TestObjCIvarStripped(TestBase):
     @skipUnlessDarwin
     @skipIfDwarf    # This test requires a stripped binary and a dSYM
     @skipIfDWO      # This test requires a stripped binary and a dSYM
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Test that we can find stripped Objective-C ivars in the runtime"""
         self.build()

Modified: lldb/trunk/test/lang/objc/objc-property/TestObjCProperty.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-property/TestObjCProperty.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-property/TestObjCProperty.py (original)
+++ lldb/trunk/test/lang/objc/objc-property/TestObjCProperty.py Mon Oct 26 04:28:32 2015
@@ -23,7 +23,7 @@ class ObjCPropertyTestCase(TestBase):
         self.source_name = 'main.m'
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_objc_properties(self):
         """Test that expr uses the correct property getters and setters"""
         if self.getArchitecture() == 'i386':

Modified: lldb/trunk/test/lang/objc/objc-static-method-stripped/TestObjCStaticMethodStripped.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-static-method-stripped/TestObjCStaticMethodStripped.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-static-method-stripped/TestObjCStaticMethodStripped.py (original)
+++ lldb/trunk/test/lang/objc/objc-static-method-stripped/TestObjCStaticMethodStripped.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class TestObjCStaticMethodStripped(TestB
         self.break_line = line_number(self.main_source, '// Set breakpoint here.')
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @skipIfDwarf    # This test requires a stripped binary and a dSYM
     @skipIfDWO      # This test requires a stripped binary and a dSYM
     #<rdar://problem/12042992>

Modified: lldb/trunk/test/lang/objc/objc-static-method/TestObjCStaticMethod.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-static-method/TestObjCStaticMethod.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-static-method/TestObjCStaticMethod.py (original)
+++ lldb/trunk/test/lang/objc/objc-static-method/TestObjCStaticMethod.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class TestObjCStaticMethod(TestBase):
         self.break_line = line_number(self.main_source, '// Set breakpoint here.')
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     #<rdar://problem/9745789> "expression" can't call functions in class methods
     def test_with_python_api(self):
         """Test calling functions in static methods."""

Modified: lldb/trunk/test/lang/objc/objc-stepping/TestObjCStepping.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-stepping/TestObjCStepping.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-stepping/TestObjCStepping.py (original)
+++ lldb/trunk/test/lang/objc/objc-stepping/TestObjCStepping.py Mon Oct 26 04:28:32 2015
@@ -28,7 +28,7 @@ class TestObjCStepping(TestBase):
         self.stepped_past_nil_line = line_number (self.main_source, '// Step over nil should stop here.')
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Test stepping through ObjC method dispatch in various forms."""
         self.build()

Modified: lldb/trunk/test/lang/objc/objc-struct-argument/TestObjCStructArgument.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-struct-argument/TestObjCStructArgument.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-struct-argument/TestObjCStructArgument.py (original)
+++ lldb/trunk/test/lang/objc/objc-struct-argument/TestObjCStructArgument.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class TestObjCStructArgument(TestBase):
         self.break_line = line_number(self.main_source, '// Set breakpoint here.')
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Test passing structs to Objective-C methods."""
         self.build()

Modified: lldb/trunk/test/lang/objc/objc-struct-return/TestObjCStructReturn.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-struct-return/TestObjCStructReturn.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-struct-return/TestObjCStructReturn.py (original)
+++ lldb/trunk/test/lang/objc/objc-struct-return/TestObjCStructReturn.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class TestObjCClassMethod(TestBase):
         self.break_line = line_number(self.main_source, '// Set breakpoint here.')
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Test calling functions in class methods."""
         self.build()

Modified: lldb/trunk/test/lang/objc/objc-super/TestObjCSuper.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lang/objc/objc-super/TestObjCSuper.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lang/objc/objc-super/TestObjCSuper.py (original)
+++ lldb/trunk/test/lang/objc/objc-super/TestObjCSuper.py Mon Oct 26 04:28:32 2015
@@ -22,7 +22,7 @@ class TestObjCSuperMethod(TestBase):
 
     @skipUnlessDarwin
     @expectedFailurei386
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Test calling methods on super."""
         self.build()

Modified: lldb/trunk/test/lldbtest.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lldbtest.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/lldbtest.py (original)
+++ lldb/trunk/test/lldbtest.py Mon Oct 26 04:28:32 2015
@@ -49,6 +49,7 @@ import unittest2
 import lldb
 import lldbtest_config
 import lldbutil
+import test_categories
 
 from six import add_metaclass
 from six import StringIO as SixStringIO
@@ -469,21 +470,14 @@ def android_device_api():
 #
 # Decorators for categorizing test cases.
 #
-
 from functools import wraps
-def python_api_test(func):
-    """Decorate the item as a Python API only test."""
-    if isinstance(func, type) and issubclass(func, unittest2.TestCase):
-        raise Exception("@python_api_test can only be used to decorate a test method")
-    @wraps(func)
-    def wrapper(self, *args, **kwargs):
-        if lldb.dont_do_python_api_test:
-            self.skipTest("python api tests")
-        return func(self, *args, **kwargs)
-
-    # Mark this function as such to separate them from lldb command line tests.
-    wrapper.__python_api_test__ = True
-    return wrapper
+def add_test_categories(cat):
+    """Decorate an item with test categories"""
+    cat = test_categories.validate(cat, True)
+    def impl(func):
+        func.getCategories = lambda test: cat
+        return func
+    return impl
 
 def lldbmi_test(func):
     """Decorate the item as a lldb-mi only test."""
@@ -1388,19 +1382,6 @@ class Base(unittest2.TestCase):
         # used for all the test cases.
         self.testMethodName = self._testMethodName
 
-        # Python API only test is decorated with @python_api_test,
-        # which also sets the "__python_api_test__" attribute of the
-        # function object to True.
-        try:
-            if lldb.just_do_python_api_test:
-                testMethod = getattr(self, self._testMethodName)
-                if getattr(testMethod, "__python_api_test__", False):
-                    pass
-                else:
-                    self.skipTest("non python api test")
-        except AttributeError:
-            pass
-
         # lldb-mi only test is decorated with @lldbmi_test,
         # which also sets the "__lldbmi_test__" attribute of the
         # function object to True.
@@ -2252,6 +2233,7 @@ class LLDBTestCaseFactory(type):
         for attrname, attrvalue in attrs.items():
             if attrname.startswith("test") and not getattr(attrvalue, "__no_debug_info_test__", False):
                 @dsym_test
+                @wraps(attrvalue)
                 def dsym_test_method(self, attrvalue=attrvalue):
                     self.debug_info = "dsym"
                     return attrvalue(self)
@@ -2260,6 +2242,7 @@ class LLDBTestCaseFactory(type):
                 newattrs[dsym_method_name] = dsym_test_method
 
                 @dwarf_test
+                @wraps(attrvalue)
                 def dwarf_test_method(self, attrvalue=attrvalue):
                     self.debug_info = "dwarf"
                     return attrvalue(self)
@@ -2268,6 +2251,7 @@ class LLDBTestCaseFactory(type):
                 newattrs[dwarf_method_name] = dwarf_test_method
                 
                 @dwo_test
+                @wraps(attrvalue)
                 def dwo_test_method(self, attrvalue=attrvalue):
                     self.debug_info = "dwo"
                     return attrvalue(self)

Modified: lldb/trunk/test/macosx/indirect_symbol/TestIndirectSymbols.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/macosx/indirect_symbol/TestIndirectSymbols.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/macosx/indirect_symbol/TestIndirectSymbols.py (original)
+++ lldb/trunk/test/macosx/indirect_symbol/TestIndirectSymbols.py Mon Oct 26 04:28:32 2015
@@ -20,7 +20,7 @@ class TestIndirectFunctions(TestBase):
         self.main_source = "main.c"
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Test stepping and setting breakpoints in indirect and re-exported symbols."""
         self.build()

Modified: lldb/trunk/test/macosx/queues/TestQueues.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/macosx/queues/TestQueues.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/macosx/queues/TestQueues.py (original)
+++ lldb/trunk/test/macosx/queues/TestQueues.py Mon Oct 26 04:28:32 2015
@@ -15,7 +15,7 @@ class TestQueues(TestBase):
     mydir = TestBase.compute_mydir(__file__)
 
     @skipUnlessDarwin
-    @python_api_test      
+    @add_test_categories(['pyapi'])      
     @unittest2.expectedFailure("rdar://22531180")
     def test_with_python_api(self):
         """Test queues inspection SB APIs."""

Modified: lldb/trunk/test/macosx/safe-to-func-call/TestSafeFuncCalls.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/macosx/safe-to-func-call/TestSafeFuncCalls.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/macosx/safe-to-func-call/TestSafeFuncCalls.py (original)
+++ lldb/trunk/test/macosx/safe-to-func-call/TestSafeFuncCalls.py Mon Oct 26 04:28:32 2015
@@ -20,7 +20,7 @@ class TestSafeFuncCalls(TestBase):
         self.main_source = "main.c"
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_python_api(self):
         """Test function call thread safety."""
         self.build()

Modified: lldb/trunk/test/macosx/universal/TestUniversal.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/macosx/universal/TestUniversal.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/macosx/universal/TestUniversal.py (original)
+++ lldb/trunk/test/macosx/universal/TestUniversal.py Mon Oct 26 04:28:32 2015
@@ -20,7 +20,7 @@ class UniversalTestCase(TestBase):
         # Find the line number to break inside main().
         self.line = line_number('main.c', '// Set break point at this line.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @skipUnlessDarwin
     @unittest2.skipUnless(hasattr(os, "uname") and os.uname()[4] in ['i386', 'x86_64'],
             "requires i386 or x86_64")

Modified: lldb/trunk/test/python_api/breakpoint/TestBreakpointAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/breakpoint/TestBreakpointAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/breakpoint/TestBreakpointAPI.py (original)
+++ lldb/trunk/test/python_api/breakpoint/TestBreakpointAPI.py Mon Oct 26 04:28:32 2015
@@ -15,7 +15,7 @@ class BreakpointAPITestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_breakpoint_is_valid(self):
         """Make sure that if an SBBreakpoint gets deleted its IsValid returns false."""
         self.build()

Modified: lldb/trunk/test/python_api/class_members/TestSBTypeClassMembers.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/class_members/TestSBTypeClassMembers.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/class_members/TestSBTypeClassMembers.py (original)
+++ lldb/trunk/test/python_api/class_members/TestSBTypeClassMembers.py Mon Oct 26 04:28:32 2015
@@ -25,7 +25,7 @@ class SBTypeMemberFunctionsTest(TestBase
         self.line = line_number(self.source, '// set breakpoint here')
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test(self):
         """Test SBType APIs to fetch member function types."""
         d = {'EXE': self.exe_name}

Modified: lldb/trunk/test/python_api/debugger/TestDebuggerAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/debugger/TestDebuggerAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/debugger/TestDebuggerAPI.py (original)
+++ lldb/trunk/test/python_api/debugger/TestDebuggerAPI.py Mon Oct 26 04:28:32 2015
@@ -11,7 +11,7 @@ class DebuggerAPITestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_debugger_api_boundary_condition(self):
         """Exercise SBDebugger APIs with boundary conditions."""
@@ -32,7 +32,7 @@ class DebuggerAPITestCase(TestBase):
         self.dbg.SetCurrentPlatform(None)
         self.dbg.SetCurrentPlatformSDKRoot(None)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_debugger_delete_invalid_target(self):
         """SBDebugger.DeleteTarget() should not crash LLDB given and invalid target."""
         target = lldb.SBTarget()

Modified: lldb/trunk/test/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py (original)
+++ lldb/trunk/test/python_api/default-constructor/TestDefaultConstructorForAPIObjects.py Mon Oct 26 04:28:32 2015
@@ -24,7 +24,7 @@ class APIDefaultConstructorTestCase(Test
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBAddress(self):
         obj = lldb.SBAddress()
@@ -35,7 +35,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_address
         sb_address.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBBlock(self):
         obj = lldb.SBBlock()
@@ -46,7 +46,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_block
         sb_block.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBBreakpoint(self):
         obj = lldb.SBBreakpoint()
@@ -57,7 +57,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_breakpoint
         sb_breakpoint.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBBreakpointLocation(self):
         obj = lldb.SBBreakpointLocation()
@@ -68,7 +68,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_breakpointlocation
         sb_breakpointlocation.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBBroadcaster(self):
         obj = lldb.SBBroadcaster()
@@ -79,7 +79,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_broadcaster
         sb_broadcaster.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBCommandReturnObject(self):
         """SBCommandReturnObject object is valid after default construction."""
@@ -88,7 +88,7 @@ class APIDefaultConstructorTestCase(Test
             print(obj)
         self.assertTrue(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBCommunication(self):
         obj = lldb.SBCommunication()
@@ -99,7 +99,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_communication
         sb_communication.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBCompileUnit(self):
         obj = lldb.SBCompileUnit()
@@ -110,7 +110,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_compileunit
         sb_compileunit.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBDebugger(self):
         obj = lldb.SBDebugger()
@@ -121,7 +121,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_debugger
         sb_debugger.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     # darwin: This test passes with swig 3.0.2, fails w/3.0.5 other tests fail with 2.0.12 http://llvm.org/pr23488
     def test_SBError(self):
@@ -133,7 +133,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_error
         sb_error.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBEvent(self):
         obj = lldb.SBEvent()
@@ -146,7 +146,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_event
         sb_event.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_SBFileSpec(self):
         obj = lldb.SBFileSpec()
         # This is just to test that FileSpec(None) does not crash.
@@ -158,7 +158,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_filespec
         sb_filespec.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBFrame(self):
         obj = lldb.SBFrame()
@@ -169,7 +169,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_frame
         sb_frame.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBFunction(self):
         obj = lldb.SBFunction()
@@ -180,7 +180,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_function
         sb_function.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBInstruction(self):
         obj = lldb.SBInstruction()
@@ -191,7 +191,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_instruction
         sb_instruction.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBInstructionList(self):
         obj = lldb.SBInstructionList()
@@ -202,7 +202,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_instructionlist
         sb_instructionlist.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBLineEntry(self):
         obj = lldb.SBLineEntry()
@@ -213,7 +213,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_lineentry
         sb_lineentry.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBListener(self):
         obj = lldb.SBListener()
@@ -224,7 +224,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_listener
         sb_listener.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBModule(self):
         obj = lldb.SBModule()
@@ -235,7 +235,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_module
         sb_module.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBProcess(self):
         obj = lldb.SBProcess()
@@ -246,7 +246,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_process
         sb_process.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBSection(self):
         obj = lldb.SBSection()
@@ -257,7 +257,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_section
         sb_section.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBStream(self):
         """SBStream object is valid after default construction."""
@@ -266,7 +266,7 @@ class APIDefaultConstructorTestCase(Test
             print(obj)
         self.assertTrue(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBStringList(self):
         obj = lldb.SBStringList()
@@ -277,7 +277,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_stringlist
         sb_stringlist.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBSymbol(self):
         obj = lldb.SBSymbol()
@@ -288,7 +288,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_symbol
         sb_symbol.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBSymbolContext(self):
         obj = lldb.SBSymbolContext()
@@ -299,7 +299,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_symbolcontext
         sb_symbolcontext.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBSymbolContextList(self):
         """SBSymbolContextList object is valid after default construction."""
@@ -308,7 +308,7 @@ class APIDefaultConstructorTestCase(Test
             print(obj)
         self.assertTrue(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBTarget(self):
         obj = lldb.SBTarget()
@@ -319,7 +319,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_target
         sb_target.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBThread(self):
         obj = lldb.SBThread()
@@ -330,7 +330,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_thread
         sb_thread.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBType(self):
         try:
@@ -349,7 +349,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_type
         sb_type.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBTypeList(self):
         """SBTypeList object is valid after default construction."""
@@ -358,7 +358,7 @@ class APIDefaultConstructorTestCase(Test
             print(obj)
         self.assertTrue(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBValue(self):
         obj = lldb.SBValue()
@@ -369,7 +369,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_value
         sb_value.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBValueList(self):
         obj = lldb.SBValueList()
@@ -380,7 +380,7 @@ class APIDefaultConstructorTestCase(Test
         import sb_valuelist
         sb_valuelist.fuzz_obj(obj)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_SBWatchpoint(self):
         obj = lldb.SBWatchpoint()

Modified: lldb/trunk/test/python_api/disassemble-raw-data/TestDisassembleRawData.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/disassemble-raw-data/TestDisassembleRawData.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/disassemble-raw-data/TestDisassembleRawData.py (original)
+++ lldb/trunk/test/python_api/disassemble-raw-data/TestDisassembleRawData.py Mon Oct 26 04:28:32 2015
@@ -15,7 +15,7 @@ class DisassembleRawDataTestCase(TestBas
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_disassemble_raw_data(self):
         """Test disassembling raw bytes with the API."""

Modified: lldb/trunk/test/python_api/disassemble-raw-data/TestDisassemble_VST1_64.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/disassemble-raw-data/TestDisassemble_VST1_64.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/disassemble-raw-data/TestDisassemble_VST1_64.py (original)
+++ lldb/trunk/test/python_api/disassemble-raw-data/TestDisassemble_VST1_64.py Mon Oct 26 04:28:32 2015
@@ -16,7 +16,7 @@ class Disassemble_VST1_64(TestBase):
     mydir = TestBase.compute_mydir(__file__)
 
     @skipIf(True) # llvm.org/pr24575: all tests get ERRORs in dotest.py after this
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @no_debug_info_test
     def test_disassemble_invalid_vst_1_64_raw_data(self):
         """Test disassembling invalid vst1.64 raw bytes with the API."""

Modified: lldb/trunk/test/python_api/event/TestEvents.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/event/TestEvents.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/event/TestEvents.py (original)
+++ lldb/trunk/test/python_api/event/TestEvents.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class EventAPITestCase(TestBase):
         # Find the line number to of function 'c'.
         self.line = line_number('main.c', '// Find the line number of function "c" here.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureLinux("llvm.org/pr23730") # Flaky, fails ~1/10 cases
     @skipIfLinux # skip to avoid crashes
     def test_listen_for_and_print_event(self):
@@ -100,7 +100,7 @@ class EventAPITestCase(TestBase):
         # Wait until the 'MyListeningThread' terminates.
         my_thread.join()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_wait_for_event(self):
         """Exercise SBListener.WaitForEvent() API."""
         self.build()
@@ -172,7 +172,7 @@ class EventAPITestCase(TestBase):
                         "My listening thread successfully received an event")
 
     @skipIfFreeBSD # llvm.org/pr21325
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFlakeyLinux("llvm.org/pr23617")  # Flaky, fails ~1/10 cases
     @expectedFailureWindows("llvm.org/pr24778")
     def test_add_listener_to_broadcaster(self):

Modified: lldb/trunk/test/python_api/findvalue_duplist/TestSBFrameFindValue.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/findvalue_duplist/TestSBFrameFindValue.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/findvalue_duplist/TestSBFrameFindValue.py (original)
+++ lldb/trunk/test/python_api/findvalue_duplist/TestSBFrameFindValue.py Mon Oct 26 04:28:32 2015
@@ -13,7 +13,7 @@ class SBFrameFindValueTestCase(TestBase)
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_formatters_api(self):
         """Test that SBFrame::FindValue finds things but does not duplicate the entire variables list"""
         self.build()

Modified: lldb/trunk/test/python_api/formatters/TestFormattersSBAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/formatters/TestFormattersSBAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/formatters/TestFormattersSBAPI.py (original)
+++ lldb/trunk/test/python_api/formatters/TestFormattersSBAPI.py Mon Oct 26 04:28:32 2015
@@ -18,7 +18,7 @@ class SBFormattersAPITestCase(TestBase):
         TestBase.setUp(self)
         self.line = line_number('main.cpp', '// Set break point at this line.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_formatters_api(self):
         """Test Python APIs for working with formatters"""
         self.build()
@@ -291,7 +291,7 @@ class SBFormattersAPITestCase(TestBase):
         self.expect("frame variable e2", substrs=["I am an empty Empty2"])
         self.expect("frame variable e2", substrs=["I am an empty Empty2 {}"], matching=False)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_force_synth_off(self):
         """Test that one can have the public API return non-synthetic SBValues if desired"""
         self.build(dictionary={'EXE':'no_synth'})

Modified: lldb/trunk/test/python_api/frame/TestFrames.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/frame/TestFrames.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/frame/TestFrames.py (original)
+++ lldb/trunk/test/python_api/frame/TestFrames.py Mon Oct 26 04:28:32 2015
@@ -16,7 +16,7 @@ class FrameAPITestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureWindows("llvm.org/pr24778")
     def test_get_arg_vals_for_call_stack(self):
         """Exercise SBFrame.GetVariables() API to get argument vals."""
@@ -106,7 +106,7 @@ class FrameAPITestCase(TestBase):
             substrs = ["a((int)val=1, (char)ch='A')",
                        "a((int)val=3, (char)ch='A')"])
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_frame_api_boundary_condition(self):
         """Exercise SBFrame APIs with boundary condition inputs."""
         self.build()
@@ -145,7 +145,7 @@ class FrameAPITestCase(TestBase):
 
         frame.EvaluateExpression(None)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_frame_api_IsEqual(self):
         """Exercise SBFrame API IsEqual."""
         self.build()

Modified: lldb/trunk/test/python_api/frame/inlines/TestInlinedFrame.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/frame/inlines/TestInlinedFrame.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/frame/inlines/TestInlinedFrame.py (original)
+++ lldb/trunk/test/python_api/frame/inlines/TestInlinedFrame.py Mon Oct 26 04:28:32 2015
@@ -23,7 +23,7 @@ class InlinedFrameAPITestCase(TestBase):
         self.first_stop = line_number(self.source, '// This should correspond to the first break stop.')
         self.second_stop = line_number(self.source, '// This should correspond to the second break stop.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_stop_at_outer_inline(self):
         """Exercise SBFrame.IsInlined() and SBFrame.GetFunctionName()."""
         self.build()

Modified: lldb/trunk/test/python_api/function_symbol/TestDisasmAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/function_symbol/TestDisasmAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/function_symbol/TestDisasmAPI.py (original)
+++ lldb/trunk/test/python_api/function_symbol/TestDisasmAPI.py Mon Oct 26 04:28:32 2015
@@ -22,7 +22,7 @@ class DisasmAPITestCase(TestBase):
         self.line1 = line_number('main.c', '// Find the line number for breakpoint 1 here.')
         self.line2 = line_number('main.c', '// Find the line number for breakpoint 2 here.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test(self):
         """Exercise getting SBAddress objects, disassembly, and SBAddress APIs."""
         self.build()

Modified: lldb/trunk/test/python_api/function_symbol/TestSymbolAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/function_symbol/TestSymbolAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/function_symbol/TestSymbolAPI.py (original)
+++ lldb/trunk/test/python_api/function_symbol/TestSymbolAPI.py Mon Oct 26 04:28:32 2015
@@ -22,7 +22,7 @@ class SymbolAPITestCase(TestBase):
         self.line1 = line_number('main.c', '// Find the line number for breakpoint 1 here.')
         self.line2 = line_number('main.c', '// Find the line number for breakpoint 2 here.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureWindows("llvm.org/pr24778")
     def test(self):
         """Exercise some SBSymbol and SBAddress APIs."""

Modified: lldb/trunk/test/python_api/hello_world/TestHelloWorld.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/hello_world/TestHelloWorld.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/hello_world/TestHelloWorld.py (original)
+++ lldb/trunk/test/python_api/hello_world/TestHelloWorld.py Mon Oct 26 04:28:32 2015
@@ -29,7 +29,7 @@ class HelloWorldTestCase(TestBase):
         # Call super's tearDown().
         TestBase.tearDown(self)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_process_launch_api(self):
         """Create target, breakpoint, launch a process, and then kill it."""
         self.build(dictionary=self.d)
@@ -72,7 +72,7 @@ class HelloWorldTestCase(TestBase):
         # The breakpoint should have a hit count of 1.
         self.assertTrue(breakpoint.GetHitCount() == 1, BREAKPOINT_HIT_ONCE)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailurei386 # llvm.org/pr17384: lldb needs to be aware of linux-vdso.so to unwind stacks properly
     @expectedFailureWindows("llvm.org/pr24600")
     def test_with_attach_to_process_with_id_api(self):
@@ -101,7 +101,7 @@ class HelloWorldTestCase(TestBase):
             substrs = ['main.c:%d' % self.line2,
                        '(int)argc=3'])
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailurei386 # llvm.org/pr17384: lldb needs to be aware of linux-vdso.so to unwind stacks properly
     @expectedFailureWindows("llvm.org/pr24600")
     def test_with_attach_to_process_with_name_api(self):

Modified: lldb/trunk/test/python_api/interpreter/TestCommandInterpreterAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/interpreter/TestCommandInterpreterAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/interpreter/TestCommandInterpreterAPI.py (original)
+++ lldb/trunk/test/python_api/interpreter/TestCommandInterpreterAPI.py Mon Oct 26 04:28:32 2015
@@ -18,7 +18,7 @@ class CommandInterpreterAPICase(TestBase
         # Find the line number to break on inside main.cpp.
         self.line = line_number('main.c', 'Hello world.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_process_launch_api(self):
         """Test the SBCommandInterpreter APIs."""
         self.build()

Modified: lldb/trunk/test/python_api/lldbutil/frame/TestFrameUtils.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/lldbutil/frame/TestFrameUtils.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/lldbutil/frame/TestFrameUtils.py (original)
+++ lldb/trunk/test/python_api/lldbutil/frame/TestFrameUtils.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class FrameUtilsTestCase(TestBase):
         self.line = line_number('main.c',
                                 "// Find the line number here.")
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_frame_utils(self):
         """Test utility functions for the frame object."""
         self.build()

Modified: lldb/trunk/test/python_api/lldbutil/iter/TestLLDBIterator.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/lldbutil/iter/TestLLDBIterator.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/lldbutil/iter/TestLLDBIterator.py (original)
+++ lldb/trunk/test/python_api/lldbutil/iter/TestLLDBIterator.py Mon Oct 26 04:28:32 2015
@@ -22,7 +22,7 @@ class LLDBIteratorTestCase(TestBase):
         self.line1 = line_number('main.cpp', '// Set break point at this line.')
         self.line2 = line_number('main.cpp', '// And that line.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_lldb_iter_module(self):
         """Test module_iter works correctly for SBTarget -> SBModule."""
         self.build()
@@ -56,7 +56,7 @@ class LLDBIteratorTestCase(TestBase):
             self.assertTrue(yours[i] == mine[i],
                             "UUID+FileSpec of yours[{0}] and mine[{0}] matches".format(i))
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_lldb_iter_breakpoint(self):
         """Test breakpoint_iter works correctly for SBTarget -> SBBreakpoint."""
         self.build()
@@ -88,7 +88,7 @@ class LLDBIteratorTestCase(TestBase):
             self.assertTrue(yours[i] == mine[i],
                             "ID of yours[{0}] and mine[{0}] matches".format(i))
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_lldb_iter_frame(self):
         """Test iterator works correctly for SBProcess->SBThread->SBFrame."""
         self.build()

Modified: lldb/trunk/test/python_api/lldbutil/iter/TestRegistersIterator.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/lldbutil/iter/TestRegistersIterator.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/lldbutil/iter/TestRegistersIterator.py (original)
+++ lldb/trunk/test/python_api/lldbutil/iter/TestRegistersIterator.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class RegistersIteratorTestCase(TestBase
         # Find the line number to break inside main().
         self.line1 = line_number('main.cpp', '// Set break point at this line.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureWindows # Test crashes
     def test_iter_registers(self):
         """Test iterator works correctly for lldbutil.iter_registers()."""

Modified: lldb/trunk/test/python_api/lldbutil/process/TestPrintStackTraces.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/lldbutil/process/TestPrintStackTraces.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/lldbutil/process/TestPrintStackTraces.py (original)
+++ lldb/trunk/test/python_api/lldbutil/process/TestPrintStackTraces.py Mon Oct 26 04:28:32 2015
@@ -23,7 +23,7 @@ class ThreadsStackTracesTestCase(TestBas
 
     @expectedFailureAll("llvm.org/pr23043", ["linux"], archs=["i386"]) # We are unable to produce a backtrace of the main thread when the thread is blocked in fgets
     @expectedFailureWindows("llvm.org/pr24778")
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_stack_traces(self):
         """Test SBprocess and SBThread APIs with printing of the stack traces."""
         self.build()

Modified: lldb/trunk/test/python_api/module_section/TestModuleAndSection.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/module_section/TestModuleAndSection.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/module_section/TestModuleAndSection.py (original)
+++ lldb/trunk/test/python_api/module_section/TestModuleAndSection.py Mon Oct 26 04:28:32 2015
@@ -16,7 +16,7 @@ class ModuleAndSectionAPIsTestCase(TestB
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_module_and_section(self):
         """Test module and section APIs."""
         self.build()
@@ -56,7 +56,7 @@ class ModuleAndSectionAPIsTestCase(TestB
                         print(INDENT2 + str(sym))
                         print(INDENT2 + "symbol type: %s" % symbol_type_to_str(sym.GetType()))
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_module_and_section_boundary_condition(self):
         """Test module and section APIs by passing None when it expects a Python string."""
         self.build()
@@ -97,7 +97,7 @@ class ModuleAndSectionAPIsTestCase(TestB
         if sec1:
             sec1.FindSubSection(None)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_module_compile_unit_iter(self):
         """Test module's compile unit iterator APIs."""
         self.build()

Modified: lldb/trunk/test/python_api/objc_type/TestObjCType.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/objc_type/TestObjCType.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/objc_type/TestObjCType.py (original)
+++ lldb/trunk/test/python_api/objc_type/TestObjCType.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class ObjCSBTypeTestCase(TestBase):
         self.line = line_number("main.m", '// Break at this line')
 
     @skipUnlessDarwin
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test(self):
         """Test SBType for ObjC classes."""
         self.build()

Modified: lldb/trunk/test/python_api/process/TestProcessAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/process/TestProcessAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/process/TestProcessAPI.py (original)
+++ lldb/trunk/test/python_api/process/TestProcessAPI.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class ProcessAPITestCase(TestBase):
         # Find the line number to break inside main().
         self.line = line_number("main.cpp", "// Set break point at this line and check variable 'my_char'.")
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_read_memory(self):
         """Test Python SBProcess.ReadMemory() API."""
         self.build()
@@ -104,7 +104,7 @@ class ProcessAPITestCase(TestBase):
         if my_uint32 != 12345:
             self.fail("Result from SBProcess.ReadUnsignedFromMemory() does not match our expected output")
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_write_memory(self):
         """Test Python SBProcess.WriteMemory() API."""
         self.build()
@@ -156,7 +156,7 @@ class ProcessAPITestCase(TestBase):
                     exe=False,
             startstr = 'a')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_access_my_int(self):
         """Test access 'my_int' using Python SBProcess.GetByteOrder() and other APIs."""
         self.build()
@@ -246,7 +246,7 @@ class ProcessAPITestCase(TestBase):
             for i in new_bytes:
                 print("byte:", i)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_remote_launch(self):
         """Test SBProcess.RemoteLaunch() API with a process not in eStateConnected, and it should fail."""
         self.build()
@@ -266,7 +266,7 @@ class ProcessAPITestCase(TestBase):
         success = process.RemoteLaunch(None, None, None, None, None, None, 0, False, error)
         self.assertTrue(not success, "RemoteLaunch() should fail for process state != eStateConnected")
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_get_num_supported_hardware_watchpoints(self):
         """Test SBProcess.GetNumSupportedHardwareWatchpoints() API with a process."""
         self.build()

Modified: lldb/trunk/test/python_api/process/io/TestProcessIO.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/process/io/TestProcessIO.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/process/io/TestProcessIO.py (original)
+++ lldb/trunk/test/python_api/process/io/TestProcessIO.py Mon Oct 26 04:28:32 2015
@@ -28,7 +28,7 @@ class ProcessIOTestCase(TestBase):
         self.lines = ["Line 1", "Line 2", "Line 3"]
 
     @skipIfWindows # stdio manipulation unsupported on Windows
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_stdin_by_api(self):
         """Exercise SBProcess.PutSTDIN()."""
         self.build()
@@ -38,7 +38,7 @@ class ProcessIOTestCase(TestBase):
         self.check_process_output(output, output)
 
     @skipIfWindows # stdio manipulation unsupported on Windows
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_stdin_redirection(self):
         """Exercise SBLaunchInfo::AddOpenFileAction() for STDIN without specifying STDOUT or STDERR."""
         self.build()
@@ -49,7 +49,7 @@ class ProcessIOTestCase(TestBase):
         self.check_process_output(output, output)
 
     @skipIfWindows # stdio manipulation unsupported on Windows
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_stdout_redirection(self):
         """Exercise SBLaunchInfo::AddOpenFileAction() for STDOUT without specifying STDIN or STDERR."""
         self.build()
@@ -61,7 +61,7 @@ class ProcessIOTestCase(TestBase):
         self.check_process_output(output, error)
 
     @skipIfWindows # stdio manipulation unsupported on Windows
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_stderr_redirection(self):
         """Exercise SBLaunchInfo::AddOpenFileAction() for STDERR without specifying STDIN or STDOUT."""
         self.build()
@@ -73,7 +73,7 @@ class ProcessIOTestCase(TestBase):
         self.check_process_output(output, error)
 
     @skipIfWindows # stdio manipulation unsupported on Windows
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_stdout_stderr_redirection(self):
         """Exercise SBLaunchInfo::AddOpenFileAction() for STDOUT and STDERR without redirecting STDIN."""
         self.build()

Modified: lldb/trunk/test/python_api/sbdata/TestSBData.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/sbdata/TestSBData.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/sbdata/TestSBData.py (original)
+++ lldb/trunk/test/python_api/sbdata/TestSBData.py Mon Oct 26 04:28:32 2015
@@ -20,7 +20,7 @@ class SBDataAPICase(TestBase):
         # Find the line number to break on inside main.cpp.
         self.line = line_number('main.cpp', '// set breakpoint here')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_run_command(self):
         """Test the SBData APIs."""
         self.build()

Modified: lldb/trunk/test/python_api/sbvalue_persist/TestSBValuePersist.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/sbvalue_persist/TestSBValuePersist.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/sbvalue_persist/TestSBValuePersist.py (original)
+++ lldb/trunk/test/python_api/sbvalue_persist/TestSBValuePersist.py Mon Oct 26 04:28:32 2015
@@ -13,7 +13,7 @@ class SBValuePersistTestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureWindows("llvm.org/pr24772")
     def test(self):
         """Test SBValue::Persist"""

Modified: lldb/trunk/test/python_api/section/TestSectionAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/section/TestSectionAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/section/TestSectionAPI.py (original)
+++ lldb/trunk/test/python_api/section/TestSectionAPI.py Mon Oct 26 04:28:32 2015
@@ -12,7 +12,7 @@ class SectionAPITestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_get_target_byte_size(self):
         d = {'EXE': 'b.out'}
         self.build(dictionary=d)

Modified: lldb/trunk/test/python_api/signals/TestSignalsAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/signals/TestSignalsAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/signals/TestSignalsAPI.py (original)
+++ lldb/trunk/test/python_api/signals/TestSignalsAPI.py Mon Oct 26 04:28:32 2015
@@ -14,7 +14,7 @@ from lldbtest import *
 class SignalsAPITestCase(TestBase):
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFlakeyLinux # this test fails 1/100 dosep runs
     @skipIfWindows # Windows doesn't have signals
     def test_ignore_signal(self):

Modified: lldb/trunk/test/python_api/symbol-context/TestSymbolContext.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/symbol-context/TestSymbolContext.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/symbol-context/TestSymbolContext.py (original)
+++ lldb/trunk/test/python_api/symbol-context/TestSymbolContext.py Mon Oct 26 04:28:32 2015
@@ -21,7 +21,7 @@ class SymbolContextAPITestCase(TestBase)
         # Find the line number to of function 'c'.
         self.line = line_number('main.c', '// Find the line number of function "c" here.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureWindows("llvm.org/pr24778")
     def test(self):
         """Exercise SBSymbolContext API extensively."""

Modified: lldb/trunk/test/python_api/target/TestTargetAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/target/TestTargetAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/target/TestTargetAPI.py (original)
+++ lldb/trunk/test/python_api/target/TestTargetAPI.py Mon Oct 26 04:28:32 2015
@@ -31,7 +31,7 @@ class TargetAPITestCase(TestBase):
     # It does not segfaults now.  But for dwarf, the variable value is None if
     # the inferior process does not exist yet.  The radar has been updated.
     #@unittest232.skip("segmentation fault -- skipping")
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_find_global_variables(self):
         """Exercise SBTarget.FindGlobalVariables() API."""
         d = {'EXE': 'b.out'}
@@ -39,7 +39,7 @@ class TargetAPITestCase(TestBase):
         self.setTearDownCleanup(dictionary=d)
         self.find_global_variables('b.out')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureWindows("llvm.org/pr24778")
     def test_find_functions(self):
         """Exercise SBTarget.FindFunctions() API."""
@@ -48,25 +48,25 @@ class TargetAPITestCase(TestBase):
         self.setTearDownCleanup(dictionary=d)
         self.find_functions('b.out')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_get_description(self):
         """Exercise SBTarget.GetDescription() API."""
         self.build()
         self.get_description()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_launch_new_process_and_redirect_stdout(self):
         """Exercise SBTarget.Launch() API."""
         self.build()
         self.launch_new_process_and_redirect_stdout()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_resolve_symbol_context_with_address(self):
         """Exercise SBTarget.ResolveSymbolContextForAddress() API."""
         self.build()
         self.resolve_symbol_context_with_address()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_get_platform(self):
         d = {'EXE': 'b.out'}
         self.build(dictionary=d)
@@ -75,7 +75,7 @@ class TargetAPITestCase(TestBase):
         platform = target.platform
         self.assertTrue(platform, VALID_PLATFORM)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_get_data_byte_size(self):
         d = {'EXE': 'b.out'}
         self.build(dictionary=d)
@@ -83,7 +83,7 @@ class TargetAPITestCase(TestBase):
         target = self.create_simple_target('b.out')
         self.assertEquals(target.data_byte_size, 1)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_get_code_byte_size(self):
         d = {'EXE': 'b.out'}
         self.build(dictionary=d)
@@ -91,7 +91,7 @@ class TargetAPITestCase(TestBase):
         target = self.create_simple_target('b.out')
         self.assertEquals(target.code_byte_size, 1)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_resolve_file_address(self):
         d = {'EXE': 'b.out'}
         self.build(dictionary=d)
@@ -114,7 +114,7 @@ class TargetAPITestCase(TestBase):
         self.assertIsNotNone(data_section2)
         self.assertEquals(data_section.name, data_section2.name) 
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_read_memory(self):
         d = {'EXE': 'b.out'}
         self.build(dictionary=d)

Modified: lldb/trunk/test/python_api/thread/TestThreadAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/thread/TestThreadAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/thread/TestThreadAPI.py (original)
+++ lldb/trunk/test/python_api/thread/TestThreadAPI.py Mon Oct 26 04:28:32 2015
@@ -15,19 +15,19 @@ class ThreadAPITestCase(TestBase):
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_get_process(self):
         """Test Python SBThread.GetProcess() API."""
         self.build()
         self.get_process()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_get_stop_description(self):
         """Test Python SBThread.GetStopDescription() API."""
         self.build()
         self.get_stop_description()
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_run_to_address(self):
         """Test Python SBThread.RunToAddress() API."""
         # We build a different executable than the default build() does.
@@ -36,7 +36,7 @@ class ThreadAPITestCase(TestBase):
         self.setTearDownCleanup(dictionary=d)
         self.run_to_address(self.exe_name)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureFreeBSD # llvm.org/pr20476
     @expectedFailureWindows # Test crashes
     def test_step_out_of_malloc_into_function_b(self):
@@ -47,7 +47,7 @@ class ThreadAPITestCase(TestBase):
         self.setTearDownCleanup(dictionary=d)
         self.step_out_of_malloc_into_function_b(self.exe_name)
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_step_over_3_times(self):
         """Test Python SBThread.StepOver() API."""
         # We build a different executable than the default build() does.

Modified: lldb/trunk/test/python_api/type/TestTypeList.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/type/TestTypeList.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/type/TestTypeList.py (original)
+++ lldb/trunk/test/python_api/type/TestTypeList.py Mon Oct 26 04:28:32 2015
@@ -24,7 +24,7 @@ class TypeAndTypeListTestCase(TestBase):
         self.source = 'main.cpp'
         self.line = line_number(self.source, '// Break at this line')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test(self):
         """Exercise SBType and SBTypeList API."""
         d = {'EXE': self.exe_name}

Modified: lldb/trunk/test/python_api/value/TestValueAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/value/TestValueAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/value/TestValueAPI.py (original)
+++ lldb/trunk/test/python_api/value/TestValueAPI.py Mon Oct 26 04:28:32 2015
@@ -24,7 +24,7 @@ class ValueAPITestCase(TestBase):
         self.line = line_number('main.c', '// Break at this line')
 
     @expectedFailureWindows("llvm.org/pr24772")
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test(self):
         """Exercise some SBValue APIs."""
         d = {'EXE': self.exe_name}

Modified: lldb/trunk/test/python_api/value/change_values/TestChangeValueAPI.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/value/change_values/TestChangeValueAPI.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/value/change_values/TestChangeValueAPI.py (original)
+++ lldb/trunk/test/python_api/value/change_values/TestChangeValueAPI.py Mon Oct 26 04:28:32 2015
@@ -26,7 +26,7 @@ class ChangeValueAPITestCase(TestBase):
         self.end_line = line_number ('main.c', '// Set a breakpoint here at the end')
 
     @expectedFailureWindows("llvm.org/pr24772")
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_change_value(self):
         """Exercise the SBValue::SetValueFromCString API."""
         d = {'EXE': self.exe_name}

Modified: lldb/trunk/test/python_api/value/linked_list/TestValueAPILinkedList.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/value/linked_list/TestValueAPILinkedList.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/value/linked_list/TestValueAPILinkedList.py (original)
+++ lldb/trunk/test/python_api/value/linked_list/TestValueAPILinkedList.py Mon Oct 26 04:28:32 2015
@@ -24,7 +24,7 @@ class ValueAsLinkedListTestCase(TestBase
         # Find the line number to break at.
         self.line = line_number('main.cpp', '// Break at this line')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test(self):
         """Exercise SBValue API linked_list_iter."""
         d = {'EXE': self.exe_name}

Modified: lldb/trunk/test/python_api/value_var_update/TestValueVarUpdate.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/value_var_update/TestValueVarUpdate.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/value_var_update/TestValueVarUpdate.py (original)
+++ lldb/trunk/test/python_api/value_var_update/TestValueVarUpdate.py Mon Oct 26 04:28:32 2015
@@ -20,7 +20,7 @@ class HelloWorldTestCase(TestBase):
         self.exe = os.path.join(os.getcwd(), self.testMethodName)
         self.d = {'EXE': self.testMethodName}
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_with_process_launch_api(self):
         """Test SBValue::GetValueDidChange"""
         self.build(dictionary=self.d)

Modified: lldb/trunk/test/python_api/watchpoint/TestSetWatchpoint.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/watchpoint/TestSetWatchpoint.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/watchpoint/TestSetWatchpoint.py (original)
+++ lldb/trunk/test/python_api/watchpoint/TestSetWatchpoint.py Mon Oct 26 04:28:32 2015
@@ -23,7 +23,7 @@ class SetWatchpointAPITestCase(TestBase)
         # Find the line number to break inside main().
         self.line = line_number(self.source, '// Set break point at this line.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureAndroid(archs=['arm', 'aarch64']) # Watchpoints not supported
     @expectedFailureWindows("llvm.org/pr24446") # WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows
     def test_watch_val(self):

Modified: lldb/trunk/test/python_api/watchpoint/TestWatchpointIgnoreCount.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/watchpoint/TestWatchpointIgnoreCount.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/watchpoint/TestWatchpointIgnoreCount.py (original)
+++ lldb/trunk/test/python_api/watchpoint/TestWatchpointIgnoreCount.py Mon Oct 26 04:28:32 2015
@@ -23,7 +23,7 @@ class WatchpointIgnoreCountTestCase(Test
         # Find the line number to break inside main().
         self.line = line_number(self.source, '// Set break point at this line.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureAndroid(archs=['arm', 'aarch64']) # Watchpoints not supported
     @expectedFailureWindows("llvm.org/pr24446") # WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows
     def test_set_watch_ignore_count(self):

Modified: lldb/trunk/test/python_api/watchpoint/TestWatchpointIter.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/watchpoint/TestWatchpointIter.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/watchpoint/TestWatchpointIter.py (original)
+++ lldb/trunk/test/python_api/watchpoint/TestWatchpointIter.py Mon Oct 26 04:28:32 2015
@@ -23,7 +23,7 @@ class WatchpointIteratorTestCase(TestBas
         # Find the line number to break inside main().
         self.line = line_number(self.source, '// Set break point at this line.')
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureAndroid(archs=['arm', 'aarch64']) # Watchpoints not supported
     @expectedFailureWindows("llvm.org/pr24446") # WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows
     def test_watch_iter(self):

Modified: lldb/trunk/test/python_api/watchpoint/watchlocation/TestSetWatchlocation.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/watchpoint/watchlocation/TestSetWatchlocation.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/watchpoint/watchlocation/TestSetWatchlocation.py (original)
+++ lldb/trunk/test/python_api/watchpoint/watchlocation/TestSetWatchlocation.py Mon Oct 26 04:28:32 2015
@@ -25,7 +25,7 @@ class SetWatchlocationAPITestCase(TestBa
         # This is for verifying that watch location works.
         self.violating_func = "do_bad_thing_with_location";
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureAndroid(archs=['arm', 'aarch64']) # Watchpoints not supported
     @expectedFailureWindows("llvm.org/pr24446") # WINDOWS XFAIL TRIAGE - Watchpoints not supported on Windows
     def test_watch_location(self):

Modified: lldb/trunk/test/python_api/watchpoint/watchlocation/TestTargetWatchAddress.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/watchpoint/watchlocation/TestTargetWatchAddress.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/python_api/watchpoint/watchlocation/TestTargetWatchAddress.py (original)
+++ lldb/trunk/test/python_api/watchpoint/watchlocation/TestTargetWatchAddress.py Mon Oct 26 04:28:32 2015
@@ -25,7 +25,7 @@ class TargetWatchAddressAPITestCase(Test
         # This is for verifying that watch location works.
         self.violating_func = "do_bad_thing_with_location";
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureAndroid(archs=['arm', 'aarch64']) # Watchpoints not supported
     @expectedFailureWindows("llvm.org/pr24446")
     def test_watch_address(self):
@@ -88,7 +88,7 @@ class TargetWatchAddressAPITestCase(Test
 
         # This finishes our test.
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     @expectedFailureAndroid(archs=['arm', 'aarch64']) # Watchpoints not supported
     @skipIf(archs=['mips', 'mipsel', 'mips64', 'mips64el']) # No size constraint on MIPS for watches
     def test_watch_address_with_invalid_watch_size(self):

Modified: lldb/trunk/test/source-manager/TestSourceManager.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/source-manager/TestSourceManager.py?rev=251277&r1=251276&r2=251277&view=diff
==============================================================================
--- lldb/trunk/test/source-manager/TestSourceManager.py (original)
+++ lldb/trunk/test/source-manager/TestSourceManager.py Mon Oct 26 04:28:32 2015
@@ -28,7 +28,7 @@ class SourceManagerTestCase(TestBase):
         self.line = line_number('main.c', '// Set break point at this line.')
         lldb.skip_build_and_cleanup = False
 
-    @python_api_test
+    @add_test_categories(['pyapi'])
     def test_display_source_python(self):
         """Test display of source using the SBSourceManager API."""
         self.build()

Added: lldb/trunk/test/test_categories.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/test_categories.py?rev=251277&view=auto
==============================================================================
--- lldb/trunk/test/test_categories.py (added)
+++ lldb/trunk/test/test_categories.py Mon Oct 26 04:28:32 2015
@@ -0,0 +1,47 @@
+"""
+Provides definitions for various lldb test categories
+"""
+
+import sys
+
+all_categories = {
+    'dataformatters': 'Tests related to the type command and the data formatters subsystem',
+    'expression'    : 'Tests related to the expression parser',
+    'objc'          : 'Tests related to the Objective-C programming language support',
+    'pyapi'         : 'Tests related to the Python API',
+    'basic_process' : 'Basic process execution sniff tests.',
+    'cmdline'       : 'Tests related to the LLDB command-line interface',
+    'dyntype'       : 'Tests related to dynamic type support',
+    'stresstest'    : 'Tests related to stressing lldb limits',
+    'flakey'        : 'Flakey test cases, i.e. tests that do not reliably pass at each execution'
+}
+
+def unique_string_match(yourentry, list):
+    candidate = None
+    for item in list:
+        if not item.startswith(yourentry):
+            continue
+        if candidate:
+            return None
+        candidate = item
+    return candidate
+
+def validate(categories, exact_match):
+    """
+    For each category in categories, ensure that it's a valid category (if exact_match is false,
+    unique prefixes are also accepted). If a category is invalid, print a message and quit.
+       If all categories are valid, return the list of categories. Prefixes are expanded in the
+       returned list.
+    """
+    result = []
+    for category in categories:
+        origCategory = category
+        if category not in all_categories and not exact_match:
+            category = unique_string_match(category, all_categories)
+        if (category not in all_categories) or category == None:
+            print("fatal error: category '" + origCategory + "' is not a valid category")
+            print("if you have added a new category, please edit test_categories.py, adding your new category to all_categories")
+            print("else, please specify one or more of the following: " + str(list(all_categories.keys())))
+            sys.exit(1)
+        result.append(category)
+    return result




More information about the lldb-commits mailing list