Hi ddunbar, danalbert, jroelofs,

This patch was inspired by the following use case when testing libc++:

* The `lit.site.cfg` is in build-libcxx/test/lit.site.cfg
* Your working out of libcxx/test

Currently the only solution is to copy or symlink the generated `lit.site.cfg` 
into the source tree and then teach your VCS to ignore it. This patch allows 
the user to manually specify configuration files to load. It works by 
pre-loading the suite configuration file cache. The configuration files can be 
specified one of two ways:

* using the `--config` command line parameter
* using the `LIT_CONFIG` environment variable.  

The configuration files specified using `--config` are loaded before the ones 
in `LIT_CONFIG`. configuration files with the same path or the same test source 
path are not loaded twice.

@ddunbar If you disagree with this direction please let me know.

http://reviews.llvm.org/D6275

Files:
  docs/CommandGuide/lit.rst
  utils/lit/lit/discovery.py
  utils/lit/lit/main.py
Index: docs/CommandGuide/lit.rst
===================================================================
--- docs/CommandGuide/lit.rst
+++ docs/CommandGuide/lit.rst
@@ -51,6 +51,12 @@
  Run ``N`` tests in parallel.  By default, this is automatically chosen to
  match the number of detected available CPUs.
 
+.. option:: --config=FILE
+
+ Add a test suite configuration to be preloaded into the test suite cache during
+ test discovery. This option can be used to load configuration files that are
+ generated by out-of-dir builds.
+
 .. option:: --config-prefix=NAME
 
  Search for :file:`{NAME}.cfg` and :file:`{NAME}.site.cfg` when searching for
@@ -262,9 +268,18 @@
 
 :program:`lit` identifies test suites as directories containing ``lit.cfg`` or
 ``lit.site.cfg`` files (see also :option:`--config-prefix`).  Test suites are
-initially discovered by recursively searching up the directory hierarchy for
-all the input files passed on the command line.  You can use
-:option:`--show-suites` to display the discovered test suites at startup.
+initially discovered in two ways.
+
+1. By loading the suite configurations specified in the :option:`--config`
+option and the ``LIT_CONFIG`` enviroment variable. Where ``LIT_CONFIG`` is a
+colon separated list of configuration files.
+
+2. By recursively searching up the directory hierarchy for all the input files
+passed on the command line.
+
+
+You can use :option:`--show-suites` to display the discovered test suites at
+startup. (Note: Only suites containing tests will be displayed).
 
 Once a test suite is discovered, its config file is loaded.  Config files
 themselves are Python modules which will be executed.  When the config file is
Index: utils/lit/lit/discovery.py
===================================================================
--- utils/lit/lit/discovery.py
+++ utils/lit/lit/discovery.py
@@ -189,7 +189,7 @@
         if sub_ts and not N:
             litConfig.warning('test suite %r contained no tests' % sub_ts.name)
 
-def find_tests_for_inputs(lit_config, inputs):
+def find_tests_for_inputs(lit_config, inputs, suite_inputs=[]):
     """
     find_tests_for_inputs(lit_config, inputs) -> [Test]
 
@@ -211,10 +211,34 @@
                 f.close()
         else:
             actual_inputs.append(input)
-                    
+
     # Load the tests from the inputs.
     tests = []
     test_suite_cache = {}
+    # Preload the test suite cache by filling it with explicitly specified test
+    # suites. Make sure each test suite is only loaded once by checking that it
+    # doesn't already exist in the cache and an extra list of seen test suites.
+    # NOTE: The path that is used as a key in the cache can differ from the
+    #  path that was used to load the suites.
+    test_suites_seen = set()
+    for cfgpath in suite_inputs:
+        cfgpath = os.path.realpath(cfgpath)
+        if not os.path.isfile(cfgpath):
+            lit_config.warning('Invalid config file: %s' % cfgpath)
+            break
+        if cfgpath in test_suites_seen or \
+           cfgpath in test_suite_cache.keys():
+            break
+        if lit_config.debug:
+            lit_config.note('Loading config file: %s' % cfgpath)
+        test_suites_seen.add(cfgpath)
+        cfg = TestingConfig.fromdefaults(lit_config)
+        cfg.load_from_path(cfgpath, lit_config)
+        path = os.path.dirname(cfgpath)
+        source_root = os.path.realpath(cfg.test_source_root or path)
+        exec_root = os.path.realpath(cfg.test_exec_root or path)
+        test_suite_cache[source_root] = Test.TestSuite(cfg.name, source_root, exec_root, cfg), ()
+
     local_config_cache = {}
     for input in actual_inputs:
         prev = len(tests)
Index: utils/lit/lit/main.py
===================================================================
--- utils/lit/lit/main.py
+++ utils/lit/lit/main.py
@@ -143,6 +143,9 @@
     parser.add_option("-j", "--threads", dest="numThreads", metavar="N",
                       help="Number of testing threads",
                       type=int, action="store", default=None)
+    parser.add_option('--config', dest="suiteConfigs",
+                      metavar='FILE', help='Extra test suite configs',
+                      type=str, action="append", default=[])
     parser.add_option("", "--config-prefix", dest="configPrefix",
                       metavar="NAME", help="Prefix for 'lit' config files",
                       action="store", default=None)
@@ -280,9 +283,17 @@
         params = userParams,
         config_prefix = opts.configPrefix)
 
-    # Perform test discovery.
+    # Perform test discovery. Read in an extra list of configuration files
+    # from the enviroment and the command line and pass that along with the
+    # tests to do test discovery.
+    suite_configs = list(opts.suiteConfigs)
+    env_suites = os.environ.get('LIT_CONFIG')
+    if env_suites is not None:
+        env_suites = re.split(r'[:;]', env_suites)
+        suite_configs += [s.strip() for s in env_suites if s.strip()]
     run = lit.run.Run(litConfig,
-                      lit.discovery.find_tests_for_inputs(litConfig, inputs))
+                      lit.discovery.find_tests_for_inputs(
+                        litConfig, inputs, suite_configs))
 
     if opts.showSuites or opts.showTests:
         # Aggregate the tests by suite.
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to