Skip to contentSkip to conversation

test/py: Support setting up specific timeout

PATCH New Michal Simek 3 participants 5 messages May 18, 2016

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 test/py: Support setting up specific timeout

Large file transfers, flash erasing and more complicated tests requires more time to finish. Provide a way to setup specific timeout directly in test.

For example description for 50s test:
timeout = 50000
with u_boot_console.temporary_timeout(timeout):
u_boot_console.run_command(...)

---

 test/py/u_boot_console_base.py | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
test/py/u_boot_console_base.py +33 -0
index f7434363fbcb..82bbba43463e 100644
@@ -56,6 +56,24 @@ class ConsoleDisableCheck(object):
         self.console.disable_check_count[self.check_type] -= 1
         self.console.eval_bad_patterns()
 
+
+class ConsoleSetupTimeout(object):
+    """Context manager (for Python's with statement) that temporarily setup
+    timeout for specific comnand. This is useful when execution time is greater
+    then default 30s."""
+
+    def __init__(self, console, timeout):
+        self.console = console
+        self.console.orig_timeout = self.console.p.timeout
+        self.console.p.timeout = timeout
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, extype, value, traceback):
+        self.console.p = self.console.get_spawn()
+        self.console.p.timeout = self.console.orig_timeout
+
 class ConsoleBase(object):
     """The interface through which test functions interact with the U-Boot
     console. This primarily involves executing shell commands, capturing their
@@ -391,3 +409,18 @@ class ConsoleBase(object):
         """
 
         return ConsoleDisableCheck(self, check_type)
+
+    def temporary_timeout(self, timeout):
+        """Temporarily setup different timeout for commands.
+
+        Create a new context manager (for use with the "with" statement) which
+        temporarily change timeout.
+
+        Args:
+            timeout: Time in miliseconds.
+
+        Returns:
+            A context manager object.
+        """
+
+        return ConsoleSetupTimeout(self, timeout)
Signature · 1 line
1.9.1
#1 lore raw

PATCH 1/1 test/py: Support setting up specific timeout

Quoted 29 lines · Michal Simek

Large file transfers, flash erasing and more complicated tests requires more time to finish. Provide a way to setup specific timeout directly in test.

For example description for 50s test:
timeout = 50000
with u_boot_console.temporary_timeout(timeout):
u_boot_console.run_command(...)

---

 test/py/u_boot_console_base.py | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
test/py/u_boot_console_base.py +6 -0
index f7434363fbcb..82bbba43463e 100644
@@ -56,6 +56,24 @@ class ConsoleDisableCheck(object):
         self.console.disable_check_count[self.check_type] -= 1
         self.console.eval_bad_patterns()
 
+
+class ConsoleSetupTimeout(object):
+    """Context manager (for Python's with statement) that temporarily setup
+    timeout for specific comnand. This is useful when execution time is greater
+    then default 30s."""
+

test/py/u_boot_console_base.py class ConsoleDisableCheck(object): · line 74

Quoted 10 lines
test/py/u_boot_console_base.py +10 -0
+    def __init__(self, console, timeout):
+        self.console = console
+        self.console.orig_timeout = self.console.p.timeout
+        self.console.p.timeout = timeout
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, extype, value, traceback):
+        self.console.p = self.console.get_spawn()

This line should be there. It is resetting console. I will do more testing on real hw not on qemu.

Thanks,
Michal

Quoted 25 lines
test/py/u_boot_console_base.py +17 -0
+        self.console.p.timeout = self.console.orig_timeout
+
 class ConsoleBase(object):
     """The interface through which test functions interact with the U-Boot
     console. This primarily involves executing shell commands, capturing their
@@ -391,3 +409,18 @@ class ConsoleBase(object):
         """
 
         return ConsoleDisableCheck(self, check_type)
+
+    def temporary_timeout(self, timeout):
+        """Temporarily setup different timeout for commands.
+
+        Create a new context manager (for use with the "with" statement) which
+        temporarily change timeout.
+
+        Args:
+            timeout: Time in miliseconds.
+
+        Returns:
+            A context manager object.
+        """
+
+        return ConsoleSetupTimeout(self, timeout)
Signature · 14 lines
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/
Maintainer of Linux kernel - Xilinx Zynq ARM architecture
Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160518/f69b853c/attachment.sig>
#2 lore raw

PATCH 1/1 test/py: Support setting up specific timeout

Quoted 44 lines · Michal Simek
Quoted 29 lines · Michal Simek

Large file transfers, flash erasing and more complicated tests requires more time to finish. Provide a way to setup specific timeout directly in test.

For example description for 50s test:
timeout = 50000
with u_boot_console.temporary_timeout(timeout):
u_boot_console.run_command(...)

---

 test/py/u_boot_console_base.py | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
test/py/u_boot_console_base.py +6 -0
index f7434363fbcb..82bbba43463e 100644
@@ -56,6 +56,24 @@ class ConsoleDisableCheck(object):
         self.console.disable_check_count[self.check_type] -= 1
         self.console.eval_bad_patterns()
 
+
+class ConsoleSetupTimeout(object):
+    """Context manager (for Python's with statement) that temporarily setup
+    timeout for specific comnand. This is useful when execution time is greater
+    then default 30s."""
+

test/py/u_boot_console_base.py class ConsoleDisableCheck(object): · line 74

Quoted 10 lines
test/py/u_boot_console_base.py +10 -0
+    def __init__(self, console, timeout):
+        self.console = console
+        self.console.orig_timeout = self.console.p.timeout
+        self.console.p.timeout = timeout
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, extype, value, traceback):
+        self.console.p = self.console.get_spawn()

This line should be there. It is resetting console. I will do more testing on real hw not on qemu.

