> On Apr 6, 2020, at 2:24 PM, Jonas Devlieghere via lldb-dev 
> <lldb-dev@lists.llvm.org> wrote:
> 
> Hi everyone,
> 
> Reproducers in LLDB are currently tested through (1) unit tests, (2) 
> dedicated end-to-end shell tests and (3) the `lldb-check-repro` suite which 
> runs all the shell tests against a replayed reproducer. While this already 
> provides great coverage, we're still missing out on about 800 API tests. 
> These tests are particularly interesting to the reproducers, because as 
> opposed to the shell tests, which only exercises a subset of SB API calls 
> used to implement the driver, they cover the majority of the API surface.
> 
> To further qualify reproducer and to improve test coverage, I want to capture 
> and replay the API test suite as well. Conceptually, this can be split up in 
> two stages: 
> 
>  1. Capture a reproducer and replay it with the driver. This exercises the 
> reproducer instrumentation (serialization and deserialization) for all the 
> APIs used in our test suite. While a bunch of issues with the reproducer 
> instrumentation can be detected at compile time, a large subset only triggers 
> through assertions at runtime. However, this approach by itself only verifies 
> that we can (de)serialize API calls and their arguments. It has no knowledge 
> of the expected results and therefore cannot verify the results of the API 
> calls.
> 
>  2. Capture a reproducer and replay it with dotest.py. Rather than having the 
> command line driver execute every API call one after another, we can have 
> dotest.py call the Python API as it normally would, intercept the call, 
> replay it from the reproducer, and return the replayed result. The 
> interception can be hidden behind the existing LLDB_RECORD_* macros, which 
> contains sufficient type info to drive replay. It then simply re-invokes 
> itself with the arguments deserialized from the reproducer and returns that 
> result. Just as with the shell tests, this approach allows us to reuse the 
> existing API tests, completely transparently, to check the reproducer output.
> 
> I have worked on this over the past month and have shown that it is possible 
> to achieve both stages. I have a downstream fork that contains the necessary 
> changes.
> 
> All the runtime issues found in stage 1 have been fixed upstream. With the 
> exception of about 30 tests that fail because the GDB packets diverge during 
> replay, all the tests can be replayed with the driver.
> 
> About 120 tests, which include the 30 mentioned earlier, fail to replay for 
> stage 2. This isn't entirely unexpected, just like the shell tests, there are 
> tests that simply are not expected to work. The reproducers don't currently 
> capture the output of the inferior and synchronization through external files 
> won't work either, as those paths will get remapped by the VFS. This requires 
> manually triage.
> 
> I would like to start upstreaming this work so we can start running this in 
> CI. The majority of the changes are limited to the reproducer 
> instrumentation, but some changes are needed in the test suite as well, and 
> there would be a new decorator to skip the unsupported tests. I'm splitting 
> up the changes in self-contained patches, but wanted to send out this RFC 
> with the bigger picture first.

I personally believe this is a required step to make sure:
a) Reproducers can jump from being a prototype idea to something that can 
actually run in production
b) Whenever we add a new test [or presumably a new API] we get coverage 
for-free.
c) We have a verification mechanism to make sure we don’t regress across the 
large surface API and not only what the unittests & shell tests cover.

I personally would be really glad to see this being upstreamed. I also would 
like to thank you for doing the work in a downstream branch until you proved 
this was achievable.

—
D

_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to