harness: simulator tests: gracefully handle EOF on read from sub-process when telnet...
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Fri, 7 Oct 2016 13:58:48 +0000 (15:58 +0200)
committerSimon Gerber <simon.gerber@inf.ethz.ch>
Fri, 7 Oct 2016 15:20:06 +0000 (17:20 +0200)
Signed-off-by: Simon Gerber <simon.gerber@inf.ethz.ch>

tools/harness/machines/__init__.py
tools/harness/machines/gem5.py
tools/harness/tests/common.py

index 3363a79..17f82e2 100644 (file)
@@ -256,7 +256,7 @@ class ARMSimulatorBase(ARMMachineBase):
         self.tftp_dir = None
 
     def get_output(self):
-        # wait a bit to give FVP time to listen for a telnet connection
+        # wait a bit to give the simulator time to listen for a telnet connection
         if self.child.poll() != None: # Check if child is down
             print 'Simulator is down, return code is %d' % self.child.returncode
             return None
index d25cbf0..bf2b9f4 100644 (file)
@@ -18,7 +18,11 @@ from machines import ARMSimulatorBase
 GEM5_PATH = '/home/netos/tools/gem5/gem5-stable-1604'
 # gem5 takes quite a while to come up. If we return right away,
 # telnet will be opened too early and fails to connect
-GEM5_START_TIMEOUT = 5 # in seconds
+#
+# SG, 2016-10-07: If this is too high, however, and we have an
+# early-boot bug gem5 will exit before telnet connects, and we do
+# not get the gem5 output at all
+GEM5_START_TIMEOUT = 1 # in seconds
 
 class Gem5MachineBase(ARMSimulatorBase):
     imagename = "armv7_a15ve_1_image"
index f74916c..f24328f 100644 (file)
@@ -187,8 +187,9 @@ class TestCommon(Test):
             # read a single character, to avoid blocking
             # FIXME: there must be a better way to do nonblocking IO!
             c = fh.read(1)
-            if c == '': # should never see EOF
-                raise Exception('read from sub-process returned EOF')
+            # can see EOF if fh is a telnet socket that was closed in the meantime
+            if c == '':
+                raise EOFError('read from sub-process returned EOF')
             line += c
         return line
 
@@ -219,6 +220,9 @@ class TestCommon(Test):
                     yield TEST_TIMEOUT_LINE
                 debug.verbose("timeout encountered in collect_data");
                 raise e
+            except EOFError as e:
+                debug.verbose("got EOF from sub-process")
+                break
 
             yield line