Home | History | Annotate | Download | only in lit
      1 ================
      2  lit TODO Items
      3 ================
      4 
      5 Infrastructure
      6 ==============
      7 
      8 1. Change to always load suites, then resolve command line arguments?
      9 
     10   Currently we expect each input argument to be a path on disk; we do a
     11   recursive search to find the test suite for each item, but then we only do a
     12   local search based at the input path to find tests. Additionally, for any path
     13   that matches a file on disk we explicitly construct a test instance (bypassing
     14   the formats on discovery implementation).
     15 
     16   This has a couple problems:
     17 
     18   * The test format doesn't have control over the test instances that result
     19     from file paths.
     20 
     21   * It isn't possible to specify virtual tests as inputs. For example, it is not
     22     possible to specify an individual subtest to run with the googletest format.
     23 
     24   * The test format doesn't have full control over the discovery of tests in
     25     subdirectories.
     26 
     27   Instead, we should move to a model whereby first all of the input specifiers
     28   are resolved to test suites, and then the resolution of the input specifier is
     29   delegated to each test suite. This could take a couple forms:
     30 
     31   * We could resolve to test suites, then fully load each test suite, then have
     32     a fixed process to map input specifiers to tests in the test suite
     33     (presumably based on path-in-suite derivations). This has the benefit of
     34     being consistent across all test formats, but the downside of requiring
     35     loading the entire test suite.
     36 
     37   * We could delegate all of the resolution of specifiers to the test
     38     suite. This would allow formats that anticipate large test suites to manage
     39     their own resolution for better performance. We could provide a default
     40     resolution strategy that was similar to what we do now (start at subpaths
     41     for directories, but allow the test format control over what happens for
     42     individual tests).
     43 
     44 2. Consider move to identifying all tests by path-to-test-suite and then path to
     45    subtest, and don't use test suite names.
     46 
     47   Currently the test suite name is presented as part of test names, but it has
     48   no other useful function, and it is something that has to be skipped over to
     49   cut-and-paste a name to subsequently use to rerun a test. If we just
     50   represented each test suite by the path to its suite, then it would allow more
     51   easy cut-and-paste of the test output lines. This has the downside that the
     52   lines might get rather long.
     53 
     54 3. Allow 'lit' driver to cooperate with test formats and suites to add options
     55    (or at least sanitize accepted params).
     56 
     57   We have started to use the --params method more and more extensively, and it is
     58   cumbersome and error prone. Additionally, there are currently various options
     59   ``lit`` honors that should more correctly be specified as belonging to the
     60   ShTest test format.
     61   
     62   It would be really nice if we could allow test formats and test suites to add
     63   their own options to be parsed. The difficulty here, of course, is that we
     64   don't know what test formats or test suites are in use until we have parsed the
     65   input specifiers. For test formats we could ostensibly require all the possible
     66   formats to be registered in order to have options, but for test suites we would
     67   certainly have to load the suite before we can query it for what options it
     68   understands.
     69 
     70   That leaves us with the following options:
     71 
     72   * Currently we could almost get away with parsing the input specifiers without
     73     having done option parsing first (the exception is ``--config-prefix``) but
     74     that isn't a very extensible design.
     75 
     76   * We could make a distinction in the command line syntax for test format and
     77     test suite options. For example, we could require something like::
     78 
     79       lit -j 1 -sv input-specifier -- --some-format-option
     80 
     81     which would be relatively easy to implement with optparser (I think).
     82 
     83   * We could allow fully interspersed arguments by first extracting the options
     84     lit knows about and parsing them, then dispatching the remainder to the
     85     formats. This seems the most convenient for users, who are unlikely to care
     86     about (or even be aware of) the distinction between the generic lit
     87     infrastructure and format or suite specific options.
     88 
     89 4. Eliminate duplicate execution models for ShTest tests.
     90 
     91   Currently, the ShTest format uses tests written with shell-script like syntax,
     92   and executes them in one of two ways. The first way is by converting them into
     93   a bash script and literally executing externally them using bash. The second
     94   way is through the use of an internal shell parser and shell execution code
     95   (built on the subprocess module). The external execution mode is used on most
     96   Unix systems that have bash, the internal execution mode is used on Windows.
     97 
     98   Having two ways to do the same thing is error prone and leads to unnecessary
     99   complexity in the testing environment. Additionally, because the mode that
    100   converts scripts to bash doesn't try and validate the syntax, it is possible
    101   to write tests that use bash shell features unsupported by the internal
    102   shell. Such tests won't work on Windows but this may not be obvious to the
    103   developer writing the test.
    104 
    105   Another limitation is that when executing the scripts externally, the ShTest
    106   format has no idea which commands fail, or what output comes from which
    107   commands, so this limits how convenient the output of ShTest failures can be
    108   and limits other features (for example, knowing what temporary files were
    109   written).
    110 
    111   We should eliminate having two ways of executing the same tests to reduce
    112   platform differences and make it easier to develop new features in the ShTest
    113   module. This is currently blocked on:
    114 
    115   * The external execution mode is faster in some situations, because it avoids
    116     being bottlenecked on the GIL. This can hopefully be obviated simply by
    117     using --use-processes.
    118 
    119   * Some tests in LLVM/Clang are explicitly disabled with the internal shell
    120     (because they use features specific to bash). We would need to rewrite these
    121     tests, or add additional features to the internal shell handling to allow
    122     them to pass.
    123 
    124 5. Consider changing core to support setup vs. execute distinction.
    125 
    126   Many of the existing test formats are cleanly divided into two phases, once
    127   parses the test format and extracts XFAIL and REQUIRES information, etc., and
    128   the other code actually executes the test.
    129 
    130   We could make this distinction part of the core infrastructure and that would
    131   enable a couple things:
    132 
    133   * The REQUIREs handling could be lifted to the core, which is nice.
    134 
    135   * This would provide a clear place to insert subtest support, because the
    136     setup phase could be responsible for providing subtests back to the
    137     core. That would provide part of the infrastructure to parallelize them, for
    138     example, and would probably interact well with other possible features like
    139     parameterized tests.
    140 
    141   * This affords a clean implementation of --no-execute.
    142 
    143   * One possible downside could be for test formats that cannot determine their
    144     subtests without having executed the test. Supporting such formats would
    145     either force the test to actually be executed in the setup stage (which
    146     might be ok, as long as the API was explicitly phrased to support that), or
    147     would mean we are forced into supporting subtests as return values from the
    148     execute phase.
    149 
    150   Any format can just keep all of its code in execute, presumably, so the only
    151   cost of implementing this is its impact on the API and futures changes.
    152 
    153 
    154 Miscellaneous
    155 =============
    156 
    157 * Move temp directory name into local test config.
    158 
    159 * Support valgrind in all configs, and LLVM style valgrind.
    160 
    161 * Support ulimit.
    162 
    163 * Create an explicit test suite object (instead of using the top-level
    164   TestingConfig object).
    165 
    166 * Introduce a wrapper class that has a ``subprocess.Popen`` like interface
    167   but also supports killing the process and all its children and use this for
    168   running tests.  This would allow us to implement platform specific methods
    169   for killing a process's children which is needed for a per test timeout. On
    170   POSIX platforms we can use process groups and on Windows we can probably use
    171   job objects. This would not only allow us to remove the dependency on the
    172   ``psutil`` module but would also be more reliable as the
    173   ``lit.util.killProcessAndChildren()`` function which is currently used is
    174   potentially racey (e.g. it might not kill a fork bomb completely).
    175