Browse Source

test/py: fix timeout to be absolute

Currently, Spawn.expect() imposes its timeout solely upon receipt of new
data, not on its overall operation. In theory, this could cause the
timeout not to fire if U-Boot continually generated output that did not
match the expected patterns.

Fix the code to additionally impose a timeout on overall operation, which
is the intended mode of operation.

Signed-off-by: Stephen Warren <swarren@nvidia.com>
Reviewed-by: Lukasz Majewski <l.majewski@samsung.com>
Acked-by: Simon Glass <sjg@chromium.org>
Stephen Warren 9 years ago
parent
commit
d314e247e1
1 changed files with 6 additions and 1 deletions
  1. 6 1
      test/py/u_boot_spawn.py

+ 6 - 1
test/py/u_boot_spawn.py

@@ -122,6 +122,7 @@ class Spawn(object):
             if type(patterns[pi]) == type(''):
             if type(patterns[pi]) == type(''):
                 patterns[pi] = re.compile(patterns[pi])
                 patterns[pi] = re.compile(patterns[pi])
 
 
+        tstart_s = time.time()
         try:
         try:
             while True:
             while True:
                 earliest_m = None
                 earliest_m = None
@@ -142,7 +143,11 @@ class Spawn(object):
                     self.after = self.buf[pos:posafter]
                     self.after = self.buf[pos:posafter]
                     self.buf = self.buf[posafter:]
                     self.buf = self.buf[posafter:]
                     return earliest_pi
                     return earliest_pi
-                events = self.poll.poll(self.timeout)
+                tnow_s = time.time()
+                tdelta_ms = (tnow_s - tstart_s) * 1000
+                if tdelta_ms > self.timeout:
+                    raise Timeout()
+                events = self.poll.poll(self.timeout - tdelta_ms)
                 if not events:
                 if not events:
                     raise Timeout()
                     raise Timeout()
                 c = os.read(self.fd, 1024)
                 c = os.read(self.fd, 1024)