[tbot] Problem with context exit (and serial transmission)
    Harald Seiler 
    hws at denx.de
       
    Sun Feb  3 21:09:23 UTC 2019
    
    
  
Hi Lukasz,
On Sat, 2019-02-02 at 23:57 +0100, Lukasz Majewski wrote:
> def kernel_active_update(
>     lab: typing.Optional[linux.LabHost] = None,
> ) -> None:
>      linux_falcon_boot(falcon_status="disable")
> # --------- Problem / why do I need this code ?
>      with lab or tbot.acquire_lab() as lh:
>          lh.exec0("pkill", "-9", "picocom")
>          time.sleep(3)
> # ---------
>      uboot_kernel_write(reset=True, serverip="192.168.2.222")
Unrelated to your issue I have noticed something:  While your code works,
you have a hidden performance cost:  Each testcase will create its own
connection to the lab-host.  In case of a local lab this will not be
noticeable but with ssh connections it will be a few seconds each time.
You can easily fix this though!  The testcases you listed in the end already
have a `lab` parameter where you can supply an existing lab-host connection:
	def kernel_active_update(
	    lab: typing.Optional[linux.LabHost] = None,
	) -> None:
	    with lab or tbot.acquire_lab() as lh:
	        linux_falcon_boot(lab=lh, falcon_status="disable")
	        uboot_kernel_write(lab=lh, reset=True, serverip="...")
One more note:
> if reset:
>     ub.exec0("reset")
Executing `reset` with `exec0` is not really portable.  If your board has
autoboot enabled, tbot would hang indefinitely waiting for the U-Boot prompt
to reappear.  If you absolutely have to execute reset, I'd do so manually
and then wait for the U-Boot header string to reappear before exiting the
board context (not tested, sorry):
	if reset:
	    ub.channel.send("reset\n")
	    ub.channel.read_until_prompt(
	        # U-Boot Header
	        prompt="U-Boot",
	        # Because the header can appear anywhere in the stream
	        must_end=False,
	    )
	# Actually power off the board now by exiting its context
> The linux_falcon_boot() and uboot_kernel_write() works without problems
> when executed as standalone tests (and I only expect them to be run one
> by one).
> 
> The question is - why do I need to kill manually the picocom process
> and put some sleep between invocation of those two tests?
It looks like picocom doesn't like the way tbot ends a session.  I found
a workaround:  Add the following function in your board-config (where the
call to picocom is defined):
	def cleanup(self) -> None:
	    # Send ^A^Q to quit picocom
	    if self.channel is not None:
	        self.channel.send("\x01\x11")
Docs for cleanup can be found here:
	https://rahix.de/tbot/module-board.html#tbot.machine.board.Board.cleanup
> From the doc I thought that when we exit context (from one test with
> disabling power) and start the context again (and power up in another
> test), the "channel" would be put into default state (I mean the picocom
> would be killed and re-spawned accordingly).
Yes, you got that correctly.  Apparently picocom does not exit cleanly by
default ... I'll see if I can somehow fix this without the solution mentioned
above.
-- 
Harald
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