[tbot] Handling return code from test case

Harald Seiler hws at denx.de
Thu Nov 22 09:21:44 UTC 2018

Hello Stefano,

On Thu, 2018-11-22 at 10:08 +0100, Stefano Babic wrote:
> Hi,
> I am trying two simple testcases:
> - first testcase boots a board in Linux and run an existing command
> - second testcase boots a board in Linux and run a not existing command
> As desired, tbot reports success for the first one and failure for the
> second one.
> But let's say I want to test that a command fails, that is my tbot
> testcase should be successful if the command is not found.

First of all, you should distinguish between running a command which
fails (retcode != 0) and running a command that does not exist.  I'd suggest
using the following:

	if not lnx.test("which", "<command>"):
	    # Command does not exist

If you were to use

	if not lnx.test("<command>"):

instead, you can't distinguish between the command not existing and the
command failing.

> When I call exec0, test of course fails but tbot stops. How is this
> managed ?

`exec0`[1] is just a pretty wrapper around `exec`[2]. `exec` returns a tuple:

	(ret_code, console_output)

`exec0` will raise an exception if the return code is not 0.  In my suggested
code above, I use `test`[3], which is a wrapper that returns `True` if the ret-
code is 0 and `False` otherwise.

> Just to make things clear:
> import contextlib
>  import typing
>  import time
>  import tbot
>  from tbot.machine import linux
>  @tbot.testcase
>  def missingcmd(
>      mach: typing.Optional[linux.LinuxMachine] = None,
>  ) -> None:
>      with contextlib.ExitStack() as cx:
>          if mach is None:
>              lh = cx.enter_context(tbot.acquire_lab())
>              b = cx.enter_context(tbot.acquire_board(lh))
>              lnx = cx.enter_context(tbot.acquire_linux(b))
>          else:
>              lnx = mach
>          lnx.exec0("doesnotexist")
> And tbot should be successful if the command cannot be executed (also, I
> want a "reverse" case).

See my above suggestion.  If you want the testcase to fail if the command
exists, use something like this:

	assert not lnx.test("which", "doesnotexist")

> Regards,
> Stefano

[1] https://rahix.de/tbot/module-linux.html#tbot.machine.linux.LinuxMachine.exec0
[2] https://rahix.de/tbot/module-linux.html#tbot.machine.linux.LinuxMachine.exec
[3] https://rahix.de/tbot/module-linux.html#tbot.machine.linux.LinuxMachine.test


DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-62  Fax: +49-8142-66989-80   Email: hws at denx.de

More information about the tbot mailing list