I thought we weren't talking about why you want this lldb-test, but rather why 
tests that poke deep into the lldb_private API's are or are not appropriate for 
your test dingus.  

The thing I worry about is if you start using this for very special purpose 
"reach deep into the lldb_private API's" type tests, then the command-set of 
lldb-test is not going to be a limited set of commands that are nicely 
composible, it is going to be a whole assortment of odd little one-off commands 
and trying to figure out how to use it is going to get harder and harder over 
time because it will be so noisy.  So if I were doing this I'd impose some 
discipline on myself to keep that from happening, and use unit tests for 
anything that was really esoteric.

But again, I'm unlikely to be the one that implements this so my opinions 
should have the weight of a kibitzer...

Jim


> On Nov 29, 2017, at 4:33 PM, Zachary Turner <ztur...@google.com> wrote:
> 
> Many reasons.
> 
> 1) a test that looks like this:
> 
> ```
> RUN: yaml2obj %p/Inputs/compressed-section.yaml > %t/compressed-section.obj
> RUN: lldb-test %s | FileCheck %s
> 
> create-module -f %t/compressed-section.obj
> dump-module-sections compressed-section.obj
> 
> ; CHECK: Section: .hello_elf
> ; CHECK-NEXT: Size: 9
> ; CHECK-NEXT: Data: Hello ELF
> 
> ; CHECK: Section: .bogus
> ; CHECK-NEXT: Size: 0
> ```
> 
> takes about 1 minute to write, and a couple of seconds to understand, and is 
> 12 lines of code, compared to a unit test which takes significantly longer to 
> write and understand, and is (at least in this case) 37 lines not counting 
> the code to implement the command
> 
> 2) this is a standard test format that is understood by hundreds of 
> developers.
> 
> 3) It does not contribute to build time.
> 
> 4) Any work you do to implement the `create-module` and 
> `dump-module-sections` testing command can later be used by any other test 
> without any additional code.  With a reasonable set of commands you would 
> reach a point where you were rarely having to update the tool.
> 
> 5) Parsing text output is often the most straightforward and easiest way to 
> verify something.  Consider for example a testcommand like "dump-unwind-plan" 
> where you could easily represent an unwind plan in text as a sequence of 
> rules and/or heuristics.  Try doing that in code, for several hundred 
> different test cases of obscure unwind scenarios and I think you'll quickly 
> give up and decide it's more trouble than it's worth.
> 
> On Wed, Nov 29, 2017 at 4:14 PM Jim Ingham <jing...@apple.com> wrote:
> 
> 
> > On Nov 29, 2017, at 3:46 PM, Zachary Turner <ztur...@google.com> wrote:
> >
> > FWIW, it can certainly use the SB API where it makes sense, but I think 
> > requiring that it only use the SB API would be very limiting and a big 
> > mistake.
> >
> > The entire point of a tool such as this is that it allows you to dig deep 
> > into internals that would be difficult to access otherwise.
> 
> I'm not sure about that.  Making a test that "digs deep into internals" in 
> this method is almost certainly going to require writing a custom command in 
> lldb-test to poke those API's.  How would this be any easier than writing a 
> unit test?
> 
> Jim
> 
> 
> >
> > On Wed, Nov 29, 2017 at 3:23 PM Jason Molenda <jmole...@apple.com> wrote:
> >
> >
> > > On Nov 29, 2017, at 2:51 PM, Zachary Turner via lldb-commits 
> > > <lldb-commits@lists.llvm.org> wrote:
> > >
> > >
> > >
> > > On Wed, Nov 29, 2017 at 1:59 PM Jim Ingham <jing...@apple.com> wrote:
> > > I'm mostly basing this concern on the bad effect this had on gdb all of 
> > > whose testing was expect based command scraping.  gdb is a tool that's 
> > > much closer to lldb than any of the compiler tools so that experience 
> > > seems relevant.  It's been a decade or so since I worked on gdb, but back 
> > > when I was working on it, you really had to tread very carefully if you 
> > > wanted to change the output of, say, the break command, or to thread 
> > > listings, etc, and a bunch of times I just had to bag some cleanup of 
> > > output I wanted to do because fixing up all the tests was too time 
> > > consuming.  Because Jason and I had both had this experience when we 
> > > started working on lldb, we promised ourselves we wouldn't go down this 
> > > path again...
> > >
> > >
> > > Couple of things:
> > >
> > > 1) I wouldn't dare to use this approach for anything that required 
> > > interactivity.  If you need to run one command, extract a value from the 
> > > output, and use that value as input to another command, I think that 
> > > would be a big mistake.  I have no intention of ever proposing something 
> > > like that.
> > >
> > > 2) FileCheck is very flexible in the way it matches output and tests can 
> > > be written so that they are resilient to minor format tweaks.  I have no 
> > > doubt that with pure regex matching, or with pretty much any other tool, 
> > > you would have a really bad time.  Of course, that doesn't mean it would 
> > > be hard to construct an example of a format change that would break a 
> > > FileCheck test.  But I think it would happen *far* less frequently than 
> > > it did on GDB.  That said, I still understand your concerns that it's 
> > > fragile, so...
> > >
> > > 3) I would not be opposed to a tool called lldb-test, which was basically 
> > > just LLDB with a different, and much more limited set of commands, and 
> > > was completely non-interactive and would produce output in a format 
> > > designed for being scraped, and which never had to be changed since it 
> > > was never presented to the user.
> >
> >
> > 100% agree with #3.  We could go back and forth about using lldb-mi, but I 
> > think a specialized driver using SB API, designed for testing, would be a 
> > great approach.
> >
> >
> 

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

Reply via email to