diff mbox series

[25/42] test: Allow connecting to a running board

Message ID 20240611200156.2245525-26-sjg@chromium.org
State Changes Requested
Delegated to: Tom Rini
Headers show
Series labgrid: Provide an integration with Labgrid | expand

Commit Message

Simon Glass June 11, 2024, 8:01 p.m. UTC
Sometimes we know that the board is already running the right software,
so provide an option to allow running of tests directly, without first
resetting the board.

This saves time when re-running a test where only the Python code is
changing.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 test/py/conftest.py                   |  3 +++
 test/py/u_boot_console_base.py        | 14 ++++++++++----
 test/py/u_boot_console_exec_attach.py | 21 ++++++++++++---------
 3 files changed, 25 insertions(+), 13 deletions(-)

Comments

Andrejs Cainikovs June 24, 2024, 11:56 p.m. UTC | #1
On Tue, Jun 11, 2024 at 02:01:39PM -0600, Simon Glass wrote:
> Sometimes we know that the board is already running the right software,
> so provide an option to allow running of tests directly, without first
> resetting the board.
> 
> This saves time when re-running a test where only the Python code is
> changing.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
>  test/py/conftest.py                   |  3 +++
>  test/py/u_boot_console_base.py        | 14 ++++++++++----
>  test/py/u_boot_console_exec_attach.py | 21 ++++++++++++---------
>  3 files changed, 25 insertions(+), 13 deletions(-)
> 
> diff --git a/test/py/conftest.py b/test/py/conftest.py
> index fc9dd3a83f8..ca66b9d9e61 100644
> --- a/test/py/conftest.py
> +++ b/test/py/conftest.py
> @@ -79,6 +79,8 @@ def pytest_addoption(parser):
>      parser.addoption('--gdbserver', default=None,
>          help='Run sandbox under gdbserver. The argument is the channel '+
>          'over which gdbserver should communicate, e.g. localhost:1234')
> +    parser.addoption('--no-prompt-wait', default=False, action='store_true',
> +        help="Assume that U-Boot is ready and don't wait for a prompt")
>  
>  def run_build(config, source_dir, build_dir, board_type, log):
>      """run_build: Build U-Boot
> @@ -238,6 +240,7 @@ def pytest_configure(config):
>      ubconfig.board_type = board_type
>      ubconfig.board_identity = board_identity
>      ubconfig.gdbserver = gdbserver
> +    ubconfig.no_prompt_wait = config.getoption('no_prompt_wait')
>      ubconfig.dtb = build_dir + '/arch/sandbox/dts/test.dtb'
>  
>      env_vars = (
> diff --git a/test/py/u_boot_console_base.py b/test/py/u_boot_console_base.py
> index e4f86f6af5b..a61eec31148 100644
> --- a/test/py/u_boot_console_base.py
> +++ b/test/py/u_boot_console_base.py
> @@ -413,11 +413,17 @@ class ConsoleBase(object):
>              if not self.config.gdbserver:
>                  self.p.timeout = TIMEOUT_MS
>              self.p.logfile_read = self.logstream
> -            if expect_reset:
> -                loop_num = 2
> +            if self.config.no_prompt_wait:
> +                # Send an empty command to set up the 'expect' logic. This has
> +                # the side effect of ensuring that there was no partial command
> +                # line entered
> +                self.run_command(' ')
>              else:
> -                loop_num = 1
> -            self.wait_for_boot_prompt(loop_num = loop_num)
> +                if expect_reset:
> +                    loop_num = 2
> +                else:
> +                    loop_num = 1
> +                self.wait_for_boot_prompt(loop_num = loop_num)

Hi Simon,

I had a very bad day, so here you go:

== ?

/Andrejs

>              self.at_prompt = True
>              self.at_prompt_logevt = self.logstream.logfile.cur_evt
>          except Exception as ex:
> diff --git a/test/py/u_boot_console_exec_attach.py b/test/py/u_boot_console_exec_attach.py
> index 5f4916b7da2..42fc15197b9 100644
> --- a/test/py/u_boot_console_exec_attach.py
> +++ b/test/py/u_boot_console_exec_attach.py
> @@ -59,15 +59,18 @@ class ConsoleExecAttach(ConsoleBase):
>          args = [self.config.board_type, self.config.board_identity]
>          s = Spawn(['u-boot-test-console'] + args)
>  
> -        try:
> -            self.log.action('Resetting board')
> -            cmd = ['u-boot-test-reset'] + args
> -            runner = self.log.get_runner(cmd[0], sys.stdout)
> -            runner.run(cmd)
> -            runner.close()
> -        except:
> -            s.close()
> -            raise
> +        if self.config.no_prompt_wait:
> +            self.log.action('Connecting to board without reset')
> +        else:
> +            try:
> +                self.log.action('Resetting board')
> +                cmd = ['u-boot-test-reset'] + args
> +                runner = self.log.get_runner(cmd[0], sys.stdout)
> +                runner.run(cmd)
> +                runner.close()
> +            except:
> +                s.close()
> +                raise
>  
>          return s
>  
> -- 
> 2.34.1
>
Simon Glass June 25, 2024, 12:31 p.m. UTC | #2
Hi Andrejs,

On Tue, 25 Jun 2024 at 00:56, Andrejs Cainikovs
<andrejs.cainikovs@toradex.com> wrote:
>
> On Tue, Jun 11, 2024 at 02:01:39PM -0600, Simon Glass wrote:
> > Sometimes we know that the board is already running the right software,
> > so provide an option to allow running of tests directly, without first
> > resetting the board.
> >
> > This saves time when re-running a test where only the Python code is
> > changing.
> >
> > Signed-off-by: Simon Glass <sjg@chromium.org>
> > ---
> >
> >  test/py/conftest.py                   |  3 +++
> >  test/py/u_boot_console_base.py        | 14 ++++++++++----
> >  test/py/u_boot_console_exec_attach.py | 21 ++++++++++++---------
> >  3 files changed, 25 insertions(+), 13 deletions(-)
> >
> > diff --git a/test/py/conftest.py b/test/py/conftest.py
> > index fc9dd3a83f8..ca66b9d9e61 100644
> > --- a/test/py/conftest.py
> > +++ b/test/py/conftest.py
> > @@ -79,6 +79,8 @@ def pytest_addoption(parser):
> >      parser.addoption('--gdbserver', default=None,
> >          help='Run sandbox under gdbserver. The argument is the channel '+
> >          'over which gdbserver should communicate, e.g. localhost:1234')
> > +    parser.addoption('--no-prompt-wait', default=False, action='store_true',
> > +        help="Assume that U-Boot is ready and don't wait for a prompt")
> >
> >  def run_build(config, source_dir, build_dir, board_type, log):
> >      """run_build: Build U-Boot
> > @@ -238,6 +240,7 @@ def pytest_configure(config):
> >      ubconfig.board_type = board_type
> >      ubconfig.board_identity = board_identity
> >      ubconfig.gdbserver = gdbserver
> > +    ubconfig.no_prompt_wait = config.getoption('no_prompt_wait')
> >      ubconfig.dtb = build_dir + '/arch/sandbox/dts/test.dtb'
> >
> >      env_vars = (
> > diff --git a/test/py/u_boot_console_base.py b/test/py/u_boot_console_base.py
> > index e4f86f6af5b..a61eec31148 100644
> > --- a/test/py/u_boot_console_base.py
> > +++ b/test/py/u_boot_console_base.py
> > @@ -413,11 +413,17 @@ class ConsoleBase(object):
> >              if not self.config.gdbserver:
> >                  self.p.timeout = TIMEOUT_MS
> >              self.p.logfile_read = self.logstream
> > -            if expect_reset:
> > -                loop_num = 2
> > +            if self.config.no_prompt_wait:
> > +                # Send an empty command to set up the 'expect' logic. This has
> > +                # the side effect of ensuring that there was no partial command
> > +                # line entered
> > +                self.run_command(' ')
> >              else:
> > -                loop_num = 1
> > -            self.wait_for_boot_prompt(loop_num = loop_num)
> > +                if expect_reset:
> > +                    loop_num = 2
> > +                else:
> > +                    loop_num = 1
> > +                self.wait_for_boot_prompt(loop_num = loop_num)
>
> Hi Simon,
>
> I had a very bad day, so here you go:
>
> == ?

What does this mean? I hope you have a good day today.

>
> /Andrejs
>
> >              self.at_prompt = True
> >              self.at_prompt_logevt = self.logstream.logfile.cur_evt
> >          except Exception as ex:
> > diff --git a/test/py/u_boot_console_exec_attach.py b/test/py/u_boot_console_exec_attach.py
> > index 5f4916b7da2..42fc15197b9 100644
> > --- a/test/py/u_boot_console_exec_attach.py
> > +++ b/test/py/u_boot_console_exec_attach.py
> > @@ -59,15 +59,18 @@ class ConsoleExecAttach(ConsoleBase):
> >          args = [self.config.board_type, self.config.board_identity]
> >          s = Spawn(['u-boot-test-console'] + args)
> >
> > -        try:
> > -            self.log.action('Resetting board')
> > -            cmd = ['u-boot-test-reset'] + args
> > -            runner = self.log.get_runner(cmd[0], sys.stdout)
> > -            runner.run(cmd)
> > -            runner.close()
> > -        except:
> > -            s.close()
> > -            raise
> > +        if self.config.no_prompt_wait:
> > +            self.log.action('Connecting to board without reset')
> > +        else:
> > +            try:
> > +                self.log.action('Resetting board')
> > +                cmd = ['u-boot-test-reset'] + args
> > +                runner = self.log.get_runner(cmd[0], sys.stdout)
> > +                runner.run(cmd)
> > +                runner.close()
> > +            except:
> > +                s.close()
> > +                raise
> >
> >          return s
> >
> > --
> > 2.34.1
> >
>

Regards,
Simon
Tom Rini June 25, 2024, 2:14 p.m. UTC | #3
On Tue, Jun 25, 2024 at 01:31:19PM +0100, Simon Glass wrote:
> Hi Andrejs,
> 
> On Tue, 25 Jun 2024 at 00:56, Andrejs Cainikovs
> <andrejs.cainikovs@toradex.com> wrote:
> >
> > On Tue, Jun 11, 2024 at 02:01:39PM -0600, Simon Glass wrote:
> > > Sometimes we know that the board is already running the right software,
> > > so provide an option to allow running of tests directly, without first
> > > resetting the board.
> > >
> > > This saves time when re-running a test where only the Python code is
> > > changing.
> > >
> > > Signed-off-by: Simon Glass <sjg@chromium.org>
> > > ---
> > >
> > >  test/py/conftest.py                   |  3 +++
> > >  test/py/u_boot_console_base.py        | 14 ++++++++++----
> > >  test/py/u_boot_console_exec_attach.py | 21 ++++++++++++---------
> > >  3 files changed, 25 insertions(+), 13 deletions(-)
> > >
> > > diff --git a/test/py/conftest.py b/test/py/conftest.py
> > > index fc9dd3a83f8..ca66b9d9e61 100644
> > > --- a/test/py/conftest.py
> > > +++ b/test/py/conftest.py
> > > @@ -79,6 +79,8 @@ def pytest_addoption(parser):
> > >      parser.addoption('--gdbserver', default=None,
> > >          help='Run sandbox under gdbserver. The argument is the channel '+
> > >          'over which gdbserver should communicate, e.g. localhost:1234')
> > > +    parser.addoption('--no-prompt-wait', default=False, action='store_true',
> > > +        help="Assume that U-Boot is ready and don't wait for a prompt")
> > >
> > >  def run_build(config, source_dir, build_dir, board_type, log):
> > >      """run_build: Build U-Boot
> > > @@ -238,6 +240,7 @@ def pytest_configure(config):
> > >      ubconfig.board_type = board_type
> > >      ubconfig.board_identity = board_identity
> > >      ubconfig.gdbserver = gdbserver
> > > +    ubconfig.no_prompt_wait = config.getoption('no_prompt_wait')
> > >      ubconfig.dtb = build_dir + '/arch/sandbox/dts/test.dtb'
> > >
> > >      env_vars = (
> > > diff --git a/test/py/u_boot_console_base.py b/test/py/u_boot_console_base.py
> > > index e4f86f6af5b..a61eec31148 100644
> > > --- a/test/py/u_boot_console_base.py
> > > +++ b/test/py/u_boot_console_base.py
> > > @@ -413,11 +413,17 @@ class ConsoleBase(object):
> > >              if not self.config.gdbserver:
> > >                  self.p.timeout = TIMEOUT_MS
> > >              self.p.logfile_read = self.logstream
> > > -            if expect_reset:
> > > -                loop_num = 2
> > > +            if self.config.no_prompt_wait:
> > > +                # Send an empty command to set up the 'expect' logic. This has
> > > +                # the side effect of ensuring that there was no partial command
> > > +                # line entered
> > > +                self.run_command(' ')
> > >              else:
> > > -                loop_num = 1
> > > -            self.wait_for_boot_prompt(loop_num = loop_num)
> > > +                if expect_reset:
> > > +                    loop_num = 2
> > > +                else:
> > > +                    loop_num = 1
> > > +                self.wait_for_boot_prompt(loop_num = loop_num)
> >
> > Hi Simon,
> >
> > I had a very bad day, so here you go:
> >
> > == ?
> 
> What does this mean? I hope you have a good day today.

I _think_ this one is that "self.wait_for_boot_prompt(loop_num =
loop_num)" should be "self.wait_for_boot_prompt(loop_num == loop_num)" ?
Andrejs Cainikovs June 25, 2024, 3:21 p.m. UTC | #4
On Tue, Jun 25, 2024 at 08:14:17AM -0600, Tom Rini wrote:
> On Tue, Jun 25, 2024 at 01:31:19PM +0100, Simon Glass wrote:
> > Hi Andrejs,
> > 
> > On Tue, 25 Jun 2024 at 00:56, Andrejs Cainikovs
> > <andrejs.cainikovs@toradex.com> wrote:
> > >
> > > On Tue, Jun 11, 2024 at 02:01:39PM -0600, Simon Glass wrote:
> > > > Sometimes we know that the board is already running the right software,
> > > > so provide an option to allow running of tests directly, without first
> > > > resetting the board.
> > > >
> > > > This saves time when re-running a test where only the Python code is
> > > > changing.
> > > >
> > > > Signed-off-by: Simon Glass <sjg@chromium.org>
> > > > ---
> > > >
> > > >  test/py/conftest.py                   |  3 +++
> > > >  test/py/u_boot_console_base.py        | 14 ++++++++++----
> > > >  test/py/u_boot_console_exec_attach.py | 21 ++++++++++++---------
> > > >  3 files changed, 25 insertions(+), 13 deletions(-)
> > > >
> > > > diff --git a/test/py/conftest.py b/test/py/conftest.py
> > > > index fc9dd3a83f8..ca66b9d9e61 100644
> > > > --- a/test/py/conftest.py
> > > > +++ b/test/py/conftest.py
> > > > @@ -79,6 +79,8 @@ def pytest_addoption(parser):
> > > >      parser.addoption('--gdbserver', default=None,
> > > >          help='Run sandbox under gdbserver. The argument is the channel '+
> > > >          'over which gdbserver should communicate, e.g. localhost:1234')
> > > > +    parser.addoption('--no-prompt-wait', default=False, action='store_true',
> > > > +        help="Assume that U-Boot is ready and don't wait for a prompt")
> > > >
> > > >  def run_build(config, source_dir, build_dir, board_type, log):
> > > >      """run_build: Build U-Boot
> > > > @@ -238,6 +240,7 @@ def pytest_configure(config):
> > > >      ubconfig.board_type = board_type
> > > >      ubconfig.board_identity = board_identity
> > > >      ubconfig.gdbserver = gdbserver
> > > > +    ubconfig.no_prompt_wait = config.getoption('no_prompt_wait')
> > > >      ubconfig.dtb = build_dir + '/arch/sandbox/dts/test.dtb'
> > > >
> > > >      env_vars = (
> > > > diff --git a/test/py/u_boot_console_base.py b/test/py/u_boot_console_base.py
> > > > index e4f86f6af5b..a61eec31148 100644
> > > > --- a/test/py/u_boot_console_base.py
> > > > +++ b/test/py/u_boot_console_base.py
> > > > @@ -413,11 +413,17 @@ class ConsoleBase(object):
> > > >              if not self.config.gdbserver:
> > > >                  self.p.timeout = TIMEOUT_MS
> > > >              self.p.logfile_read = self.logstream
> > > > -            if expect_reset:
> > > > -                loop_num = 2
> > > > +            if self.config.no_prompt_wait:
> > > > +                # Send an empty command to set up the 'expect' logic. This has
> > > > +                # the side effect of ensuring that there was no partial command
> > > > +                # line entered
> > > > +                self.run_command(' ')
> > > >              else:
> > > > -                loop_num = 1
> > > > -            self.wait_for_boot_prompt(loop_num = loop_num)
> > > > +                if expect_reset:
> > > > +                    loop_num = 2
> > > > +                else:
> > > > +                    loop_num = 1
> > > > +                self.wait_for_boot_prompt(loop_num = loop_num)
> > >
> > > Hi Simon,
> > >
> > > I had a very bad day, so here you go:
> > >
> > > == ?
> > 
> > What does this mean? I hope you have a good day today.
> 
> I _think_ this one is that "self.wait_for_boot_prompt(loop_num =
> loop_num)" should be "self.wait_for_boot_prompt(loop_num == loop_num)" ?
> 
> -- 
> Tom

Yes, that was what I was thinking, but now after another look I see my
comment is wrong. Please disregard, again.
diff mbox series

Patch

diff --git a/test/py/conftest.py b/test/py/conftest.py
index fc9dd3a83f8..ca66b9d9e61 100644
--- a/test/py/conftest.py
+++ b/test/py/conftest.py
@@ -79,6 +79,8 @@  def pytest_addoption(parser):
     parser.addoption('--gdbserver', default=None,
         help='Run sandbox under gdbserver. The argument is the channel '+
         'over which gdbserver should communicate, e.g. localhost:1234')
+    parser.addoption('--no-prompt-wait', default=False, action='store_true',
+        help="Assume that U-Boot is ready and don't wait for a prompt")
 
 def run_build(config, source_dir, build_dir, board_type, log):
     """run_build: Build U-Boot
@@ -238,6 +240,7 @@  def pytest_configure(config):
     ubconfig.board_type = board_type
     ubconfig.board_identity = board_identity
     ubconfig.gdbserver = gdbserver
+    ubconfig.no_prompt_wait = config.getoption('no_prompt_wait')
     ubconfig.dtb = build_dir + '/arch/sandbox/dts/test.dtb'
 
     env_vars = (
diff --git a/test/py/u_boot_console_base.py b/test/py/u_boot_console_base.py
index e4f86f6af5b..a61eec31148 100644
--- a/test/py/u_boot_console_base.py
+++ b/test/py/u_boot_console_base.py
@@ -413,11 +413,17 @@  class ConsoleBase(object):
             if not self.config.gdbserver:
                 self.p.timeout = TIMEOUT_MS
             self.p.logfile_read = self.logstream
-            if expect_reset:
-                loop_num = 2
+            if self.config.no_prompt_wait:
+                # Send an empty command to set up the 'expect' logic. This has
+                # the side effect of ensuring that there was no partial command
+                # line entered
+                self.run_command(' ')
             else:
-                loop_num = 1
-            self.wait_for_boot_prompt(loop_num = loop_num)
+                if expect_reset:
+                    loop_num = 2
+                else:
+                    loop_num = 1
+                self.wait_for_boot_prompt(loop_num = loop_num)
             self.at_prompt = True
             self.at_prompt_logevt = self.logstream.logfile.cur_evt
         except Exception as ex:
diff --git a/test/py/u_boot_console_exec_attach.py b/test/py/u_boot_console_exec_attach.py
index 5f4916b7da2..42fc15197b9 100644
--- a/test/py/u_boot_console_exec_attach.py
+++ b/test/py/u_boot_console_exec_attach.py
@@ -59,15 +59,18 @@  class ConsoleExecAttach(ConsoleBase):
         args = [self.config.board_type, self.config.board_identity]
         s = Spawn(['u-boot-test-console'] + args)
 
-        try:
-            self.log.action('Resetting board')
-            cmd = ['u-boot-test-reset'] + args
-            runner = self.log.get_runner(cmd[0], sys.stdout)
-            runner.run(cmd)
-            runner.close()
-        except:
-            s.close()
-            raise
+        if self.config.no_prompt_wait:
+            self.log.action('Connecting to board without reset')
+        else:
+            try:
+                self.log.action('Resetting board')
+                cmd = ['u-boot-test-reset'] + args
+                runner = self.log.get_runner(cmd[0], sys.stdout)
+                runner.run(cmd)
+                runner.close()
+            except:
+                s.close()
+                raise
 
         return s