Quoted 4 lines

Thanks,
Michal

Quoted 1 line
test/py/u_boot_console_base.py +1 -0
+        self.console.p.timeout = self.console.orig_timeout

This is also wrong because self.console.p is closed when timeout occurs which caused exception which calls cleanup_spawn which close p.

This exit should be like this.
def __exit__(self, extype, value, traceback):
if not self.console.p:
return
self.console.p.timeout = self.orig_timeout

Thanks,
Michal

#3 lore raw

PATCH 1/1 test/py: Support setting up specific timeout

In reply to Michal Simek
Quoted 10 lines · Michal Simek

Large file transfers, flash erasing and more complicated tests requires more time to finish. Provide a way to setup specific timeout directly in test.

For example description for 50s test:
timeout = 50000
with u_boot_console.temporary_timeout(timeout):

   u_boot_console.run_command(...)

test/py/u_boot_console_base.py class ConsoleDisableCheck(object): · line 59

Quoted 4 lines
test/py/u_boot_console_base.py +1 -0
 
          self.console.eval_bad_patterns()
 
+

Nit: No need for two blank lines.

test/py/u_boot_console_base.py class ConsoleDisableCheck(object): · line 61

Quoted 2 lines
test/py/u_boot_console_base.py +2 -0
+class ConsoleSetupTimeout(object):
+    """Context manager (for Python's with statement) that temporarily setup

Nit: s/set/sets up/

Quoted 1 line

+ timeout for specific comnand. This is useful when execution time is greater

Nit: s/comnand/command/

test/py/u_boot_console_base.py class ConsoleDisableCheck(object): · line 68

Quoted 6 lines
test/py/u_boot_console_base.py +6 -0
+    then default 30s."""
+
+    def __init__(self, console, timeout):
+        self.console = console
+        self.console.orig_timeout = self.console.p.timeout
+        self.console.p.timeout = timeout

I'd suggest storing console.p not console. That way, even if console.p is replaced because of an issue, you still have a handle to it and don't have to make the code in __exit__ conditional:

self.p = console.p
self.orig_timeout = self.p.timeout
self.p.timeout = timeout

test/py/u_boot_console_base.py class ConsoleDisableCheck(object): · line 75

Quoted 7 lines
test/py/u_boot_console_base.py +7 -0
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, extype, value, traceback):
+        self.console.p = self.console.get_spawn()
+        self.console.p.timeout = self.console.orig_timeout

This then doesn't need the conditionals you mentioned in your response to this patch, and can then be:

self.p.timeout = self.orig_timeout

test/py/u_boot_console_base.py class ConsoleBase(object): · line 414

Quoted 2 lines
test/py/u_boot_console_base.py +2 -0
+    def temporary_timeout(self, timeout):
+        """Temporarily setup different timeout for commands.

Nit: s/setup/set up/

test/py/u_boot_console_base.py class ConsoleBase(object): · line 420

Quoted 2 lines
test/py/u_boot_console_base.py +2 -0
+        Args:
+            timeout: Time in miliseconds.

Nit: s/miliseconds/milliseconds/

#4 lore raw

PATCH 1/1 test/py: Support setting up specific timeout

Quoted 61 lines · Stephen Warren
Quoted 11 lines · Michal Simek

Large file transfers, flash erasing and more complicated tests requires more time to finish. Provide a way to setup specific timeout directly in test.

For example description for 50s test:
timeout = 50000
with u_boot_console.temporary_timeout(timeout):

   u_boot_console.run_command(...)

test/py/u_boot_console_base.py class ConsoleDisableCheck(object): · line 59

Quoted 4 lines
test/py/u_boot_console_base.py +1 -0
 
          self.console.eval_bad_patterns()
 
+

Nit: No need for two blank lines.

Quoted 3 lines
test/py/u_boot_console_base.py +2 -0
+class ConsoleSetupTimeout(object):
+    """Context manager (for Python's with statement) that temporarily

setup

Nit: s/set/sets up/

Quoted 2 lines

+ timeout for specific comnand. This is useful when execution time
is greater

Nit: s/comnand/command/

test/py/u_boot_console_base.py class ConsoleDisableCheck(object): · line 68

Quoted 6 lines
test/py/u_boot_console_base.py +6 -0
+    then default 30s."""
+
+    def __init__(self, console, timeout):
+        self.console = console
+        self.console.orig_timeout = self.console.p.timeout
+        self.console.p.timeout = timeout

I'd suggest storing console.p not console. That way, even if console.p is replaced because of an issue, you still have a handle to it and don't have to make the code in __exit__ conditional:

self.p = console.p
self.orig_timeout = self.p.timeout
self.p.timeout = timeout

test/py/u_boot_console_base.py class ConsoleDisableCheck(object): · line 75

Quoted 7 lines
test/py/u_boot_console_base.py +7 -0
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, extype, value, traceback):
+        self.console.p = self.console.get_spawn()
+        self.console.p.timeout = self.console.orig_timeout

This then doesn't need the conditionals you mentioned in your response to this patch, and can then be:

self.p.timeout = self.orig_timeout

test/py/u_boot_console_base.py class ConsoleBase(object): · line 414

Quoted 2 lines
test/py/u_boot_console_base.py +2 -0
+    def temporary_timeout(self, timeout):
+        """Temporarily setup different timeout for commands.
Quoted 7 lines

Nit: s/setup/set up/

test/py/u_boot_console_base.py class ConsoleBase(object): · line 420

Quoted 2 lines
test/py/u_boot_console_base.py +2 -0
+        Args:
+            timeout: Time in miliseconds.

Nit: s/miliseconds/milliseconds/

I have fixed all of these comments and send v2.

Thanks,
Michal