<div dir="ltr">One thing about lit that most people either don't understand or forget about is that FileCheck has nothing to do with lit.  You can have lit tests without FileCheck.  It's more work because you would have to define an LLDBServerTestFormat and invent some DSL that isn't just a bunch of run lines and check statements.  You could then write a c++ program like lldb-server-test, which gives you all the benefits of code reuse and packet parsing that you're talking about, and have your test consist of something like:<div><br></div><div>check-lldb-server --prefix=TEST_ERROR_RESPONSE < %s </div><div>check-lldb-server --prefix=TEST_SUCCESS_RESPONSE < %s   <br></div><div><br></div><div>TEST_ERROR_RESPONSE: SEND: <some hex packet string></div><div>TEST_ERROR_RESPONSE: RECV-ERROR: 62</div><div><br></div><div>TEST_SUCCESS_RESPONSE: SEND: <some hex packet string> </div><div>TEST_SUCCESS_RESPONSE: RECV-SUCCESS: eax = 7</div><div><br></div><div>I think this would make tests both easier to write and easier to understand than what is being proposed here.</div><div><br></div><div>That said, what is being proposed here can't exactly be called a lateral move, because I do agree it's better.  So because of that, I'm willing to let it go in.  But I'm 100% confident that a better solution can be devised in lit with some thought.  Unfortunately, given that I don't work on lldb-server, all I can really do is offer some high level ideas, and it will be up to you guys to figure out the details.</div><div><br><br><div class="gmail_quote"><div dir="ltr">On Mon, May 15, 2017 at 7:34 AM Pavel Labath <<a href="mailto:labath@google.com" target="_blank">labath@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello all,<br>
<br>
In case you haven't noticed it, I'd like to draw your attention to<br>
D32930, where we're proposing a new test framework for lldb-server<br>
tests. The discussion has so far been about low-level implementation<br>
details, so you don't have to read through it if you don't feel like<br>
to (but I do encourage it)<br>
<br>
However, I'd like to explain some of the high-level motivations which<br>
led to our proposed design and open a discussion on them here. I'll do<br>
this in an FAQ form: :)<br>
<br>
- why new framework?:<br>
<br>
Lldb-server tests were never really suited for the dotest.py model<br>
anyway (for example they end up creating an SBDebugger, only to be<br>
completely ignoring it and opening a socket connection to lldb-server<br>
directly). Perhaps for this reason, they are also harder to write than<br>
usual lldb tests, and a lot more messy internally (e.g., after Chris's<br>
ipv6 patch, which caused all lldb-server connections in the test to<br>
fail, I've learned that the test harness will attempt the lldb-server<br>
connection 400(!!!) times before conceding defeat). The test suite<br>
operation is also very illogical when it comes to doing remote tests:<br>
to test lldb-server on a remote target, you first have to build<br>
lldb-server for the target, THEN you have to build lldb for the HOST,<br>
and THEN you run dotest.py in the HOST build folder while passing<br>
funny dotest.py arguments.<br>
<br>
<br>
- why lldb-server ?:<br>
We'd like this to be a first step in porting the existing test off of<br>
the dotest.py test runner. Unlike the full test suite, the number of<br>
lldb-server tests is not that big, so porting them is an task<br>
achievable in a not too long timeframe, and it can serve as a proof of<br>
concept when considering further steps. Also, lldb-server already<br>
performs a relatively well-defined and simple task, which means it<br>
fits the llvm model of testing isolated components of functionality<br>
without the need for a massive refactor.<br>
<br>
- why c++ (aka, if the existing test suite is broken, why not just fix it) ?:<br>
There are two fundamental issues with the current test suite which<br>
cannot be easily "fixed". The first one is the remote execution (which<br>
is where a large part of the test harness complexity comes from). By<br>
writing the test in c++ we can run the test *and* lldb-server remotely<br>
(***), avoiding the network communication and flakyness that comes<br>
with it. The other issue is the fact that it needs to have a<br>
completely independent reimplementation of the gdb-remote protocol.<br>
Sure, some duplication is expected from tests, but it does not have to<br>
be that big. If we write the test in c++ we can reuse parts of the<br>
gdb-remote client code (thereby increasing test coverage of that as<br>
well), and only resort to manual packet parsing when we really want to<br>
(e.g., when testing the server response to a malformed packet or<br>
similar).<br>
<br>
- ok, but why not have the test described by a text file, and have a<br>
c++ FileCheck-like utility which interprets it?:<br>
Due to the unpredictable (e.g. we cannot control the addresses of<br>
objects in the inferior), and interactive nature of the tests, we<br>
believe they would be easier to write imperatively, instead of a more<br>
declarative FileCheck style. E.g. for one test you need to send<br>
qRegisterInfoN for N=1,... until you find the pc register then pluck a<br>
field with that number from a stop-reply packet, and compare that the<br>
result of another packet, while possible reversing endianness. To<br>
describe something like this in a text file, you will either need<br>
primitives to describe loops, conditionals, etc (which will then tend<br>
towards implementing a full scripting language), or have a very<br>
high-level primitive operation which does exactly this, which will<br>
tend towards having many specialized primitive operations.<br>
<br>
regards,<br>
pavel<br>
<br>
(***) To achieve this, we want to propose adding the ability to<br>
execute tests remotely to llvm-lit, which we hope will be useful to<br>
more people. I'll write more about this in a separate email with<br>
llvm-dev included.<br>
</blockquote></div></div></div>