[lldb-dev] Testing through api vs. commands

Zachary Turner via lldb-dev lldb-dev at lists.llvm.org
Wed Oct 7 10:37:35 PDT 2015

On Wed, Oct 7, 2015 at 10:17 AM Greg Clayton <gclayton at apple.com> wrote:

> > On Oct 7, 2015, at 10:05 AM, Zachary Turner via lldb-dev <
> lldb-dev at lists.llvm.org> wrote:
> >
> > Jim, Greg,
> >
> > Can I get some feedback on this?  I would like to start enforcing this
> moving forward.  I want to make sure we're in agreement.
> >
> > On Mon, Oct 5, 2015 at 12:30 PM Todd Fiala <todd.fiala at gmail.com> wrote:
> > IMHO that all sounds reasonable.
> >
> > FWIW - I wrote some tests for the test system changes I put in (for the
> pure-python impl of timeout support), and in the process, I discovered a
> race condition in using a python facility that there really is no way I
> would have found anywhere near as reasonably without having added the
> tests.  (For those of you who are test-centric, this is not a surprising
> outcome, but I'm adding this for those who may be inclined to think of it
> as an afterthought).
> >
> > -Todd
> >
> > On Mon, Oct 5, 2015 at 11:24 AM, Zachary Turner via lldb-dev <
> lldb-dev at lists.llvm.org> wrote:
> > On Fri, Sep 11, 2015 at 11:42 AM Jim Ingham <jingham at apple.com> wrote:
> > I have held from the beginning that the only tests that should be
> written using HandleCommand are those that explicitly test command
> behavior, and if it is possible to write a test using the SB API you should
> always do it that way for the very reasons you cite.  Not everybody agreed
> with me at first, so we ended up with a bunch of tests that do complex
> things using HandleCommand where they really ought not to.  I'm not sure it
> is worth the time to go rewrite all those tests, but we shouldn't write any
> new tests that way.
> >
> > I would like to revive this thread, because there doesn't seem to be
> consensus that this is the way to go.  I've suggested on a couple of
> reviews recently that people put new command api tests under a new
> top-level folder under tests, and so far the responses I've gotten have not
> indicated that people are willing to do this.
> >
> > Nobody chimed in on this thread with a disagreement, which indicates to
> me that we are ok with moving this forward.  So I'm reviving this in hopes
> that we can come to agreement.  With that in mind, my goal is:
> >
> > 1) Begin enforcing this on new CLs that go in.  We need to maintain a
> consistent message and direction for the project, and if this is a "good
> idea", then it should be applied and enforced consistently.  Command api
> tests should be the exception, not the norm.
> You mean API tests should be the norm right? I don't want people
> submitting command line tests like "file a.out", "run", "step". I want the
> API to be used. Did you get this reversed?
I didn't get it reversed, but I agree my wording wasn't clear.  By "command
api", I meant HandleCommand / etc.  I *do* want the SB API to be used.

> >
> > 2) Begin rejecting or reverting changes that go in without tests.  I
> understand there are some situations where tests are difficult.  Core dumps
> and unwinding come to mind.  There are probably others.  But this is the
> exception, and not the norm.  Almost every change should go in with tests.
> As long as it can be tested reasonably I am fine with rejecting changes
> going in that don't have tests.
One of the problem is that most changes go in without review.  I understand
why this is, because Apple especially are code owners of more than 80% of
LLDB, so people adhere to the post-commit review.  This is fine in
principle, but if changes go in without tests and there was no
corresponding code review, then my only option is to either keep pinging
the commit thread in hopes I'll get a response (which I sometimes don't
get), or revert the change.  Often though I get a response that says "Yea
I'll get to adding tests eventually".  I especially want this last type of
response to go the way of the dinosaur.  I don't know how to change
peoples' habits, but if you could bring this up at you daily/weekly
standups or somehow make sure everyone is on the same page, perhaps that
would be a good start.  Reverting is the best way I know to handle this,
because it forces a change.  But at the same time it's disruptive, so I
really don't want to do it.

> >
> > 3) If a CL cannot be tested without a command api test due to
> limitations of the SB API, require new changes to go in with a
> corresponding SB API change.
> One issue here is I don't want stuff added to the SB API just so that it
> can be tested. The SB API must remain clean and consistent and remain an
> API that makes sense for debugging. I don't want internal goo being exposed
> just so we can test things. If we run into this a lot, we might need to
> make an alternate binary that can test internal unit tests. We could make a
> lldb_internal.so/lldb_internal.dylib/lldb_internal.dll that can be linked
> to by internal unit tests and then those unit tests can be run as part of
> the testing process. So lets keep the SB API clean and sensible with no
> extra fluff, and find a way to tests internal stuff in a different way.
Agree that the SB API should be treated with care.  Unit tests are a good
way around this as you mention.  We already have them running under the
CMake build.  If you want to try it out, build with CMake and run "ninja

The suite is still small, and that also means that creating new ones is not
always easy.  Part of this is for the same reason that I think it would be
hard to make a lightweight lldb_internal.dll, because in a way LLDB is like
boost, in that almost every library has interdependencies on every other
library.  I made a lot of progress towards breaking the dependency cycle a
few months ago, so it's better now.  But the idea is that if you want to
write a unit tests that tests Host, you shouldn't have to link against all
of LLDB.  You should only have to link against Host.a or Host.lib.

In any case, you can probably get the existing unit test stuff integrated
into the Xcode build.  I can tell you how it all works on the CMake side,
let me know if you're interested.  Todd probably already has some firsthand
knowledge of how it works, so he might be able to help in person to if
you're interested in going this route.

So in summary, it sounds like we agree on the following guidelines:

1) If you're committing a CL and it is possible to test it through the SB
API, you should only submit an SB API test, and not a HandleCommand test.
2) If you're committing a CL and it's *not* possible to test it through the
SBI API but it does make sense for the SB API, you should extend the SB API
at the same time as your CL, and then refer back to #1.
3) If it is not possible to test it through the SB API and it does not make
sense to add it to the SB API from a design perspective, you should
consider writing a unit test for it in C++.  This applies especially for
utility classes and data structures.
4) Finally, if none of the above are true, you can write a HandleCommand

One more question: I mentioned earlier that we should enforce the
distinction between HandleCommand tests and python api tests at an
organizational level.  In other words, all HandleCommand tests go in
lldb/test/command-api, and all new SB API tests go in
lldb/test/command-api.  Eventually the goal would be to only have 3
toplevel directories under lldb/test.  unittests, command-api, and
python-api.  But this would take some time since it would be on a
move-as-you-touch basis, rather than all at once.  Does this seem
reasonable as well?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-dev/attachments/20151007/7e2c03dd/attachment-0001.html>

More information about the lldb-dev mailing list