[tbot] Problem with Linux boot to prompt

Lukasz Majewski lukma at denx.de
Thu Jan 24 10:34:32 UTC 2019


Hi Harald,

> Hi Lukasz,
> 
> On Thu, 2019-01-24 at 00:17 +0100, Lukasz Majewski wrote:
> > Dear tbot users,
> > 
> > I'm trying now to boot into Linux prompt (the
> > LinuxStandaloneMachine), and then execute 'uname -a'
> > 
> > The idea is to use boot_to_shell, log in, and execute 'uname -a'
> > https://rahix.de/tbot/module-board.html#tbot.machine.board.LinuxStandaloneMachine.boot_to_shell
> > 
> > Test case:
> > 
> > @tbot.testcase
> > def linux_uname(
> >     lab: typing.Optional[linux.LabHost] = None,
> >     board_linux: typing.Optional[board.LinuxStandaloneMachine] =
> > None, ) -> None:
> >     with contextlib.ExitStack() as cx:
> >         if board_linux is None:
> >             lh  = cx.enter_context(lab or tbot.acquire_lab())
> >             b   = cx.enter_context(tbot.acquire_board(lh))
> >             lnx = cx.enter_context(tbot.acquire_linux(b))
> >         else:
> >             lnx = board_linux
> > 
> >         lnx.boot_to_shell('root at display5:~# ')
> >         lnx.exec0("uname", "-a")
> >   
> 
> Hmm, you are not supposed to call `boot_to_shell` yourself.
> This is done internally when you enter the machine context:
> 
> 	lnx = cx.enter_context(tbot.acquire_linux(b))
> 
> Which is equivalent to this:
> 
> 	with tbot.acquire_linux(b) as lnx:
> 	    ...
> 
> If you are curious, the call happens here:
> 
> 	https://github.com/Rahix/tbot/blob/master/tbot/machine/board/linux.py#L288
> 
> I guess, I should mention this in the docs ...

Apparently I do understand things in a different way :-) (Or I'm biased
by other tests systems, which I've been using).

> 
> > (For simplicity I'm using the Linux Standalone Machine).
> > 
> > The output of -vvv:
> > 
> > │   │    <> 
> > │   │    <> 
> > │   ├─> 'root\n'
> > │   ├─< 'root\r\n'
> > │   │    <> display5 login: root
> > │   ├─< '\x1b7\x1b[r\x1b[999;999H\x1b[6n'
> > │   ├─< 'root at display5:~# '
> > 
> > The 'root at display5:~# ' is sent to the "channel", but there is no
> > reaction on it (I'm using picocom -b 115200 /dev/ttyUSB0 to handle
> > serial console).
> > Do I need to use regexp here ?
> >   
> 
> As stated above, you do not need to do anything.  tbot waits for the
> login prompt,

Ok. Se tbot waits for "display5 login:" and then send root.

> send username and optionally a password and then has a
> more or less sophisticated way of determining if the shell popped up.

From the above -vvv output, it seems like:

'\x1b7\x1b[r\x1b[999;999H\x1b[6n'
'root at display5:~# '

are received (but not displayed if -v or -vv is specified).
It seems like tbot has logged into the system's shell.

The problem in my case is that the test case hangs in this place and 
"uname -a" is not sent.

May the problem be with that I'm using "dash", but tbot now only
supports 'ash' and 'bash' ?


> As soon as it has, it will force the shell into a known state and
> give control back to your testcase to run commands.  If your config
> is correct, simply removing the `boot_to_shell` line should do the
> trick.

The board hangs as presented in the -vvv output above. Only Ctrl+C
works and the board is powered off.

> 
> > 
> > A side question(s):
> > -------------------
> > 
> > 1. Is it possible to return value from test case to make it fail?
> > 
> > For example - I do lnx.exec0() then do some work on text received
> > and on that basis I would like to make the test pass or fail.
> > Similar use case is with parsing 'dmesg' output.
> >   
> 
> A testcase fails if it raises an Exception.  If you want to manually
> create a failure:
> 
> 	if "bad output" in lnx.exec0("cat", "/var/log/syslog"):
> 	    raise Exception("Found bad output!")

Ok. So no exception is -> OK , with Exception -> ERROR

Just for the future consideration - other frameworks also allows other
results for tests - like SKIP,

> 
> > 
> > 2. Do we have any timeout of booting u-boot/kernel? 
> > 
> > A very common test case is to check if the board still boots after
> > update of SPL/u-boot/linux. I can hack some in-test case timeout
> > (and pass with -p the value), but maybe there is a better way?  
> 
> Sadly not yet.  Normal command execution (like exec(), exec0()) can
> take a timeout parameter, but boot does not have this functionality
> yet.
> 
> If you need this right now, you can use this hack:
> 
> 	import signal
> 
> 	def handler(_signum, _frame):
> 	    """ Signal handler for timeout """
> 	    raise TimeoutError()
> 
> 	# in your testcase
> 	signal.signal(signal.SIGALRM, handler)
> 
> 	# timeout 60 seconds
> 	signal.alarm(60)
> 	try:
> 	    # Do your things here
> 	    ...
> 	except TimeoutError:
> 		tbot.log.message("Aborting run because it took too
> long.")
> 

Ok. Thanks

> > (If anybody has such functionality, please share :-) )
> > 
> > Thanks in advance for your help.
> > 
> > Best regards,
> > 
> > Lukasz Majewski
> >   




Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/tbot/attachments/20190124/e5cff3af/attachment.sig>


More information about the tbot mailing list